如果对于下面场景
比如客户端发送一个请求没有收到服务器的响应,客户端通过设置的定时器去重发相同的消息,会有什么问题呢?
1、如果处理的消息逻辑时无危害的,比如读取操作,没关系成为幂等的
1、如果处理的逻辑是修改数据等,会出现重复处理,如何 解决呢?
我们可以给所有的消息添加一个消息头固定长度的位数定义为序列号,收到消息检测序列号,服务器分辨是新的请求还是重发请求,重发的可以拒绝掉,同事还是要响应一次客户端。服务器需要维护每个客户的管理。
type MsgHeader struct {
Opcode uint16 // 消息号ID
MsgSize uint16 // 消息的长度
Sequence uint32 // 消息的序列号
}