如何在微服务的多个实例之间维护sseemitter列表



语言:Spring Boot,JS

概述:我正在实现服务器在我的应用程序中发送的事件功能,该功能将部署在Cloud Foundry,其中根据队列中的一条新消息(我在微服务中订阅了),我将向我的客户端/浏览器(使用Eventsource)发送一些更新。为此,我在服务器端维护了一个sseemitters列表(用于启动所有活动sseemitter)。一旦根据ID(队列消息中的字段)从队列中收到一条新消息后,我将向相应的客户端发出消息。

问题:当我通过创建多个实例来扩展应用程序时,上述方案将如何工作。由于只有一个实例会收到新的队列消息,因此可能会在该特定实例中维护活动sseemitter ,我该如何解决此问题?

要解决此问题,可以观察到以下方法。

DNS概念

如果您考虑一下,知道您的用户(SSE Emitter)在哪里,就像知道某些网站在哪里一样。您可以使用类似DNS的协议来找出用户的位置。协议将如下:

  • 用户在您的任何实例上都降落,将用户与该实例相关联。可以通过使用外部组件来完成关联,例如REDIS或分布式地图解决方案(例如Hazelcast)。
  • 每当用户与SSE断开连接时,请删除关联。有时,断开连接未正确注册与Spring Sseemiter,因此当Sendig消息失败时可以进行分离。
  • 其他各方(微服务)可以轻松查询redis/hazelcast以确定实例用户是。

消息路由概念

如果您正在使用消息中间件进行微服务之间的通信,则可以使用AMQP协议提供的路由功能。协议将如下:

  • 每个SSE实例都创建他们自己的队列 boot
  • 用户降落在任何SSE实例上,并添加了用路由键=用户UID
  • 添加Exchange-Qualie绑定
  • 每当用户与SSE断开连接时,请删除关联。有时,断开连接未正确注册与Spring Sseemiter,因此当Sendig消息失败时可以进行分离。
  • 其他方(微服务)需要将消息发送到交换并定义路由密钥。AMQP经纪人计算哪个队列应根据路由键接收消息。

绑定不是像Rabbitmq这样的现代AMQP经纪人的资源直觉。

您的问题已经旧了,如果您现在还没有解决这个问题,希望这会有所帮助。

相关内容

最新更新