我们正在设计一个微服务体系结构模型,其中服务a发布一条消息,服务b和c希望接收/使用该消息。但是,对于高可用性,服务b和c的多个示例同时运行。现在的问题是,我们如何设计,使只有一个服务示例b和一个服务示例c接收消息,而不是所有其他服务示例。
就我对rabbitmq的了解而言,实现这种行为并不容易。我想知道kafka或任何其他消息传递框架是否有对这种场景的内置支持,我认为这在微服务架构中应该非常常见。
我们正在设计一个微服务体系结构模型,其中服务a发布一条消息,服务b和c希望接收/使用该消息。但是,对于高可用性,服务b和c的多个示例同时运行。现在的问题是,我们如何设计,使只有一个服务示例b和一个服务示例c接收消息,而不是所有其他服务示例。
就我对rabbitmq的了解而言,实现这种行为并不容易。我想知道kafka或任何其他消息传递框架是否有对这种场景的内置支持,我认为这在微服务架构中应该非常常见。
4条答案
按热度按时间sh7euo9m1#
Kafka对这个场景有内置的支持。
您可以创建两个消费者组,一个用于
B
,另一个是C
. 两者Consumer Groups
订阅来自的邮件A
.发布的任何消息
A
将发送到两个组。但是,每个组中只有一个成员可以接收消息。ljo96ir52#
您还可以使用命令行工具在kafka中测试这个用例。
你可以用
然后,您可以使用
一旦您向主题发送消息,两个组(b,c)都将收到消息,但会保存它们各自处理的消息。
更好的解释:Kafka快速启动
h5qlskok3#
这是您需要执行的更改,以使用rabbitmq实现相同的功能
创建两个独立的队列,每个b和c服务一个
使用rabbitmq的阻塞连接,更改从队列读取消息的逻辑,以便只有一个示例从队列读取消息。
这样,当b和c的多个示例都在运行时,这两个示例都将得到消息并且仍然是可伸缩的。
ruarlubt4#
Kafka有一个名为“消费群体”的功能,完全符合你的描述。
每个相同的b示例都可以将其group.id声明为相同的字符串(比如说“serviceb”),kafka将确保为每个示例分配一组互斥的主题分区,用于其订阅的所有主题。
由于c的所有示例都将具有不同的group.id(例如“servicec”),因此它们也将获得与b的示例相同的消息,但它们将位于一个独立的使用者组中,因此消息只会到达n个c示例中的1个示例,直到示例的最大数目(即主题分区的总数)。
您可以动态地、独立地放大或缩小b和c的示例数。如果任何示例死亡,其余示例将自动重新平衡其分配的主题分区,并接管死亡示例的消息处理。
数据不必存储多次,因此对于所有这些服务示例,仍然只有一个提交日志或“真实来源”。