【问题标题】:Multiple unary rpc calls vs long-running bidirectional streaming in grpc?多个一元 rpc 调用与 grpc 中长时间运行的双向流式传输?
【发布时间】:2019-11-08 01:15:05
【问题描述】:

我有一个用例,其中许多客户端需要不断向服务器发送大量指标(几乎是永久的)。服务器需要存储这些事件,并在以后处理它们。我不希望服务器对这些事件做出任何响应。
我正在考虑为此使用grpc。最初,我认为客户端流式传输可以做到(like how envoy does),但问题是客户端流式传输无法确保应用程序级别的可靠传递(即,如果流在两者之间关闭,则发送的消息数量实际上是由服务器),我买不起。
我的想法是,我应该使用双向流,在服务器流中使用 acks,或者使用多个一元 rpc 调用(可能在重复字段中对事件进行一些批处理以提高性能)。
哪个会更好?

【问题讨论】:

    标签: stream grpc grpc-java


    【解决方案1】:

    流确保消息按照发送的顺序传递,这意味着如果有并发消息,就会出现某种瓶颈。

    Google 的 gRPC 团队建议不要使用流而不是一元来提高性能,但是,有人认为理论上流应该具有更低的开销。但这似乎不是真的。

    对于较少数量的并发请求,两者似乎具有相当的延迟。 但是,对于更高的负载,一元调用的性能要好得多。

    没有明显的理由我们应该更喜欢流而不是一元,因为使用流会带来额外的问题,例如

    • 并发请求时延迟很短
    • 应用程序级别的复杂实现
    • 缺乏负载平衡:客户端将连接一台服务器并忽略任何新服务器
    • 对网络中断的恢复能力较差(即使是 TCP 连接中的小中断也会导致连接失败)

    这里有一些基准测试:https://nshnt.medium.com/using-grpc-streams-for-unary-calls-cd64a1638c8a

    【讨论】:

    • 您能否详细说明第二个和第三个要点?对于“复杂实现”,我认为我们只需按照文档中的代码即可设置流式传输,我们的应用程序可以轻松实现代码来读取接收到的数据。对于“缺乏负载平衡”,我们真的需要每个客户端都连接到新服务器吗?我认为每次客户端只需与 1 个服务器建立 1 个连接即可传输数据。
    • 当然,@Darius 关于第 2 点 - 重新建立错误流(当服务器实例关闭时)必须在应用程序级别完成 - 必须在应用程序中完成映射客户端请求和响应级别(例如,如果我们同时发送两个请求 getSalary({employeeId: uint32}) 并且响应类似于 {amount: uint64, currency : Currency} 那么我们将需要将请求的员工 ID 与响应映射。-第二点要么使您在响应中添加额外的字段(由于内部实现而更改合同)并添加额外的逻辑来处理此问题。
    • 第 3 点 - 我们可能在 gRPC 中使用两种类型的负载平衡:服务器端或客户端。它适用于两者。来自客户端的多个一元调用将均匀分布在多个 gRPC 后端(良好的负载平衡)。但是,一旦使用单个后端建立了流式连接,来自客户端的所有负载都会转到该特定服务器(负载平衡不佳)。顺便说一句,这也使得流式传输适用于我们需要交易但其他情况不佳的情况。
    【解决方案2】:

    问题是客户端流无法确保应用程序级别的可靠传输(即,如果流在两者之间关闭,发送的消息有多少是由服务器实际处理的),我负担不起

    这意味着您需要回应。即使响应只是一个确认,从 gRPC 的角度来看,它仍然是一个响应。

    一般方法应该是“使用一元”,除非可以通过流解决足够大的问题以克服其复杂性成本。我讨论了这个at 2018 CloudNativeCon NA(视频有幻灯片和 YouTube 的链接)。

    例如,如果您有多个后端,那么每个一元 RPC 可能会被发送到不同的后端。这可能会导致各种后端同步自身的高开销。流式 RPC 在开始时选择一个后端并继续使用相同的后端。因此流式传输可能会降低后端同步的频率,并在服务实现中实现更高的性能。但是当错误发生时,流式传输会增加复杂性,在这种情况下,它会导致 RPC 变得长寿,这使得负载平衡更加复杂。因此,您需要权衡流式传输/长寿命 RPC 所增加的复杂性是否为您的应用程序提供了足够大的好处。

    我们通常不建议使用流式 RPC 来获得更高的 gRPC 性能。确实,在流上发送消息比新的一元 RPC 更快,但改进是固定的并且具有更高的复杂性。相反,我们建议使用流式 RPC,因为它可以提供更高的应用程序(您的代码)性能或更低的应用程序复杂性。

    【讨论】:

    • 感谢您的回答,埃里克。我已经看过你的演讲了。这在一定程度上让我怀疑流式传输对我的用例来说是否过于矫枉过正并提出这个问题。
    猜你喜欢
    • 2018-07-29
    • 2020-04-28
    • 2020-08-08
    • 1970-01-01
    • 2022-11-03
    • 2017-08-01
    • 1970-01-01
    • 2019-04-08
    • 2017-12-12
    相关资源
    最近更新 更多