我是分布式系统的新手,曾经需要将 gRPC 服务部署到 kubernetes (GKE) 时遇到了这个问题。据我所知,当客户端启动 rpc 时,它会创建一个持久的 http2 连接,并在其上多路复用进一步的调用。我喜欢通过此连接向客户端发送/推送通知或类似消息。如果我部署到多个 pod,则连接分布在它们之间,并且不确定找到 channel 注册到客户端的实例的最佳方法是什么。一种可能的解决方案是,一旦用户启动连接,就在集中式服务中保留 clientId 和 pod ip(或某些标识)的引用,其他 pod 查找 pod 并将消息转发给它。类似的东西是可取的,还是有一个现有的解决方案?我不熟悉这个空间,任何建议都非常感谢。
编辑:(回复@mebius99)
在查看部署选项时,我偶然发现了 GKE,其他云部署选项由于我使用 gRPC/http2 而受到限制。感谢您提到服务发现,或者服务网格可能是一种选择。使用 gRPC,客户端维护与单个 pod 的长期连接。所以,我希望每个 pod 都能够根据唯一的 clientId(客户端可以进行初始注册 rpc 调用)查询它连接了哪个 pod,因此可以利用这个连接以及 pod 之间转发消息的方式他们。因此,当我收到来自客户端的注册调用时,我会更新有关客户端和 pod ip 的中央注册表,然后从任何 pod 中查找它并将包转发给它,以便它通过现有的流连接进一步转发给客户端。您将我引导到正确的方向,请让我知道以上在容器环境中是可能的。
谢谢你。
最佳答案
另一个想法,你可以使用 Envoy 代理。
如果您使用 GKE,这些帖子很有帮助。
关于kubernetes - 如何在分布式系统中维护套接字或通信 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59742234/