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

use*_*116 6 messaging publish-subscribe rabbitmq apache-kafka microservices

我们正在设计微服务架构模型,其中服务A发布消息和服务B,并且C希望接收/消费该消息.但是,对于高可用性,服务B和C的多个实例同时运行.现在的问题是我们如何设计使得只有一个B的服务实例和一个C的服务实例接收消息而不是所有其他服务实例.

据我所知,RabbitMQ实现这种行为并不容易.我想知道Kafka或任何其他消息传递框架是否内置了对此场景的支持,我认为这在微服务架构中应该非常普遍.

Han*_*sen 5

卡夫卡有一个称为消费者组的功能,它的作用正是您所描述的。

B 的每个相同实例都可以将其 group.id 声明为相同的字符串(例如“serviceB”),并且 Kafka 将确保为每个实例为其订阅的所有主题分配一组互斥的主题分区。

由于 C 的所有实例都将具有不同的 group.id(例如“serviceC”),因此它们也将获得与 B 的实例相同的消息,但它们将位于独立的消费者组中,因此消息仅发送到 B 的 N 个实例中的 1 个C,最大实例数,即主题分区的总数。

您可以动态地、独立地增加或减少 B 和 C 的实例数量。如果任何实例死亡,其余实例将自动重新平衡其分配的主题分区,并接管死亡实例的消息处理。

数据无需存储多次,因此所有这些服务实例仍然有一个提交日志或“事实来源”。