Spring中的SSE(服务器端事件)——存储SseEmitters

Posted

技术标签:

【中文标题】Spring中的SSE(服务器端事件)——存储SseEmitters【英文标题】:SSE (Server-side events) in Spring - storing SseEmitters 【发布时间】:2020-12-19 18:09:19 【问题描述】:

我正在 Web 应用程序中实现 SSE 事件。我的用例需要有选择地向部分或所有订阅的客户端发送事件的可能性。我已经在服务器端/ Spring 和客户端/ Angular 上都有一个工作草案 - 基于此SO。

现在,由于 SSE 需要维护连接,我的应用程序变为有状态的,我需要以某种方式管理该状态。我想到的唯一想法是将其作为 Map 存储在内存中,作为单例服务中的一个字段。这将需要适当的同步以确保线程安全,但这可以通过使用例如并发哈希映射。 SseEmitter 类本身似乎是线程安全的。

通常服务在 Spring 中是无状态的,但我想不出任何替代方案或上述方法失败的原因。有人可以提出更好的解决方案吗?

【问题讨论】:

【参考方案1】:

我想说尽量避免状态!

在您的句子since SSE requires the connection to be maintained, my application becomes stateful 中,仅仅因为您保持 TCP 连接打开并不意味着您的应用程序应该是有状态的。

恕我直言,您可以根据需要创建数据流,并且您感兴趣的客户可以订阅它们,这样您就可以像队列管理器一样处理您的事件。

我在这里 https://github.com/htenjo/vqueue 使用以下架构创建了类似的东西:

也许能帮上忙。

【讨论】:

以上是关于Spring中的SSE(服务器端事件)——存储SseEmitters的主要内容,如果未能解决你的问题,请参考以下文章

Angular 组件中的 SSE 发射器传递错误

服务器端事件发送SSE

Spring boot SSE(服务器发送事件):如何动态发送响应

Spring boot:SSE 服务器发送的事件不起作用

服务器发送事件 + Java 与 Spring MVC

springboot 之 “服务端推送事件SSE(server-send-events)”