遇到了一个场景:某个家居设备向云端后台连续推送了4条时间间隔非常短的tcp状态消息,任意两条消息的时间间隔在200ms内,每条状态消息的时间戳分别为t1,t2,t3,t4。从设备发出来的状态消息的顺序为t1->t2->t3->t4,消息的时间戳t1<t2<t3<t4。由于后台系统采用了微服务架构和多线程的编程模式,经过后台处理后,有一定概率这个四个消息到达app端的顺序不是t1->t2->t3->t4。
简而言之,从设备发出的时间间隔非常短的TCP消息经过后台处理转发后没有按发出顺序到达app端。
见下图:
捕获.PNG
解决方法:
对于同一台设备间隔时间非常短的消息,先经过一个中间服务。这个中间服务会将当前处理的消息的时间戳写到redis中记录起来。然后对于后到的消息,先取出cache中的时间戳t1跟当前的时间戳t0比较。如果t1>t0,说明这个是后发后到的消息,则放行。如果t1<t0,则表明这是一个后发先到的消息,则丢弃。
总体架构如下:
捕获3.PNG
网友评论