在分布式聊天系统(IM)架构 https://blog.csdn.net/ghossst2003/article/details/109433243 一文中提出了把系统改为分布式,客户端消息发送给gate服务器集群,gate服务器集群处理消息和core服务器处理消息会有两个地方出现消息顺序的错乱:
- 客户端发送消息给gate服务器的时候,正常情况下,客户端a连接gate集群中的A服务器,然后发送消息,所有的消息按照客户端的顺序进入A服务器的待处理队列中进行处理,但是如果客户端a连接不上A服务器转而连接gate集群中的B服务器进行消息的发送,A服务器和B服务器处理速度不同,可能B服务器的处理速度快,此时会有客户a先发送给A服务器的消息慢于后发送给B服务器的消息到达core服务器。如图会有消息B先于消息A到达core服务器。
- 到达core服务器集群的消息是core服务器集群中的多台服务器一起处理,所以每台处理消息速度不一样,会造成消息顺序的不错乱。
保证消息的顺序性是肯定必要的,不然聊天消息会错乱,但是其实仅仅需要保证同一个会话中同一个人的发送消息处理顺序,这样,接收顺序就自然而然的是顺序的了。那如何保证呢?
- 客户都连接gate服务器接收客户端发送的消息都已gate服务器写入core服务器的消息成功才标识消息接收成功,这样保证gate服务器本身不积压消息,使多个gate服务器处理同一个客户端的消息有时间上的乱序。
core服务器确认收到消息才反馈给a客户端系统收到消息A,这样可以保证ABgate服务器不会由于处理消息速度差导致消息顺序错乱。
- gate服务器利用一致哈希保证同一个用户同一个会话的消息送入同一个core服务器的消息队列中,避免不同的消息队列处理顺序不一样。一致哈希的算法参考https://www.jianshu.com/p/8a608bc87680,在此处不做介绍。
=================================================================================
建了一个群,聊聊技术,交流工作生活感悟,有兴趣的朋友可以进来: