【发布时间】:2017-08-03 18:19:54
【问题描述】:
我有一个使用 Java 通过 TCP 套接字向外部系统发送消息的系统。如果我们想尽最大努力确保接收到发送的消息,是否需要执行重试逻辑以防在发送方法中捕获到网络故障?
在我看来,没有必要重试,因为它已经由 TCP 在后台处理。这个论点有效吗?
谢谢!
博
【问题讨论】:
-
TCP 确实为您处理了这个问题。一旦你发送数据并且它已经被正确地提供给底层内核,它就无法控制了。如果收到发送错误,则必须断开套接字并连接新的套接字才能再次交换数据。
-
谢谢雷米!我的问题更多的是在这里重试是否有意义。既然 TCP 已经为我做了重试,我还需要在我的业务逻辑中做重试吗?如果是,应该使用什么重试策略?
-
您不能在 TCP 中实现自己的重试(仅在 UDP 中)。一旦套接字出错,就是这样。套接字处于错误/未知状态,您所能做的就是断开连接并创建一个新连接。
-
您知道接收应用程序是否收到您发送的消息的唯一方法是确认每条消息。即,接收应用程序必须发回它已收到的消息。这通常很麻烦,这会导致在消息中引入序列号,并且接收者的任务是跟踪它收到的消息并在丢失任何消息时要求重新发送。如果您对接收器没有那种级别的控制,那么您应该捕获错误并重新发送,但这就是您所能做的,正如 Vovanrock2002 在下面解释的那样。