Які хороші варіанти черги повідомлень для nodejs? [зачинено]


112

Шукаєте використовувати чергу повідомлень у невеликому веб-додатку, який я будую з node.js. Я подивився на resque, але не впевнений, що підходить. Метою є надіслати сповіщення клієнтам на основі бекенда та інших дій клієнта за допомогою socketio. Я міг би це зробити за допомогою socketio, але я подумав, що, можливо, правильна черга з повідомленнями зробить це чистішим, і мені не доведеться винаходити колесо.

Які варіанти є там?


2
Не впевнений, але це здається, що щось би вузол спрацював сам по собі!
TK-421

Ви, мабуть, про це вже знаєте, але на сторінці Модулі вказано таке: github.com/ry/node/wiki/modules#message-queue . Я думаю, що завжди варто врахувати вартість власного часу на розробку.
TK-421

5
@ TK-421 та Bjorn Tipling Це дійсно щось, що може зробити сам вузол, якщо у вас є лише один вузольний процес. Зовнішнє рішення, таке як Redis, потрібне, якщо у вас є різні процеси для різних частин вашої програми (наприклад, веб-сервер, постачальник аутентифікації, центр повідомлень тощо). І, звичайно, ви також можете підключитися до процесів, що не стосуються вузлів.
Луї Шатріо

1
Приклади використання Node AMQ та Rabbit MQ (виробник) gist.github.com/DarcInc/9641557 та (споживач) gist.github.com/DarcInc/9641582
ipaul

1
Якщо вам потрібна черга в пам'яті, ви можете розглянути це рішення на основі rxjs
Marinos,

Відповіді:


51

Ви можете використовувати Redis з блискавично node_redis клієнта. Він навіть має вбудовану семантику pubsub .


7
Я рекомендую використовувати гарний модуль черги поверх redis, як і RSMQ, який здається досить простим. npmjs.com/package/rsmq
Exinferis

якщо ви просто хочете, щоб потужність обміну повідомленнями не повзала
Andrew dh

12

Ви можете використовувати вузол STOMP-клієнта . Це дозволить вам інтегруватися з різними чергами повідомлень, включаючи:

  • ActiveMQ
  • КроликMQ
  • HornetQ

Я раніше не користувався цією бібліотекою, тому не можу порушити її якість. Але STOMP - це досить простий протокол, тому я підозрюю, що ви можете зламати його на подання, якщо це необхідно.

Інший варіант - використовувати beanstalkd з вузлом . beanstalkd - це дуже швидка "черга завдань", написана на C, що дуже добре, якщо вам не потрібна гнучкість функції перелічених вище брокерів.


10

Безсоромний штекер: я працюю над Bokeh : проста, масштабована і швидкодійна черга завдань, побудована на ZeroMQ. Він підтримує підключаються сховища даних для збереження завдань, в даний час підтримується пам'ять, Redis і Riak. Перевір.


10

Ось кілька рекомендацій, які я можу зробити:

node-amqp : Клієнт RabbitMQ, який я успішно використовував у поєднанні з Socket.IO, щоб створити багатокористувацьку програму для ігор у режимі реального часу, серед іншого. Здається, досить надійним.

zeromq.node : Якщо ви хочете спуститися по без посередницькому маршруту, це, можливо, варто переглянути. Більше роботи над впровадженням функціоналу, але ви більше шансів отримати меншу затримку та більшу пропускну здатність.


1
+1 про використання ZeroMQ. Після безлічі досліджень та часу, зайнятого майстерністю з beanstalkd, RabbitMQ, BeeQueue, Bull та Kue, ZeroMQ виявився найкращим досвідом для мене, особливо для легких проектів, що працюють на робочих місцях. Це блискавично, а документація - найкраща. Це також має додаткову перевагу: не засмічувати сервер Redis великою кількістю дзвінків.
димігель

zeromq.nodeЗараз підтримується тут: zeromq.js
Марінос,

8

Погляньте на node-busmq - це сорт виробництва, високодоступна та масштабована шина повідомлень, що підтримується redis.

Я написав цей модуль для нашої глобальної хмари, і він зараз розгорнутий у виробничому середовищі в декількох центрах обробки даних по всьому світу. Він підтримує названі черги, одноранговий зв’язок, гарантовану доставку та федерацію.

Для отримання додаткової інформації про те, чому ми створили цей модуль, ви можете прочитати цю публікацію в блозі: Усі на борту шини повідомлень


6

kue - єдина черга повідомлень, яка вам коли-небудь знадобиться


27
крім kue недостатньо доглянуто, має кілька питань і не один тест!
vvo

4
Крім того, це черга на роботу - не черга повідомлень
HyderA

У нього є декілька питань і не підходить для виробництва
Рахул Кумар

1
Використання bullбуло для мене більш простим. З kueя загубився в документації.
Марінос

5

Я рекомендую спробувати Kestrel , він швидкий і простий, як Beanstalk, але підтримує черги для вибору. Говорить згадано. Він побудований за допомогою Scala та використовується у Twitter.


7
Варто зазначити, що Kestrel вже не в активному розвитку.
GordyD

3

Ви можете поглянути на

Redis Проста черга повідомлень для Node.js

Котрий використовує Redis та пропонує більшість функцій Amazons SQS.


1
Хоча RSMQ приємно і колись працює для мене на виробництві, пам’ятайте, що він використовує сценарії Lua в Redis і не буде працювати з налаштуваннями кластера / дозорного кластера Redis
naugtur


1

Подивіться на node-queue-lib . Можливо, цього достатньо, щоб ти. Він підтримує node.js та браузери. Має дві стратегії доставки: трансляцію та круглобітну. Тільки javascript.

Короткий приклад:

var Queue = require('node-queue-lib/queue.core');

var queue = new Queue('Queue name', 'broadcast');

// subscribe on 'Queue name' messages
queue.subscribe(function (err, subscriber) {
    subscriber.on('error', function(err){
        //
    });
    subscriber.on('data', function (data, accept) {
        console.log(data);
        accept(); // accept process message
    });
});

// publish message
queue.publish('test');

1

Я використовував KUE з socketIO, як ви описали. Я зберігав socketID із завданням і потім міг повернути його в Job Complete. KUE заснований на redis і має хороші приклади на github

щось на зразок цього....

jobs.process('YourQueuedJob',10, function(job, done){
    doTheJob(job, done);
});


function doTheJob(job, done){
    var socket = io.sockets.sockets[job.data.socketId];
    try {
        socket.emit('news', { status : 'completed' , task : job.data.task });
    } catch(err){
        io.sockets.emit('news', { status : 'fail' , task : job.data.task , socketId: job.data.socketId});
    }
    job.complete();
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.