rabbitmq—在微服务的发布/订阅模型中,如何在每个服务类型中只接收/使用一次消息

xsuvu9jc  于 2021-06-08  发布在  Kafka
关注(0)|答案(4)|浏览(434)

我们正在设计一个微服务体系结构模型,其中服务a发布一条消息,服务b和c希望接收/使用该消息。但是,对于高可用性,服务b和c的多个示例同时运行。现在的问题是,我们如何设计,使只有一个服务示例b和一个服务示例c接收消息,而不是所有其他服务示例。
就我对rabbitmq的了解而言,实现这种行为并不容易。我想知道kafka或任何其他消息传递框架是否有对这种场景的内置支持,我认为这在微服务架构中应该非常常见。

sh7euo9m

sh7euo9m1#

Kafka对这个场景有内置的支持。
您可以创建两个消费者组,一个用于 B ,另一个是 C . 两者 Consumer Groups 订阅来自的邮件 A .
发布的任何消息 A 将发送到两个组。但是,每个组中只有一个成员可以接收消息。

ljo96ir5

ljo96ir52#

您还可以使用命令行工具在kafka中测试这个用例。
你可以用

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

然后,您可以使用

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer-property group.id=cgB

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer-property group.id=cgC

一旦您向主题发送消息,两个组(b,c)都将收到消息,但会保存它们各自处理的消息。
更好的解释:Kafka快速启动

h5qlskok

h5qlskok3#

这是您需要执行的更改,以使用rabbitmq实现相同的功能
创建两个独立的队列,每个b和c服务一个
使用rabbitmq的阻塞连接,更改从队列读取消息的逻辑,以便只有一个示例从队列读取消息。
这样,当b和c的多个示例都在运行时,这两个示例都将得到消息并且仍然是可伸缩的。

ruarlubt

ruarlubt4#

Kafka有一个名为“消费群体”的功能,完全符合你的描述。
每个相同的b示例都可以将其group.id声明为相同的字符串(比如说“serviceb”),kafka将确保为每个示例分配一组互斥的主题分区,用于其订阅的所有主题。
由于c的所有示例都将具有不同的group.id(例如“servicec”),因此它们也将获得与b的示例相同的消息,但它们将位于一个独立的使用者组中,因此消息只会到达n个c示例中的1个示例,直到示例的最大数目(即主题分区的总数)。
您可以动态地、独立地放大或缩小b和c的示例数。如果任何示例死亡,其余示例将自动重新平衡其分配的主题分区,并接管死亡示例的消息处理。
数据不必存储多次,因此对于所有这些服务示例,仍然只有一个提交日志或“真实来源”。

相关问题