- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 kubernetes pod 中使用带有 Python 的 gRPC 作为客户端/服务器...我希望能够启动多个相同类型的 pod(gRPC 服务器)并让客户端(随机)连接到它们。
我分派(dispatch)了 10 个服务器 pod 并设置了一个“服务”来定位它们。然后,在客户端中,我连接到服务的 DNS 名称——这意味着 kubernetes 应该进行负载平衡并将我定向到一个随机服务器 pod。实际上,客户端调用 gRPC 函数(运行良好)但是当我查看日志时,我发现所有调用都转到同一个服务器 pod。
我假设客户端正在执行某种 DNS 缓存,这会导致所有调用都发送到同一台服务器。是这样吗?无论如何禁用它并设置相同的 stub 客户端进行"new"调用并在每次调用时通过 DNS 获取新的 ip?
我知道如果它每次都查询 DNS 服务器可能会导致开销,但目前分配负载对我来说更为重要。
最佳答案
让我借此机会通过描述事情应该如何运作来回答。
客户端 LB 在 gRPC C 核心(除了 Java 和 Go 风格或 gRPC 之外的所有基础)中的工作方式如下(可以找到权威文档 here ):
客户端 LB 故意保持简单和“愚蠢”。我们选择实现复杂 LB 策略的方式是通过外部 LB 服务器(如上述文档中所述)。您不关心这种情况。相反,您只是创建一个 channel ,它将使用(默认)优先选择 LB 策略。
LB 策略的输入是已解析地址的列表。使用 DNS 时,如果 foo.com 解析为 [10.0.0.1, 10.0.0.2, 10.0.0.3, 10.0.0.4]
,该策略将尝试与所有这些建立连接。第一个成功连接的将成为选中的那个直到它断开连接。因此得名“先挑”。更长的名称可能是“首先选择并尽可能长时间地使用它”,但这导致了一个非常长的文件名 :)。如果/当挑选一个人断开连接时,选择优先的策略将转移到返回下一个成功连接的地址(内部称为“连接的子 channel ”),如果有的话。再一次,只要它保持连接,它就会继续选择这个连接的子 channel 。如果所有这些都失败,则调用将失败。
这里的问题是 DNS 解析本质上是基于拉取的,仅在 1) channel 创建时和 2) 在所选连接的子 channel 断开连接时触发。
截至目前,一个 hacky 解决方案是为每个请求创建一个新 channel (效率非常低,但根据您的设置它可以解决问题)。
鉴于 2017 年第一季度即将发生的变化(参见 https://github.com/grpc/grpc/issues/7818),客户将可以选择不同的 LB 政策,即 Round Robin。此外,我们可能会考虑在该客户端配置中引入一个“随机化”位,这将在对地址进行循环之前对地址进行洗牌,从而有效地实现您的意图。
关于python - gRPC 客户端负载均衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39643841/
关于 gRPC Health Checking ,如果 gRPC 服务托管在与其他也需要健康检查的 HTTP 服务相同的端口上,则对 grpc.health.v1.Health.Check 的响应应该
我的项目是读取服务器中的图像,进行一些处理,然后将整个图像传递给客户端。客户端占用图像并进行更多处理,并将一些输出值返回给服务器。服务器和客户端之间使用的图像大小为 [640x480x3]。 以下是我
gRPC 基于 HTTP/2,它(假设)被浏览器广泛支持。因此,我觉得从浏览器使用 gRPC 应该没有问题。 但是,很明显存在问题。协议(protocol),grpc web , 是不同的,因为“由于
关于服务器端代码的幂等性的问题,或者说它的必要性。对于一般的 gRPC,或者专门针对 java 实现。 当我们从客户端发送消息一次时,是否有可能由我们的服务实现处理两次?也许这与服务似乎不可用时的重试
假设我想使用 Grpc Server 流式传输或双向流式传输。 考虑到它在底层使用 http/2,流可以持续多长时间是否有任何限制? 如果是的话,它可以用来代替消息总线,这样流就可以打开并存活多久?
使用 gRPC 向客户端发送有关错误的更多详细信息的模式是什么? 例如,假设我有一个用于注册用户的表单,用于发送消息 message RegisterUser { string email = 1
我是 GRPC 的新手。我想知道当 GRPC 客户端启动一个请求时,服务器是否启动一个新线程来处理。 最佳答案 最多可能有一个 Runnable加入 Server's executor用于申请处理。每
我想传输一个 int64 数组。 我查了一下如何使用它。在我的原型(prototype)文件中,我需要一个流: service myService { rpc GetValues(myRequ
通常,客户端可以通过以下方式取消 gRPC 调用: (requestObserver as ClientCallStreamObserver) .cancel("Cancelled", nul
在 100Gb 网络上,我创建了一个服务器来监听 4 个端口,grpc 客户端可以达到 3GB+/s 的吞吐量。然而,当服务器监听一个端口时,grpc 客户端达到了 1GB/s 的吞吐量,即使我设置了
我想验证调用并可能在服务器拦截器中回答错误。有没有办法做到这一点?如果是,我该如何实现? 最佳答案 简单地从拦截器响应 RPC,可能通过调用 close() ,不要调用next .您仍然需要返回一个监
我有一个 GRPC API,经过重构,一些包被重命名。这包括我们定义 API 的原型(prototype)文件之一中的 package 声明。像这样的: package foo; service Ba
我想在 Ubuntu 上使用源代码中的所有子模块编译 grpc,并将其安装到/usr/local 以外的指定位置 为提供的 Makefile 指定此位置的方法是什么(类似于配置脚本的 --prefix
我不断在控制台中收到此警告: DeprecationWarning: grpc.load: Use the @grpc/proto-loader module with grpc.loadPackag
上下文 我正在尝试使用 Google 的 Cloud Natural Language API。我有我的服务帐户 key JSON 文件,并且正在尝试编写一个简单的 .NET Core 应用程序(更具
用户在测试中遇到了此崩溃。我的第一个猜测是这与内存有关,但除此之外我没有什么可做的。更深入地研究代码,我认为这可能是主线程问题,但看起来监听器在后台线程上被删除,所以我怀疑这就是原因。 我认为在应用程
我正在编写一个 grpc 服务并在 Kubernetes (https://github.com/grpc-ecosystem/grpc-health-probe) 上使用 gRPC 健康检查。在我的
如何使用 gRPC-java 实现检测网络错误并尝试从中恢复的策略?我知道 UNAVAILABLE 状态可能意味着网络错误,但这并没有告诉我它是哪种网络错误 - 并且 UNAVAILABLE 也可以从
假设我们有一个 Search-Service service Search { rpc Search (SearchRequest) returns (SearchReply) {} } mess
如果浏览器支持http/2,为什么 grpc-web 需要 envoy 代理? 不支持 http/2 的旧浏览器是否只需要它? 最佳答案 回答于 https://github.com/grpc/grp
我是一名优秀的程序员,十分优秀!