IM系统中怎么保证消息的幂等性以及时序性

开门见山,直接说问题。

  • 幂等性:也就是消息唯一性,保证重复消息的最终结果不变;
  • 时序性:消息的顺序。

保证幂等性

  • 一般来说,保证唯一,可以像数据库一样,给一个唯一的key;首先必然是UUID或者时间抽,确实可以保证唯一key;但是这个key应该是交给谁处理呢,客户端发送时,携带key?还是再服务端生成?先想一下为啥会出现重复消息呢?很明显就是消息重发,客户端没有收到服务端的ack;这个时候消息又重新投递到服务端,服务端会根据key对比数据库,来判断是否已经发送过了,如果发送过了,就不会在持久化消息;直接发送给接收方;这里的关键就是key,如果客户端重发时UUID不一致,那就会出现消息重复的问题。所以这个实现,依赖于客户端;

  • 那如果服务端呢,服务端在接受到消息时,给每一个消息设置key,然后再投递;但是这里的msg再服务端之前是没有key的,那这个又怎么保证消息唯一;目前来看,是只能依赖于客户端对消息进行标识;保证唯一性;然后服务端可以进行二次判断,比如使用redis暂时缓存这些消息,每次消息发送时,读取判断;

  • 而对于有序性,如果单纯使用客户端的本地时间戳保证时序性,如果客户端时间不准确,很容易出现问题;当然你也可以使用定时任务定时更新客户端也服务端时间;这样也可以保证,不过如果这个定时任务出现错误,那就不保证了,当然概率很低(只要一次成功,基本时间就已经校准服务端了,不太可能次次失败);我是更觉得服务端用来保证消息的有序性会比较合适,服务端可以使用一个seq,这个seq是趋势递增;客户端就可以使用这个seq进行排序绚烂;这样会稳定很多。即便客户端离线了,只要消息投递到了服务器,就一定可以保证时序性;

posted @   乐可乐  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示