设计多个 RabbitMQ 消费者
Designing a multiple RabbitMQ consumer
我正在设计一个消息传递解决方案,其中至少有两个服务器使用来自同一队列的消息,但它应该适用于 N 个服务器。
我一直在使用的最简单解决方案的工作流程如下:
Server A: Process message -> Publish to exchange
Server B: Consume message -> Process message -> Publish response to return exchange
Server A: Consume message -> Process message and finish
但我想做的是用两个 "servers A" 做同样的事情。问题是,我需要让它在同步模式下工作,这样服务器就不会一直监听,而是按需监听。
会是这样的:
Server A's Load balancer: "I'll send this message to server A1 or A2"
Server A1: Read request -> Process message -> Publish to exchange
Server A2: It's not doing anything because there are no requests.
Server B: Consume message -> Process message -> Publish response to return exchange
Server A1: Consume message -> Process message and finish
Server A2: Hasn't done anything because there were no requests.
如果一条消息从服务器 A1 发送,它必须 return 到该服务器,但我遇到了麻烦,因为 RabbitMQ 不知道将响应发送到哪里,因为消费者 非独占 模式。另外,我想我看到保持连接活动使 RabbitMQ 服务器在打开的连接之间保持平衡,所以如果我有 5 个服务器 A,它只有 20% 的机会成功,其他 80% 会丢失消息。
我找到了一个解决方案:发布到单个队列,从不同的队列(A1->Q1,A2->Q2...)消费,但我不确定这是否是正确的方法。
也许有一个我不知道的替代选项,但我必须使用 RabbitMQ。
这听起来像是一种 RPC 工作。每个服务器 "A" 可以创建一个临时私有队列并将其指定为消息的 "reply-to" 属性。当服务器 "B" 回复时,它将回复直接在 "reply-to" 队列中发布消息,该队列是最初传递请求的 "A" 服务器的私有。
这描述得很好here。
我正在设计一个消息传递解决方案,其中至少有两个服务器使用来自同一队列的消息,但它应该适用于 N 个服务器。
我一直在使用的最简单解决方案的工作流程如下:
Server A: Process message -> Publish to exchange
Server B: Consume message -> Process message -> Publish response to return exchange
Server A: Consume message -> Process message and finish
但我想做的是用两个 "servers A" 做同样的事情。问题是,我需要让它在同步模式下工作,这样服务器就不会一直监听,而是按需监听。
会是这样的:
Server A's Load balancer: "I'll send this message to server A1 or A2"
Server A1: Read request -> Process message -> Publish to exchange
Server A2: It's not doing anything because there are no requests.
Server B: Consume message -> Process message -> Publish response to return exchange
Server A1: Consume message -> Process message and finish
Server A2: Hasn't done anything because there were no requests.
如果一条消息从服务器 A1 发送,它必须 return 到该服务器,但我遇到了麻烦,因为 RabbitMQ 不知道将响应发送到哪里,因为消费者 非独占 模式。另外,我想我看到保持连接活动使 RabbitMQ 服务器在打开的连接之间保持平衡,所以如果我有 5 个服务器 A,它只有 20% 的机会成功,其他 80% 会丢失消息。
我找到了一个解决方案:发布到单个队列,从不同的队列(A1->Q1,A2->Q2...)消费,但我不确定这是否是正确的方法。
也许有一个我不知道的替代选项,但我必须使用 RabbitMQ。
这听起来像是一种 RPC 工作。每个服务器 "A" 可以创建一个临时私有队列并将其指定为消息的 "reply-to" 属性。当服务器 "B" 回复时,它将回复直接在 "reply-to" 队列中发布消息,该队列是最初传递请求的 "A" 服务器的私有。
这描述得很好here。