我想这个问题可能有点儿问题,问题要求,如何实现:“保证消息5秒内一定到达”,但这是一个不可能完成的任务,如果消息发出去的时候,网络中断了10秒。那你就是有逆天的本事,代码也没办法跨越虚空把数据发到另一台服务器啊。
所以,问题应该是:“将消息发送到从服务器,并且如果超过5秒,则放弃发送,保证超过5秒一定失败,而不会存在主服务器认为数据没有发送,而实际上从服务器却接收到了的情况”
如果问题是这样的话,我们可以这样做。
主服务器发送消息,并且等待从服务器的响应,就像http协议一样,请求和响应对应。
主服务器发送的消息里面包含消息发送时间,和消息的唯一ID。
主服务器发送数据,那么会有这么几种情况:
- 收到从服务器的成功响应
- 收到从服务器的失败响应,例如从服务器收到数据的时候,数据已经超过了5秒,所以拒绝处理。
- 没有收到响应,例如网络中断
前两种情况我们都可以“确定”,第三种情况。我们可以重新发送这个请求。此时会出现这些情况
- 收到从服务器的成功响应
- 从服务器上次已经接收到请求了,所以这次返回成功
- 收到从服务器的失败响应,例如从服务器收到数据的时候,数据已经超过了5秒,所以拒绝处理。
- 没有收到响应,例如网络中断
前三种情况我们都可以“确定”
如果是第四种情况,那么我们继续发送,继续是上面4种结果。
就这样,我们就能保证消息一定发送成功,或者一定发送失败,而不会出现不知道消息发送成功没有的问题了。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…