Каковы хорошие варианты очереди сообщений для nodejs? [закрыто]


112

Ищу возможность использовать очередь сообщений в небольшом веб-приложении, которое я создаю с помощью node.js. Я посмотрел на resque, но не уверен, что это подходит. Цель состоит в том, чтобы отправлять клиентам уведомления на основе серверных и других действий клиента с помощью socketio. Я мог бы сделать это с помощью только socketio, но я подумал, что, возможно, правильная очередь сообщений сделает это чище, и мне не придется изобретать велосипед.

Какие есть варианты?


2
Не уверен, но похоже, что узел справится сам по себе!
TK-421

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

5
@ TK-421 и Бьорн Типлинг. Это действительно то, что узел может делать сам, если у вас есть только один процесс узла. Внешнее решение, такое как Redis, необходимо, если у вас есть разные процессы для разных частей вашего приложения (например, веб-сервер, поставщик аутентификации, центр уведомлений и т. Д.). И, конечно же, вы также можете подключиться к процессам, не являющимся узлами.
Луи Шатриот

1
Примеры с использованием Node AMQ и Rabbit MQ (Producer) gist.github.com/DarcInc/9641557 и (Consumer) gist.github.com/DarcInc/9641582
ipaul

1
Если вам нужна очередь в памяти, вы можете рассмотреть это решение на основе rxjs
Marinos An

Ответы:


51

вы можете использовать redis с молниеносным клиентом node_redis . Он даже имеет встроенную семантику pubsub .


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

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

12

Вы можете использовать клиент узла STOMP . Это позволит вам интегрироваться с множеством очередей сообщений, включая:

  • ActiveMQ
  • RabbitMQ
  • HornetQ

Раньше я этой библиотекой не пользовался, поэтому за ее качество ручаться не могу. Но STOMP - довольно простой протокол, поэтому я подозреваю, что вы можете взломать его для отправки, если это необходимо.

Другой вариант - использовать beanstalkd с node . 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 большим количеством вызовов.
dimiguel 08

zeromq.nodeтеперь поддерживается здесь: zeromq.js
Маринос

8

Взгляните на node-busmq - это высокодоступная и масштабируемая шина сообщений производственного уровня, поддерживаемая redis.

Я написал этот модуль для нашего глобального облака, и в настоящее время он развернут в нашей производственной среде в нескольких центрах обработки данных по всему миру. Он поддерживает именованные очереди, одноранговую связь, гарантированную доставку и федерацию.

Для получения дополнительной информации о том, почему мы создали этот модуль, вы можете прочитать это сообщение в блоге: All Aboard The Message Bus


6

kue - единственная очередь сообщений, которая вам когда-либо понадобится


27
за исключением того, что kue не поддерживается, имеет несколько проблем и ни одного теста!
vvo

4
Кроме того, это очередь заданий, а не очередь сообщений
HyderA 08

У него несколько проблем, и он не подходит для производства
Рахул Кумар

1
bullДля меня использование было более простым. С kueя потерялся в документации.
Marinos An

5

Я рекомендую попробовать Kestrel , он быстрый и простой, как Beanstalk, но поддерживает очереди разветвления. Говорит memcached. Он построен с использованием Scala и используется в Twitter.


7
Стоит отметить, что Kestrel больше не находится в активной разработке.
GordyD 02

3

Возможно, вы захотите взглянуть на

Простая очередь сообщений Redis для Node.js

Которая использует Redis и предлагает большинство функций Amazons SQS.


1
Хотя RSMQ хорош и однажды работал у меня в продакшене, имейте в виду, что он использует сценарии Lua в Redis и не будет работать с Redis cluster / sentinel setup
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, как вы описали. Я сохранил идентификатор сокета вместе с заданием, а затем смог получить его в завершении задания. 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.