gpt4 book ai didi

java - 如何实现无损 grpc-streaming 调用?

转载 作者:行者123 更新时间:2023-12-05 05:10:06 25 4
gpt4 key购买 nike

我在 java 中使用 grpc-streaming。我有一个持久的开放流,客户端和服务器同时通信。当我调用 onNext 发送消息时,grpc 会在内部缓冲消息并将其异步发送到网络上。现在,如果流在发送数据的过程中丢失,将调用 onError。我想知道什么是正确的做法:

  1. 找出哪些消息发送成功
  2. 如何重试未发送的消息

目前,我正在考虑在应用层中实现一个“ack”机制,对于每收到 x 个项目,接收方都会发回一个 ack 消息。然后为了实现重试,我需要在发送方缓冲项目,并且只在收到 ack 时将它们从缓冲区中删除。此外,在接收方,我需要实现一种机制来忽略收到的重复项。

示例:假设我们每发送 100 个项目发送一个 ack。我们在第 3 批 (200-300) 收到确认,然后在发送项目 300-400 时收到错误。我们再次尝试发送项目 300-400 但客户端已成功收到 300-330 并且它将再次接收它们。因此,客户端需要忽略前 30 个项目。

可以在应用层实现。但是,我想知道是否有更好的做法/框架可以解决这个问题。

最佳答案

经常使用的术语是保证交付来描述从一个地方到另一个地方的无损失的交付数据。

您的用例类似于尝试通过 UDP 等尽力而为的交付传输层提供有保证的交付。通常的方法是确认每个数据包,尽管您可以设计一个方案来按照您的建议在更高级别进行检查。

您通常还希望使用某种形式的滑动窗口,这意味着您不必在发送下一个数据包之前等待上一个确认 - 这有助于避免延迟。

在这个答案中对 UDP 上的这种方法有一个很好的概述:https://stackoverflow.com/a/15630015/334402

对于您的情况,您将收到对您的 RPC 调用的响应,这实际上是 ack - 使用滑动窗口可以让您在收到上一个 ack 之前进行下一个调用。

您的重复交付示例也很常见 - 避免重复计算或混淆的一种常见方法是使用数据包编号并简单地丢弃任何重复的数据包。

关于java - 如何实现无损 grpc-streaming 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57062815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com