我们正在设计一个微服务体系结构模型,其中服务A发布消息和服务B,C希望接收/使用该消息。但是,为了提高可用性,服务B和C的多个实例同时运行。现在的问题是如何设计,使只有一个B的服务实例和一个C的服务实例接收消息,而不是所有其他的服务实例。
据我所知,要实现这种行为并不容易。我想知道Kafka或任何其他消息传递框架是否对此场景有内置支持,我认为这种支持在微服务体系结构中应该是非常常见的。
发布于 2017-08-07 04:57:16
卡夫卡有一个名为“消费者群体”的功能,它做的正是你所描述的。
B的每个相同实例都可以声明它的group.id是相同的字符串(例如"serviceB"),并且Kafka将确保为它订阅的所有主题分配一个相互排斥的主题分区集。
因为C的所有实例都有一个不同的group.id (例如"serviceC"),所以它们也将获得与B实例相同的消息,但是它们将在一个独立的消费者组中,因此消息只能访问C的N个实例中的一个,最多最多可以得到最多的实例数,即主题分区的总数。
您可以动态和独立地缩放B和C的实例数量,如果任何实例死亡,其余实例将自动重新平衡其分配的主题分区,并接管已死亡实例的消息处理。
数据不必存储超过一次,因此对于所有这些服务实例,仍然有一个提交日志或“真相源”。
发布于 2017-08-07 04:50:44
卡夫卡为这种情况提供了内置的支持。
您可以创建两个消费者群体,一个用于B,另一个用于C。两个Consumer Groups都从A订阅消息。
A发布的任何消息都将发送给两个组。但是,每个组中只有一个成员可以接收消息。
发布于 2017-08-07 07:46:48
这是您需要执行的更改,以实现与兔子MQ相同的功能。
这样,当B和C的多个实例运行时,都会得到消息,并且仍然是可伸缩的。
https://stackoverflow.com/questions/45538292
复制相似问题