繁体   English   中英

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

[英]How to maintain SseEmitters list between multiple instances of a microservice?

语言:Spring Boot、JS

概述:我正在我的应用程序中实现服务器发送的事件功能,该功能将部署在 cloud foundry 中,其中基于队列中的新消息(我已在我的微服务中订阅),我将向我的客户端发送一些更新/浏览器(使用 EventSource)。 为此,我在服务器端维护一个 SseEmitters 列表(用于维护所有活动的 SseEmitter)。 一旦我从队列中收到一条新消息,我就会根据 id(队列消息中的一个字段)将消息发送给相应的客户端。

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

为了解决这个问题,可以观察到以下方法。

域名系统概念

如果您考虑一下,知道您的用户(SSE Emitter)在哪里,就像知道某个网站在哪里一样。 您可以使用 DNS-look-alike 协议来确定您的用户所在的位置。 协议如下:

  • 当用户登陆您的任何实例时,将用户与该实例相关联。 关联可以通过使用外部组件(例如 Redis)或分布式地图解决方案(如 Hazelcast)来完成。
  • 每当用户与 SSE 断开连接时,删除关联。 有时断开连接没有正确注册到 Spring SSEEmiter,因此可以在发送消息失败时解除关联。
  • 其他方(微服务)可以轻松查询 Redis/Hazelcast 以确定用户是哪个实例。

消息路由概念

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

  • 每个 SSE 实例在启动时创建自己的队列
  • 用户登陆任何 SSE 实例,实例添加交换队列绑定,路由键 = 用户 uid
  • 每当用户与 SSE 断开连接时,删除关联。 有时断开连接没有正确注册到 Spring SSEEmiter,因此可以在发送消息失败时解除关联。
  • 其他方(微服务)需要向交换器发送消息并定义路由键。 AMQP 代理根据路由键确定哪个队列应该接收消息。

绑定在像 RabbitMQ 这样的现代 AMQP 代理上不是资源密集型的。

您的问题很老,如果您现在还没有弄清楚,希望这会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM