【问题标题】:Does the C# Implementation of gRPC have streaming back-pressure?gRPC 的 C# 实现是否具有流式背压?
【发布时间】:2018-06-19 21:26:43
【问题描述】:

我有一个 gRPC 服务,它接受来自客户端的流式消息。客户端以高速率向服务器发送有限序列的消息。

结果是服务器缓冲了大量消息 (> 1GB),它的内存使用量猛增,然后在处理它们时慢慢耗尽。

我发现即使我等待所有异步调用,客户端也会尽可能快地推送消息。我希望客户端放慢速度。

我已经实现了客户端在发送下一条消息之前等待的显式 ack 响应,但是由于 http/2 已经内置了流控制语义,我觉得我有点重新发明轮子。

我有两个具体的问题。

  1. C# 实现会自动应用背压吗?例如,如果消费端在异步流上调用 MoveNext 的速度很慢,那么客户端是否需要更长的时间才能从其对 WriteAsync 的调用中返回?

  2. gRPC 的 C# 实现是否有任何可配置的方式来限制流式 rpc 调用的消息缓冲。例如,限制缓冲消息的数量或限制调用缓冲区中的空间量。

【问题讨论】:

标签: c# grpc flow-control backpressure


【解决方案1】:

正如 Jan 所评论的,这个问题在 gRPC GitHub Repo here 上得到了回答。

我们认为,流控制预计适用于所有 gRPC 语言 它是可扩展 RPC 系统的关键特性之一。

更具体地说:

  1. 如果一侧请求消息很慢(MoveNext()),发送端最终会在发送时被“阻塞”(WriteAsync() 将占用 成功的时间更长-您只能在 WriteAsync() 中进行操作 每次通话的进度)。

  2. 我相信这样的参数可以通过C-core通道参数(C#中的ChannelOption)来配置。

【讨论】:

    猜你喜欢
    • 2019-12-08
    • 1970-01-01
    • 2017-05-29
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 2018-08-08
    相关资源
    最近更新 更多