Node.js AMQP扇出

时间:2014-07-03 08:29:32

标签: javascript node.js rabbitmq

我正在尝试构建分布式系统,我正在使用postwait/node-amqp。对此我是新手,我发现文档非常无益。

现在我的计划图:

Client -> Gate -> Q -> EatProcessor
                    -> WalkProcessor
                    -> Logger

我们说客户已发送Start EatingGate收到该消息并将其添加到Q消息eating,只有EatProcessor应该从Q收到消息。

那么让我们说EatProcessor:

connection.queue('Q', {autoDelete: false}, function(queue){
        queue.subscribe(function(msg){
            // recv message
        });
    });

那我该如何:

  • 让Eat Processor只能从Q
  • 中获取食物
  • 让Walk Processor只能从Q
  • 获取步行内容
  • Logger将从Q获得所有内容,只需登录。

我正在四处看看,也许大门应该是一个扇动?但我没有在文档中看到如何做出扇出。

如果扇出是否意味着每个人都会收到消息?让我们说我还没有编写记录器,我会在功能中写出来但是当我写它时我想直接听Q而不改变{{1}上的任何代码}。

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-qlog-q结尾。

请注意,您应该使用某种流式库,例如caolan's async.jskriskowal's q,因为您最终会收到大量回调。我更喜欢第二个。