Java 如何实现无损grpc流式呼叫?

Java 如何实现无损grpc流式呼叫?,java,streaming,grpc,grpc-java,retry-logic,Java,Streaming,Grpc,Grpc Java,Retry Logic,我正在使用java中的grpc流。我有一个持久的开放流,其中客户端和服务器同时通信。当我调用onNext发送消息时,grpc会在内部缓冲该消息,并在线路上异步发送。现在,如果在发送数据中间丢失了流,则调用 OnValue。我想知道什么是正确的做法: 查找成功发送的邮件 如何重试未发送的邮件 目前,我正在考虑在应用层中实现一个“ack”机制,在该机制中,对于接收到的每个x项,接收方都会发回一条ack消息。然后,为了实现重试,我需要缓冲发送方端的项目,并且只有在收到ack时才将它们从缓冲区中删除。另

我正在使用java中的grpc流。我有一个持久的开放流,其中客户端和服务器同时通信。当我调用
onNext
发送消息时,grpc会在内部缓冲该消息,并在线路上异步发送。现在,如果在发送数据中间丢失了流,则调用<代码> OnValue。我想知道什么是正确的做法:

  • 查找成功发送的邮件
  • 如何重试未发送的邮件
  • 目前,我正在考虑在应用层中实现一个“ack”机制,在该机制中,对于接收到的每个x项,接收方都会发回一条ack消息。然后,为了实现重试,我需要缓冲发送方端的项目,并且只有在收到ack时才将它们从缓冲区中删除。另外,在接收方,我需要实现一种机制来忽略接收到的重复项

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


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

    经常使用的术语是保证交付,用于描述从一个地方到另一个地方的交付数据不会丢失

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

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

    在这个答案中,有一个非常好的UDP方法概述:

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


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

    经常使用的术语是保证传递,用于描述从一个地方到另一个地方的传递数据不会丢失

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

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

    在这个答案中,有一个非常好的UDP方法概述:

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

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