• Home
  • Articles
    • 日志
    • 妍小言
    • 舒小书
    • 浩然说
    • 生活日记
  • All Tags

消息排重探讨

01 Mar 2018

Reading time ~1 minute

系统日常使用过程中,经常会遇到因为网络或者其他原因而产生的消息重发问题,对于某些系统,消息的排重格外重要。

消息重复

消息重复根本的问题是网络传输到服务器的数据包重复。而相对于一个完整请求来说,消息重复可以分为:请求重复和请求分段消息重复。

请求重复

请求已经被服务器正确响应。由于网络等其他原因,服务端仍有可能接收到相同请求,这次请求应该予以忽略。

请求分段消息重复

首次接收到请求,服务器还未响应。一个完整的请求被分成多个数据包进行传输,每个分段消息都可能会重复,同样的,对于已接收的分段消息要予以忽略。

对于分段消息重复的处理

客户端在封装一个请求的分段消息的时候,除了在增加请求体数据之外,还可以增加metadata信息,包括

  • 请求ID
  • 分段消息数量
  • 分段消息序列

服务端在收到请求分段消息后,阅读metadata信息,将消息复制到全局缓存中,准备接收剩余的分段消息。剩余的分段消息接收到后将与缓存中的进行序列号比对,重复的予以忽略,直至请求组装完成发送给服务器处理,处理成功后清除缓存请求。

对于重复请求的处理

对于重复请求的处理比较简单粗暴,因为重复的请求必然是与已处理完成的请求重复,肯定不与处理中请求重复,所以任意请求提交到服务端进行处理时,比对一次该请求ID是否已处理,用以防止重复的请求ID多次响应。



message