我正在尝试构建分布式系统,我正在使用postwait/node-amqp。对此我是新手,我发现文档非常无益。
现在我的计划图:
Client -> Gate -> Q -> EatProcessor
-> WalkProcessor
-> Logger
我们说客户已发送Start Eating
。 Gate
收到该消息并将其添加到Q
消息eating
,只有EatProcessor
应该从Q
收到消息。
那么让我们说EatProcessor:
connection.queue('Q', {autoDelete: false}, function(queue){
queue.subscribe(function(msg){
// recv message
});
});
那我该如何:
我正在四处看看,也许大门应该是一个扇动?但我没有在文档中看到如何做出扇出。
如果扇出是否意味着每个人都会收到消息?让我们说我还没有编写记录器,我会在功能中写出来但是当我写它时我想直接听Q
而不改变{{1}上的任何代码}。
答案 0 :(得分:3)
好的,首先使用交换。这样,您就可以同时发布到多个队列。我不会用Node.js认识RabbitMQ,但我觉得这样的事情应该有效:
// define a queue for each type
connection.queue('eat-q', {autoDelete: false}, function(eat_queue) {
// ...
connection.queue('walk-q', {autoDelete: false}, function(eat_queue) {
// ...
connection.queue('log-q', {autoDelete: false}, function(log_queue) {
// ...
});
});
});
然后定义交换并进行绑定:
connection.exchange('my-exchange', function(exchange) {
eat_queue.bind('my-exchange', 'eat', function() {
// ...
});
walk_queue.bind('my-exchange', 'walk', function() {
// ...
});
log_queue.bind('my-exchange', 'walk', function() {
// ...
});
log_queue.bind('my-exchange', 'eat', function() {
// ...
});
});
最后你可以发布到交易所:
exchange.publish('eat', 'my message', {}, function() {
// ...
});
邮件应该同时以eat-q
和log-q
结尾。
请注意,您应该使用某种流式库,例如caolan's async.js或kriskowal's q,因为您最终会收到大量回调。我更喜欢第二个。