Các tùy chọn hàng đợi tin nhắn tốt cho nodejs là gì? [đóng cửa]


112

Đang tìm cách sử dụng hàng đợi tin nhắn trong một ứng dụng web nhỏ mà tôi đang xây dựng với node.js. Tôi đã xem xét resque nhưng không chắc điều đó phù hợp. Mục tiêu là đẩy thông báo đến khách hàng dựa trên phụ trợ và các hành động khác của khách hàng với socketio. Tôi có thể làm điều này chỉ với socketio nhưng tôi nghĩ có lẽ một hàng đợi tin nhắn thích hợp sẽ làm cho điều này sạch hơn và tôi sẽ không phải phát minh lại bánh xe.

Các tùy chọn ngoài đó là gì?


2
Không chắc chắn, nhưng điều này có vẻ như một nút nào đó sẽ tự hoạt động tốt!
TK-421

Có thể bạn đã biết điều này, nhưng có một cái được liệt kê trên trang Mô-đun: github.com/ry/node/wiki/modules#message-queue . Tôi đoán luôn có cái giá phải trả cho thời gian phát triển của chính bạn.
TK-421

5
@ TK-421 và Bjorn Tipling Đó thực sự là thứ mà nút có thể tự làm, miễn là bạn chỉ có một quy trình nút. Một giải pháp bên ngoài như Redis là cần thiết nếu bạn có các quy trình khác nhau cho các phần khác nhau của ứng dụng (tức là máy chủ web, nhà cung cấp xác thực, trung tâm notif, v.v.). Và tất nhiên sau đó bạn cũng có thể kết nối với các quy trình không phải nút.
Louis Chatriot 14/12/12

1
Ví dụ sử dụng Node AMQ và Rabbit MQ (Producer) gist.github.com/DarcInc/9641557 và (Consumer) gist.github.com/DarcInc/9641582
ipaul

1
Trong trường hợp bạn cần một trong bộ nhớ hàng đợi, bạn có thể xem xét việc này giải pháp rxjs-based
Marinos Một

Câu trả lời:


51

bạn có thể sử dụng redis với nhanh như chớp node_redis khách hàng. Nó thậm chí còn có ngữ nghĩa pubsub được tích hợp sẵn .


7
Tôi khuyên bạn nên sử dụng mô-đun xếp hàng tốt trên redis, giống như RSMQ, có vẻ khá đơn giản. npmjs.com/package/rsmq
Exinferis

nếu bạn chỉ muốn sức mạnh của tin nhắn mà không cần những mối quan tâm về kỹ thuật leo trong sau đó bạn có thể thử node-ts.github.io/bus
Andrew dh

12

Bạn có thể sử dụng máy khách STOMP nút . Điều này sẽ cho phép bạn tích hợp với nhiều hàng đợi tin nhắn bao gồm:

  • ActiveMQ
  • RabbitMQ
  • HornetQ

Tôi chưa sử dụng thư viện này trước đây, vì vậy tôi không thể đảm bảo về chất lượng của nó. Nhưng STOMP là một giao thức khá đơn giản nên tôi nghi ngờ rằng bạn có thể hack nó vào trình nếu cần thiết.

Một tùy chọn khác là sử dụng beantalkd với nút . beantalkd là một "hàng đợi nhiệm vụ" rất nhanh được viết bằng C, rất tốt nếu bạn không cần tính năng linh hoạt của các nhà môi giới được liệt kê ở trên.


10

Shameless plug: Tôi đang làm việc trên Bokeh : một hàng đợi tác vụ đơn giản, có thể mở rộng và cực nhanh được xây dựng trên ZeroMQ. Nó hỗ trợ các kho dữ liệu có thể cắm cho các tác vụ liên tục, hiện trong bộ nhớ, Redis và Riak được hỗ trợ. Kiểm tra nó ra.


10

Dưới đây là một số đề xuất mà tôi có thể đưa ra:

node-amqp : Một ứng dụng khách RabbitMQ mà tôi đã sử dụng thành công kết hợp với Socket.IO để tạo trò chơi nhiều người chơi trong thời gian thực và ứng dụng trò chuyện cùng với những thứ khác. Có vẻ đủ tin cậy.

zeromq.node : Nếu bạn muốn đi theo con đường không có môi giới, điều này có thể đáng xem. Nhiều công việc hơn để triển khai chức năng nhưng bạn có nhiều khả năng nhận được độ trễ thấp hơn và thông lượng cao hơn.


1
+1 về việc sử dụng ZeroMQ. Sau rất nhiều nghiên cứu và dành thời gian mày mò với beantalkd, RabbitMQ, BeeQueue, Bull và Kue, ZeroMQ đã trở thành trải nghiệm tốt nhất đối với tôi, đặc biệt là đối với các dự án nhẹ do công nhân hỗ trợ. Nó nhanh như chớp và tài liệu là hàng đầu. Nó cũng có thêm lợi ích là không làm tắc nghẽn máy chủ Redis của bạn với một lượng lớn cuộc gọi.
dimiguel

zeromq.nodehiện được duy trì ở đây: zeromq.js
Marinos An

8

Hãy xem node-busmq - đó là bus thông báo cấp sản xuất, có tính khả dụng cao và có thể mở rộng được hỗ trợ bởi redis.

Tôi đã viết mô-đun này cho đám mây toàn cầu của chúng tôi và nó hiện được triển khai trong môi trường sản xuất của chúng tôi ở một số trung tâm dữ liệu trên khắp thế giới. Nó hỗ trợ các hàng đợi được đặt tên, giao tiếp ngang hàng, phân phối đảm bảo và liên kết.

Để biết thêm thông tin về lý do tại sao chúng tôi tạo mô-đun này, bạn có thể đọc bài đăng trên blog này: All Aboard The Message Bus


6

kue là hàng đợi tin nhắn duy nhất bạn cần


27
ngoại trừ kue không được bảo trì tốt, có một số vấn đề và không phải là một thử nghiệm duy nhất!
vvo

4
Ngoài ra, đó là một hàng đợi công việc - không phải hàng đợi tin nhắn
HyderA

Nó có một số vấn đề và không phù hợp cho sản xuất
Rahul Kumar

1
Với tôi, việc sử dụng bullđơn giản hơn. Với kuetôi đã bị mất trong tài liệu.
Marinos An

5

Tôi khuyên bạn nên thử Kestrel , nó nhanh và đơn giản như Beanstalk nhưng hỗ trợ hàng đợi fanout. Nói ghi nhớ. Nó được xây dựng bằng Scala và được sử dụng tại Twitter.


7
Điều đáng chú ý là Kestrel không còn trong quá trình phát triển tích cực.
GordyD

3

Bạn có thể muốn xem

Redis Simple Message Queue cho Node.js

Trong đó sử dụng Redis và cung cấp hầu hết các tính năng của Amazons SQS.


1
Trong khi RSMQ là tốt đẹp và đã làm việc cho tôi trong sản xuất một lần, lưu ý rằng nó sử dụng các kịch bản Lua trong Redis và sẽ không làm việc với Redis cụm / sentinel thiết lập
naugtur

2

Làm thế nào về Azure ServiceBus? Nó hỗ trợ nodejs.


1

Nhìn vào node-queue-lib . Có lẽ vậy là đủ rồi bạn. Nó hỗ trợ node.js và các trình duyệt. Có hai chiến lược phân phối: phát sóng và quay vòng. Chỉ javascript.

Ví dụ nhanh:

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

Tôi đã sử dụng KUE với socketIO như bạn mô tả. Tôi đã lưu trữ socketID với công việc và sau đó có thể truy xuất nó trong Hoàn thành công việc .. KUE dựa trên redis và có các ví dụ điển hình trên github

một cái gì đó như thế này….

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();
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.