我一直在构建一个使用RabbitMQ进行工作的webapp。有3-5个工作人员处理来自队列的数据,偶尔有一个工作人员需要向所有工作人员发送消息。
我一直在阅读RabbitMQ文档,但在找到任何有用的东西时遇到了很多麻烦。
当新工作人员启动时,它会生成UUID(v6),然后订阅队列worker.{id}
,例如worker.7a277e65-8df4-4670-99b4-52c13478831d
。
从其他问题来看,我已经能够确定我需要创建一个主题交换,以允许工作人员向worker.*
发布消息,将其发送给每个工作人员。
但是,我不确定如何做到这一点。我正在使用jackrabbit,它不支持以编程方式创建交换,因此我需要通过RabbitMQ管理控制台执行此操作,如下所示:
您是否可以建议我应该创建的交换类型,以及参数,如果无法像通常的队列那样解决它的使用示例?
答案 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包中的截屏视频。