作者:mobiledu2502891023 | 来源:互联网 | 2023-08-11 10:54
1、写在前面
作者在本文研究websocket已经数月,分享一个亿级消息量、分布式IM系统这个技术前提下,分析和总结读写扩散的知识。本文将做到通俗易懂,不涉及任何代码讲解。
2、读扩散 vs 写扩散
IM系统里经常会涉及到读扩散和写扩散这两个技术概念,我们来看看。
2.1 读扩散
如上图所示:A与每个聊天的人跟群都有一个信箱
(有些博文会叫Timeline,见
《现代IM系统中聊天消息的同步和存储方案探讨》),A在查看聊天信息的时候
需要读取所有有新消息的信箱。
读扩散的优点:可以看到,一个聊天记录需要一个信箱存放
1)写操作(发消息)很轻量,不管是单聊还是群聊,只需要往相应的
信箱写一次就好了;
2)每一个信箱天然就是两个人的聊天记录,可以方便查看聊天记录跟
进行聊天记录的搜索。
读扩散的缺点:读操作(读消息)很重,在复杂业务下,一条读扩散消息源需要
复杂的逻辑才能扩散成目标消息。
2.2 写扩散
接下来看看写扩散。 如上图所示:在写扩散中,每个人都只从自己的信箱里读取消息,我们从中需要维护用户的信箱即可。
但写(发消息)的时候,对于单聊跟群聊处理如下:
1)单聊:往自己的信箱跟对方的信箱都写一份消息,同时,如果需要
查看两个人的聊天历史记录的话还需要再写一份(当然,如果从个人信箱
也能回溯出两个人的所有聊天记录,但这样效率会很低);
2)群聊:需要往所有的群成员的信箱都写一份消息,同时,如果需要
查看群的聊天历史记录的话还需要再写一份。可以看出,写扩散对于群聊
来说大大地放大了写操作。
写扩散优点:
1)读操作很轻量;
2)可以很方便地做消息的多终端同步。
写扩散缺点:写操作很重,尤其是对于群聊来说(因为如果群成员很多的话,1
条消息源要扩散写成“成员数1”条目标消息,这是很恐怖的)
注:本文有参考于诸葛老师