kubernetes - 如何在分布式系统中维护套接字或通信 channel

标签 kubernetes google-kubernetes-engine grpc distributed-computing distributed-system

我是分布式系统的新手,曾经需要将 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,这些帖子很有帮助。

  • https://cloud.google.com/solutions/exposing-grpc-services-on-gke-using-envoy-proxy
  • https://github.com/GoogleCloudPlatform/grpc-gke-nlb-tutorial
  • 关于kubernetes - 如何在分布式系统中维护套接字或通信 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59742234/

    相关文章:

    protocol-buffers - 如何在 ProtoBuf (gRPC) - Proto3 语法中将消息类型添加为对象?

    ios - 当前部署目标不支持 -fobjc-weak

    kubernetes - 输入字节 8 处的非法 Base64 数据

    azure - 在 kubernetes 内的 server.xml 中设置环境变量

    Kubernetes:从默认调度中排除节点

    docker log driver "json-file"滚动更新时日志丢失

    docker - Kubectl 无法从私有(private) gcr.io 存储库中提取 docker 镜像

    kubernetes - 不能在最新版本的kubernetes中使用gke集群中的高级行为配置

    docker - Kubernetes 垃圾收集失败 - FreeDiskSpaceFailed & ImageGCFailed

    使用 GRPC 流请求进行代理负载平衡