系统日常使用过程中,经常会遇到因为网络或者其他原因而产生的消息重发问题,对于某些系统,消息的排重格外重要。
消息重复
消息重复根本的问题是网络传输到服务器的数据包重复。而相对于一个完整请求来说,消息重复可以分为:请求重复和请求分段消息重复。
请求重复
请求已经被服务器正确响应。由于网络等其他原因,服务端仍有可能接收到相同请求,这次请求应该予以忽略。
请求分段消息重复
首次接收到请求,服务器还未响应。一个完整的请求被分成多个数据包进行传输,每个分段消息都可能会重复,同样的,对于已接收的分段消息要予以忽略。
对于分段消息重复的处理
客户端在封装一个请求的分段消息的时候,除了在增加请求体数据之外,还可以增加metadata
信息,包括
- 请求ID
- 分段消息数量
- 分段消息序列
服务端在收到请求分段消息后,阅读metadata
信息,将消息复制到全局缓存中,准备接收剩余的分段消息。剩余的分段消息接收到后将与缓存中的进行序列号比对,重复的予以忽略,直至请求组装完成发送给服务器处理,处理成功后清除缓存请求。
对于重复请求的处理
对于重复请求的处理比较简单粗暴,因为重复的请求必然是与已处理完成的请求重复,肯定不与处理中请求重复,所以任意请求提交到服务端进行处理时,比对一次该请求ID是否已处理,用以防止重复的请求ID多次响应。