rabbitmq事件驱动微服务

rabbitmq事件驱动微服务,rabbitmq,microservices,Rabbitmq,Microservices,微服务体系结构和共享公共应用程序数据 情况如下: 目前,一些在线社交媒体服务共有17个微服务,其中9个需要知道谁与谁有联系才能发挥作用。为了防止每个服务不断向“身份验证”或“连接”微磁盘请求列表,所有服务都会注册以接收每个用户的连接副本并存储在缓存中 关于传递数据的机制或获取数据的指令的建议可以是rabbitmq 然而,每个微服务都是由k8s为可扩展性精心安排的docker容器集群 每个容器注册以收听他们感兴趣的交换的集合。。。所以对于“新闻提要”服务,可以说是5个连接 下面是建议设置的图示:

微服务体系结构和共享公共应用程序数据

情况如下: 目前,一些在线社交媒体服务共有17个微服务,其中9个需要知道谁与谁有联系才能发挥作用。为了防止每个服务不断向“身份验证”或“连接”微磁盘请求列表,所有服务都会注册以接收每个用户的连接副本并存储在缓存中

关于传递数据的机制或获取数据的指令的建议可以是rabbitmq

然而,每个微服务都是由k8s为可扩展性精心安排的docker容器集群

每个容器注册以收听他们感兴趣的交换的集合。。。所以对于“新闻提要”服务,可以说是5个连接

下面是建议设置的图示:

  • T1-用户A接受好友请求
  • T2-连接服务(MS1)在其主数据库中建立连接
  • T3-将上述事件发布到rabbitmq交换机的MS1
  • T4-rabbitmq交换发送到所有Q(即所有其他已注册的微服务)
  • T5-MS2集群内的所有节点拾取事件并采取行动。。。他们的操作(在本例中)是更新好友连接的缓存
  • T6-用户A为其新闻提要请求数据,MS2现在使用其本地缓存查询其数据库
这一切都很好:

  • 连接服务不知道或不关心谁获得了数据,只知道它应该通过单个rabbitmq入口点向1个exchange发送数据
  • MS2的开发人员只需要知道rabbitmq实例的位置
  • 所有其他服务的开发者都是一样的。。他们以自己独特的方式处理数据
例外情况是。。有3个MS2实例,因此将有3个数据库写入。。如果系统扩展到10,将是10 db写入等

问题 如何绕过这个问题。。。如何确保MS2实例中只有一个会起作用


newsfeed微服务是否应该使用自己的内部q系统来管理来自exchange的数据?是否可以通过负载平衡器路由所有消息,以便只有一个MS2实例获得消息?我不想开始手动管理大量队列,因为这将是一件痛苦的事情,也会破坏exchange设计的简单性。

因此,如果M2的所有实例都共享一个队列,并使用竞争消费者模式工作,则每封邮件都会被消耗一次,如果M2的所有实例都下降,那么队列会增长,直到它们再次出现

M2、M3和M4将分别为M1发布的内容创建一个队列。 让我们说出他们的名字 M2_来自_M1,M3_来自_M1,M4_来自_M1。 它们还将针对M1使用的exchange和该消息的路由密钥创建一个绑定

现在,M2的实例都将从M2_到M1消费,M3的实例都将从M3_到M1消费,依此类推

如果其中任何一个的所有实例都已关闭,它的队列将开始填满,但这没关系,因为它将在稍后被消耗


关于整体架构。首先尝试在M2和M1之间实际进行调用,POD之间的访问时间可能非常快,您可能会在M1和M2中缓存一段时间。最糟糕的结果是,你看到的消息来自你不再关注的人,或者你没有从新联系人那里得到消息。

是的,我可以简单地从M2中调用M1。没问题,但这并不适合,所有M*都需要知道所有其他M的位置。如果所有M2实例都注册到一个Q,那么M1需要知道它应该发布到的Q的名称。。。但是,它还需要知道所有需要数据的微服务的名称。。在很短的时间内,会有很多人排队。。。因此,交换的想法。。但是这带来了OPNo中提到的问题,M1发布了一条带有路由密钥的消息,但不关心队列绑定到该路由密钥。M2创建了一个队列和绑定,但从中集体使用。本教程介绍了M*的位置。在kubernetes中,每个服务都有一个dns名称,这就是您如何称呼它的。你不需要知道任何一个吊舱。这是文件,我想我一定是遗漏了一部分。如果M1发布到一个简单的工作队列,而在另一端,M2、M3和M4的实例决定侦听。。那就是先到先发球。。或者竞争的消费者模式,但是M2/3/4都需要数据。。。为了避开这个问题,M1向交易所发布,M2/3/4向交易所订阅