我的本地应用程序详细信息:
前端 - Reactjs 部署在 4 个虚拟机中 [a、b、c、d]
后端 - Spring 微服务[无状态]部署在 4 个虚拟机中 [w,x,y,z]]
数据库 - Sql 服务器
负载均衡器 - F5
CDN - 阿卡迈
请求流程:用户浏览器 --> Akamai、F5 --> UI 服务器[来自 4 个实例的任何人:循环] --> F5 --> API 服务器[来自 4 个实例的任何人:循环]
要求: 当管理员从我们的应用程序的 UI 创建通知时,我希望连接到我们的应用程序的所有用户都能在主页上实时看到该通知。如果他们稍后登录,他们可以转到通知页面,我们在其中显示从数据库获取的所有通知。
目前,我们在主页和通知页面上显示通知,但这不是实时的。
我正在考虑遵循这个使用 Kafka 的方法:
当管理员创建通知时,在持久化到数据库表后将通知发送到 Kafka 主题“notify”。在微服务中添加 Kafka 侦听器方法,以从“notify”主题获取通知并使用 Websocket 发送到 UI。 4 个实例的消费者组将不同,以便每个实例都从分区读取。但我在 Kafka 文档页面上没有看到任何 STOMP 相关信息,例如 其他代理 将 Kafka 与 Websocket 连接起来。
替代方案是 ActiveMQ 和 RabbitMQ。
注意:我们计划在几个月内迁移到 Google Cloud。所以我的解决方案应该兼容 GCP。
在我当前的架构中,我使用 RabbitMQ 作为消息代理。我选择 RabbitMQ 而不是其他替代方案,因为它已经集成到系统中,并提供了一个简单的解决方案来处理 WebSocket 会话,而不仅仅是 Spring Websocket 库提供的内存中会话。
RabbitMQ 的一个关键功能是能够在连接到同一 RabbitMQ 代理的多个服务器之间共享用户会话。这对于用户连接到分布式系统中不同服务器的场景至关重要。
例如,如果管理员通过 WebSocket 连接到服务器 A 并发送通知,RabbitMQ 将确保连接到应用程序的所有用户(无论其 Websocket 连接是在服务器 A 上还是在另一台服务器上打开)都可以收到通知。这是因为 RabbitMQ 与您的应用程序服务器共享用户会话。
为了实现此目的,管理员将通知发布到特定队列(例如“notify-queue”)。所有订阅该队列的用户,无论连接到哪个服务器,都会收到该消息。
如果您正在考虑使用 Kafka 作为 RabbitMQ 的替代品,您应该评估 Kafka 是否提供了类似的机制来将消息分发到多服务器架构中的 WebSocket 客户端。
资源: