Microservices 微服务状态同步

Microservices 微服务状态同步,microservices,state,docker-swarm,Microservices,State,Docker Swarm,我们正在开发一个与每个客户端都有WebSocket连接的应用程序。出于高可用性和负载平衡的目的,我们希望扩展接收微服务。由于WebSocket连接用于将客户机的状态传播到每个其他客户机,因此将客户机的当前状态与接收微服务的所有其他实例同步非常重要。当客户端断开连接时,必须重置状态,这一点也很重要 要提供一些规格,请执行以下操作: 我们正在使用docker swarm 它是一个NodeJS后端和一个有角度的9前端 我们研究了多种想法,例如: Redis缓存(如果实例失败,则不会删除该状态。)

我们正在开发一个与每个客户端都有WebSocket连接的应用程序。出于高可用性和负载平衡的目的,我们希望扩展接收微服务。由于WebSocket连接用于将客户机的状态传播到每个其他客户机,因此将客户机的当前状态与接收微服务的所有其他实例同步非常重要。当客户端断开连接时,必须重置状态,这一点也很重要

要提供一些规格,请执行以下操作:

  • 我们正在使用docker swarm
  • 它是一个NodeJS后端和一个有角度的9前端
我们研究了多种想法,例如:

  • Redis缓存(如果实例失败,则不会删除该状态。)
  • 队列/主题(这意味着每个实例都必须跟踪所有客户端的当前状态。)
  • 实例之间的WebSocket(这看起来很有希望,但实际上不可扩展。)
在多个实例之间同步微服务状态,同时确保不存在不一致性的最佳实践是什么?你是如何解决这个问题的?我们错过了什么明显的东西吗?有什么窍门吗


我们感谢您的建议。

这可能不是您100%想要听到的,但通常人们会建议您这样做

当然,整个应用程序都有状态,而数据库、持久化事件流或键值缓存(例如Redis)是持久化状态的极好方法。理想情况下,这是有界的每个服务,否则你的风险结束

在您的特定情况下很难说,但可能需要重新思考状态在概念上的存储方式,并使其更加明确-确定什么是缓存(用于性能),什么是真正的状态,应该在外部持久化(例如到Redis&a数据库),从而允许许多服务实例立即使用,从而确保他们能够真正做到