将消息发布到多个RabbitMQ使用者

时间:2015-08-17 22:22:51

标签: javascript node.js rabbitmq

我一直在构建一个使用RabbitMQ进行工作的webapp。有3-5个工作人员处理来自队列的数据,偶尔有一个工作人员需要向所有工作人员发送消息。

我一直在阅读RabbitMQ文档,但在找到任何有用的东西时遇到了很多麻烦。

当新工作人员启动时,它会生成UUID(v6),然后订阅队列worker.{id},例如worker.7a277e65-8df4-4670-99b4-52c13478831d

从其他问题来看,我已经能够确定我需要创建一个主题交换,以允许工作人员向worker.*发布消息,将其发送给每个工作人员。

但是,我不确定如何做到这一点。我正在使用jackrabbit,它不支持以编程方式创建交换,因此我需要通过RabbitMQ管理控制台执行此操作,如下所示:

您是否可以建议我应该创建的交换类型,以及参数,如果无法像通常的队列那样解决它的使用示例?

1 个答案:

答案 0 :(得分:0)

如果Jackrabbit不允许您指定交换,队列或绑定,那么您需要找到另一个库。

问题将是你的绑定。您可以如您所见,从管理UI创建交换,队列和绑定。但是,随着Jackrabbit创建特定于工作人员的队列,您将无法在交换机和Jackrabbit创建的队列之间创建绑定。

我使用并强烈推荐wascally库。它建立在amqplib之上,与Jackrabbit相同,但提供了更多功能丰富的API和功能。

作为如何使用Wascally的示例...使用以下代码设置三个文件:

<强> config.json


{
  "connection": {
    "user": "test",
    "pass": "password",
    "server": "localhost",
    "vhost": "test-app"
  },

  "exchanges":[
    {"name": "sample-ex.1", "type": "direct"}
  ],

  "queues":[
    {"name": "sample-q.1"}
  ],

  "bindings":[
    {"exchange": "sample-ex.1", "target": "sample-q.1"}
  ]
}

<强> receiver.js


var rabbit = require("wascally");
var config = require("config.json");

rabbit.configure(config)
  .then(function(){
    rabbit.handle("test.message.type", handleMessage);
    rabbit.startSubscription("sample-q.1");
  })
  .then(undefined, reportError);

function reportError(err){
  console.log(err.stack);
  process.exit();
}

function handleMessage(msg){
  var body = msg.body;

  console.log("received a message");
  console.log(body);
  msg.ack();

  setTimeout(function(){
    // do work
  }, 5000);
}

<强> sender.js


var rabbit = require("wascally");
var config = require("config.json");

rabbit.configure(config)
  .then(function(){
    rabbit.publish("sample-ex.1", {
      type: "test.message.type",
      routingKey: "",
      body: {
        foo: "bar"
      }
    });
  })
  .then(undefined, reportError);

function reportError(err){
  console.log(err.stack);
  process.exit();
}

现在您可以根据需要创建任意数量的接收器实例。只需运行node receiver.js几次。

然后运行node sender.js几次,你会看到来自接收者的消息 - 一个接收者收到一条消息,而rabbitmq会将消息循环到接收者。

P.S。如果您有兴趣,此代码来自我的RabbitMQ For Devs包中的截屏视频。