我知道 HTTP 请求将导致带有代码和可选正文的响应。
如果我们将请求的发起者称为“客户端”,而将请求的接收者称为“服务器”。
那么顺序是
服务器是否有可能完成第 3 步但第 4 步没有发生(由于连接断开、应用程序错误等)。
换句话说:服务器是否有可能“相信”客户端应该收到响应,但客户端由于某种原因没有收到?
网络本质上是不可靠的。如果对方已经确认,您只能确定消息到达,但您永远不知道它没有。
更糟糕的是,对于 HTTP,请求的唯一确认是应答,而没有应答应答。这意味着:
TCP 堆栈在关闭套接字时通常会确认答案,但该信息不会传播到应用程序层,并且在那里没有用,因为堆栈可以确认接收,然后应用程序可能不会因为它崩溃而无论如何处理该消息(或电源失败或其他原因)并且从应用程序的角度来看,原因是在 TCP 堆栈中还是在其上方都无关紧要 - 无论是消息未处理的方式。
处理这个问题的最简单方法是使用幂等操作。如果服务器再次收到相同的请求,则没有副作用并且响应相同。这样客户端,如果等待响应超时,只需再次发送请求,它最终(除非连接被断开永远不会再次修复)得到响应并且请求将完成。
如果一切都失败了,您需要记录已执行的请求并消除服务器中的重复项。因为没有网络协议可以为您做到这一点。它可以消除很多(就像 TCP 一样),但不是全部。
| 归档时间: |
|
| 查看次数: |
683 次 |
| 最近记录: |