微服务架构和共享通用应用程序数据。
场景是: 如今,有17种微服务用于某些在线社交媒体服务,其中9种微服务需要知道与谁连接的人才能正常工作。为了防止每个服务不断向列表中的“身份验证”或“连接”微服务询问,所有服务都进行注册以接收每个用户的连接副本并存储在缓存中。
关于传递数据的机制或获取数据的指令的建议可以是Rabbitmq。
但是,每个微服务都是由k8精心组织以实现可伸缩性的docker容器集群。
每个容器注册以侦听他们感兴趣的交换的集合...因此对于“新闻提要”服务,可以说是5个连接...
这一切都很好:
1个例外是..有3个MS2实例,因此将进行3次数据库写入..如果系统扩展到10个则将进行10个数据库写入等。
问题 如何绕过此问题...如何确保只有1个MS2实例起作用?
新闻订阅源微服务是否应通过其自己的内部q系统交付以管理来自交易所的数据?是否可以通过负载平衡器路由所有消息,以便仅1个MS2实例获得一条消息?我不想开始手动管理很多队列,因为这将使痛苦并破坏交换设计的简单性。
答案 0 :(得分:0)
因此,如果M2将共享一个队列并使用竞争性消费者模式工作,则所有实例都将消耗一次所有消息,并且如果M2的所有实例都排入队列生长直到它们再次出现。
M2,M3和M4将分别为M1发布的内容创建一个队列。 我们给他们起个名字吧 M2_from_M1,M3_from_M1和M4_from_M1。 它们还将针对此消息在路由密钥上针对M1使用的交换创建绑定。
现在,M2的实例全部从M2_from_M1消耗,M3的实例全部从M3_from_M1消耗,依此类推。
如果所有这些实例的所有实例均发生故障,则队列将开始占满,但这很好,因为稍后将使用它。
关于整体架构。首先尝试实际在M2和M1之间进行呼叫,pod之间的访问时间可能非常快,并且可能在M1和M2中都缓存了一段时间。最糟糕的结果是,您看到不再关注的人的新闻,或者您没有从新联系人那里获得新闻。