如何扩展 gRPC pub/sub 聊天服务?

How to scale up a gRPC pub/sub chat service?

我正在研究如何使用 gRPC 制作聊天服务。我注意到大多数示例将所有订阅者的连接存储到列表数据结构中。当聊天室收到新消息时,服务器将循环遍历该列表并发送新消息。

source code's 变量 subscribers 中存储订阅者。

我的问题是,当订阅者数量增加时,将所有订阅者存储在 HashMap 中似乎不是一个好主意,因为这会占用太多内存?我试图将这些连接存储在 Redis 中,但这可能是不可能的 due to the connection is not serializable.

我的想法是在 Kubernetes 中部署多个 pod 实例。每个聊天服务都变得独立。订阅者分布在不同的服务器上,如何正确获取订阅者?

以下是我在考虑的几个方面:

  • 任何聊天系统在聊天室大小方面都有一些限制。您想支持多少订户?如果你想支持数十(甚至数百)个订阅者,我相信它与 in-memory 订阅者列表一起工作得很好,因为它比将订阅者列表放在外部缓存中要快得多
  • 当您需要向整个订阅者列表发送消息时,您可以使用 IO-optimized thread-pool.[=17= 并行执行此操作,而不是在该列表上循环]
  • 在 pod 中部署 chat-service 是个好主意,您需要水平扩展的能力,但您还需要在服务前面有一个 smart-gateway,以路由请求给定用户,存储其信息的 pod(如果订阅者列表存储在内存中)。否则,如果此信息存储在外部(缓存中),您的聊天服务可以完全无状态。