【问题标题】:Resolution of Server IPs in gRPCgRPC 中服务器 IP 的解析
【发布时间】:2021-11-23 03:21:41
【问题描述】:

我们正在生产环境中运行一个设置,其中 grpc 客户端通过中间的代理与服务器通信(附图片)

客户端用java写,服务端用go写。我们在客户端使用负载平衡属性作为round_robin。尽管如此,我们还是观察到了一些奇怪的行为。当我们的代理服务器缩小,即从假设 4 减少到 3,然后解析器开始行动,来自我们客户端的请求负载平均分配给我们所有的代理,但是当代理服务器扩大,即从 4 增加到 8,那么新的代理服务器不会收到来自客户端的任何请求,这会导致我们的代理服务器上的请求负载分布不均。有什么配置可以避免这种情况吗?

我们尝试在 JVM ARGS 中将名为 networkaddress.cache.ttl 的属性设置为 60 秒,但即使这样也无济于事。

【问题讨论】:

  • 客户端如何知道使用代理?大部分等效:这是 L4 代理还是 HTTP CONNECT“客户端”代理?
  • @EricAnderson 这是一个 L7 代理,即 Kong。
  • 在这种情况下,客户端只能看到代理的 IP。 round_robin 将在代理之间循环。扩大/缩小服务对客户端没有影响。也许您打算在客户端使用 pick_first 并在代理中使用循环?
  • @EricAnderson 是的,客户端只能看到代理 IP。我说的是代理盒向外扩展的情况。应该用新的代理盒建立连接吧?
  • 哦,对不起。 gRPC 客户端在连接关闭时刷新 DNS。因此,您可以偶尔从代理循环连接。您使用的是哪个代理?理想情况下会有一个像 gRPC 的 MAX_CONNECTION_AGE 这样的选项。

标签: java grpc channel grpc-java


【解决方案1】:

您需要使用 gRPC 客户端中的 keepalivekeepalive timeout 配置来循环粘性 gRPC 连接。

请看看这个 - gRPC connection cycling

【讨论】:

    【解决方案2】:

    round_robinpick_first 都只执行一次名称解析。它们适用于生命周期相对较短的、面向用户的瘦客户端(Android、桌面),因此坚持使用特定(一组)后端连接不是问题。

    如果您的客户端是服务器应用程序,那么您应该使用grpclb 或更新的xDS:它们会在需要时自动重新解析可用的后端。要启用它们,您需要将客户端中的运行时依赖项分别添加到 grpc-grpclbgrpc-xds
    grpclb 不需要任何额外的配置或设置,但功能有限。每个客户端进程都有自己的负载均衡器+解析器实例。默认情况下,后端是通过重复的 DNS 解析获得的。
    xDS 需要一个外部 envoy 实例/服务,从中获取可用的后端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-14
      • 2023-01-23
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 2018-02-24
      • 1970-01-01
      • 2020-04-05
      相关资源
      最近更新 更多