【发布时间】:2019-11-25 12:26:04
【问题描述】:
我在 java 中使用 grpc-streaming。我有一个持久的开放流,客户端和服务器同时通信。当我调用onNext 发送消息时,grpc 会在内部缓冲消息,并将其通过网络异步发送。现在,如果流在发送数据的过程中丢失,则调用onError。我想知道什么是正确的做法:
- 找出哪些消息发送成功
- 如何重试未发送的消息
目前,我正在考虑在应用层实现一个“ack”机制,对于接收到的每 x 个项目,接收者会发送回一个 ack 消息。然后为了实现重试,我需要在发送方缓冲项目,并且只有在收到 ack 时才将它们从缓冲区中删除。另外,在接收方,我需要实现一种机制来忽略收到的重复项。
示例: 假设我们每发送 100 个项目就发送一个 ack。我们在第 3 批 (200-300) 上收到 ack,然后在发送项目 300-400 时收到错误。我们再次尝试发送项目 300-400 但客户端已成功收到 300-330 并且它将再次接收它们。因此,客户端需要忽略前 30 项。
可以在应用层实现这一点。但是,我想知道是否有更好的实践/框架可以解决这个问题。
【问题讨论】:
标签: java streaming grpc grpc-java retry-logic