首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在微服务中的发布/订阅模型中,如何在每个服务类型中只接收/使用一次消息

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

Stack Overflow用户
提问于 2017-08-07 01:38:31
回答 4查看 1.9K关注 0票数 8

我们正在设计一个微服务体系结构模型,其中服务A发布消息和服务B,C希望接收/使用该消息。但是,为了提高可用性,服务B和C的多个实例同时运行。现在的问题是如何设计,使只有一个B的服务实例和一个C的服务实例接收消息,而不是所有其他的服务实例。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-08-07 04:57:16

卡夫卡有一个名为“消费者群体”的功能,它做的正是你所描述的。

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

因为C的所有实例都有一个不同的group.id (例如"serviceC"),所以它们也将获得与B实例相同的消息,但是它们将在一个独立的消费者组中,因此消息只能访问C的N个实例中的一个,最多最多可以得到最多的实例数,即主题分区的总数。

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

数据不必存储超过一次,因此对于所有这些服务实例,仍然有一个提交日志或“真相源”。

票数 5
EN

Stack Overflow用户

发布于 2017-08-07 04:50:44

卡夫卡为这种情况提供了内置的支持。

您可以创建两个消费者群体,一个用于B,另一个用于C。两个Consumer Groups都从A订阅消息。

A发布的任何消息都将发送给两个组。但是,每个组中只有一个成员可以接收消息。

票数 1
EN

Stack Overflow用户

发布于 2017-08-07 07:46:48

这是您需要执行的更改,以实现与兔子MQ相同的功能。

  • 创建两个独立队列,每个B和C服务一个队列
  • 将您的逻辑更改为从队列读取消息,这样只有一个实例将使用rabbitmq的阻塞连接从队列读取消息。

这样,当B和C的多个实例运行时,都会得到消息,并且仍然是可伸缩的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45538292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档