java - gRPC 中服务器 IP 的解析
问题描述
我们正在生产中运行一个设置,其中 grpc 客户端通过中间的代理与服务器通信(附图)
客户端是用java写的,服务端是用go写的。我们在客户端使用负载平衡属性作为round_robin。尽管如此,我们还是观察到了一些奇怪的行为。当我们的代理服务器缩小,即从假设 4 减少到 3,然后解析器开始行动,来自我们客户端的请求负载平均分配给我们所有的代理,但是当代理服务器扩大,即从 4 增加到 8,那么新的代理服务器不会收到来自客户端的任何请求,这会导致我们的代理服务器上的请求负载分布不均。我们可以做任何配置来避免这种情况吗?
我们尝试在 JVM ARGS 中设置一个名为networkaddress.cache.ttl
60 seconds 的属性,但即使这样也无济于事。
解决方案
两者都只round_robin
执行pick_first
一次名称解析。它们适用于生命周期相对较短的瘦、面向用户的客户端(android、桌面),因此坚持特定的(一组)后端连接不是问题。
如果您的客户端是服务器应用程序,那么您应该使用grpclb
或更新的xDS:它们会在需要时自动重新解析可用的后端。要启用它们,您需要在客户端中分别添加运行时依赖grpc-grpclb
项grpc-xds
。
grpclb
不需要任何额外的配置或设置,但功能有限。每个客户端进程都有自己的负载均衡器+解析器实例。默认情况下,后端是通过重复的 DNS 解析获得的。
xDS
需要一个外部特使实例/服务,从中获取可用的后端。
推荐阅读
- python - 对象检测 opencv 需要一个整数(获取类型元组)
- android - ListView.setAdapter(android.widget.ListAdapter)' 在 android 中的空对象引用
- linux - 如何以特定方式重命名目录。重击
- azure - az vim run-command 使用参数调用 shell 脚本
- php - Laravel Dusk 和内存使用 - 如何关闭浏览器和自定义进程
- python - 我需要尽快向服务器发送响应,然后在flask中执行函数吗?
- python - 将事件记录转换为有总和的期间
- amazon-web-services - AWS - 如何将任何视频或图像格式云转换为 MP4 或 JPG?
- java - 从数据库中获取值的代码自动完成显示下拉列表中的所有值
- ignite - 在 Ignite 中启用读取时,底层数据库中发生的更新会发生什么情况?