默认

现代IM系统中聊天消息的同步和存储方案探讨

查看数: 435556 | 评论数: 52 | 收藏 35
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2017-11-24 16:22

正文摘要:

本文原作者:木洛,阿里云高级技术专家,内容有优化和修订,感谢原作者。 1、前言 IM全称是『Instant Messaging』,中文名是即时通讯。在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名 ...

评论

苏门答腊伟 发表于 9 个月前
1.同步库和存储库的seq应该是什么样的呢?seq是不是可以保证自增且唯一呢,刚好也可以用来排序。
2.每个会话(存储库中)都会有独立的seq吗?
JackJiang 发表于 1 年前
引用:xiaoskery2 发表于 2023-08-23 17:36
TDengine 、或者influxdb能用作IM的时序数据库吗?

没这样玩过,但你可以试试
xiaoskery2 发表于 1 年前
TDengine 、或者influxdb能用作IM的时序数据库吗?
xiaoskery2 发表于 1 年前
所以呢楼主有什么timeline可以满足选型的要求????
xiaoskery2 发表于 1 年前
有什么开源的timeline数据库可以推荐吗?
JackJiang 发表于 3 年前
引用:封宇_ynOMz 发表于 2018-01-30 15:31
这个问题我这边已经解决了,我近期会在我公众号上放出方案。欢迎版主转过来

ok
小叮当 发表于 3 年前
楼主您好,写扩散和读扩散看到现在还是有点蒙,想问下如本文中的写读扩散的数据库表是如何设计的?想通过一个具体的实例去理解,比如读扩散只需要存一份,单聊下,a发b,存到存储库(from,to,msgid,msg)同步库(from,to,msgid,msg).但是写扩散个人理解也是存这种(from,to,msgid,msg),所说存两份的意思是什么?
四月的一天 发表于 3 年前
引用:LitJoker7 发表于 2021-04-09 16:39
请问在写扩散的场景下,多个接收者同步库之间,以及同步库和存储库之间的数据一致性如何保证

多接收端的同步,参考 timeline 收件箱,每个端有一个游标,拉取消息时根据本地 lastMsgId 来拉取,各个端之间不需要同步
LitJoker7 发表于 3 年前
引用:JackJiang 发表于 2017-11-29 14:15
原作者其实是在推介阿里云的TableStore这个NoSQL数据库,本文在引用时为了让阅读者不会因广告嫌疑而产生 ...

请问在写扩散的场景下,多个接收者同步库之间,以及同步库和存储库之间的数据一致性如何保证
JackJiang 发表于 4 年前
引用:danielstock 发表于 2020-05-28 16:46
a/b单聊的话,比方a发了一条消息,就记录 发送方a,接收方b,消息id1, 发送时间/内容等。同样b发送的就记 ...

大概就是这样了。
danielstock 发表于 4 年前
引用:JackJiang 发表于 2020-05-28 13:41
你说的会话id可以用对方的用户id,你这个表里记录的其实是跟“谁”的聊天记录,你要理解问题的本质

a/b单聊的话,比方a发了一条消息,就记录 发送方a,接收方b,消息id1, 发送时间/内容等。同样b发送的就记录 发送方b,接收方a, 消息id2,发送时间/内容。  a需要拉取离线消息时,就把所有发送方或者接收方为a的记录,拉取回来就行了。
如果是群聊,发送方为发言的人,接收方为群id。a拉取离线消息时,依次拉取所在群的消息即可。
是这样吗 @JackJiang
JackJiang 发表于 4 年前
引用:danielstock 发表于 2020-05-28 12:21
@JackJIang  您好,问的是服务器端消息存储的数据库设计。 怎么来按照会话存储,

因为需要按照用户来 ...

你说的会话id可以用对方的用户id,你这个表里记录的其实是跟“谁”的聊天记录,你要理解问题的本质
danielstock 发表于 4 年前
引用:JackJiang 发表于 2020-05-28 10:43
你问的是本地sqlite怎么设计还是服务端?

@JackJIang  您好,问的是服务器端消息存储的数据库设计。 怎么来按照会话存储,

因为需要按照用户来查询的,所以肯定会把用户编号作为一个独立的列。那么是不是会有两个表,一个是对话信息,记录会话编号及参与者(sessid, userid),另外一个就是会话消息 (sessid, msgid, msgcontent...)
类似这样?

单聊或者群聊的时候,这个会话编号该怎么生成呢。
谢谢。
JackJiang 发表于 4 年前
引用:danielstock 发表于 2020-05-27 21:47
消息同步库用于存储所有用于消息同步的Timeline,每个Timeline对应一个接收端  -------->
如果a和b单聊,a ...

单聊肯定是各写一条,群聊有两种方式:各写一条叫“扩散写”、只写一条叫“扩散读”,各有各有好处,具体你看看这篇《IM群聊消息究竟是存1份(即扩散读)还是存多份(即扩散写)?》。
JackJiang 发表于 4 年前
引用:danielstock 发表于 2020-05-27 23:10
消息存储是按照会话来的,比方a/b的单聊,a/c的单聊,某个组的群聊,在数据库设计的时候,怎么来表示这个Ti ...

你问的是本地sqlite怎么设计还是服务端?
danielstock 发表于 4 年前
消息存储是按照会话来的,比方a/b的单聊,a/c的单聊,某个组的群聊,在数据库设计的时候,怎么来表示这个Timeline。@JackJiang   谢谢
danielstock 发表于 4 年前
消息同步库用于存储所有用于消息同步的Timeline,每个Timeline对应一个接收端  -------->
如果a和b单聊,a发了一条信息,是否会在to-a和to-b的Timeline里面,各写一条记录。
如果abcd群聊,a发了一条信息,是否会在to-a/b/c/d的Timeline里面,各写一条记录。

@JackJiang 谢谢。
Sudo 发表于 4 年前
引用:封宇_ynOMz 发表于 2018-01-30 15:31
这个问题我这边已经解决了,我近期会在我公众号上放出方案。欢迎版主转过来

老哥, 我目前也遇到你说的这个问题, 离线消息还没拉取完, 在线状态时发的消息又推送过来了..  可能导致离线消息没全部拉取到. 不知道您这边最后是怎样解决的.

目前我能想到的方案就是在线推送的时候不直接推送, 而是发送一个推送的事件, 然后后端程序监听到这个事件后从每个涉及到的客户的上一次客户端ack的地方获取后续的消息, 再推送到客户端,  但这样带来的问题是群聊本来一个消息+多个接收人就能搞定的事情, 需要n次操作才能完成一条消息的推送.
JackJiang 发表于 4 年前
引用:榴莲与狗 发表于 2020-02-10 19:01
你好我用的是mongodb保存消息的,一个表保存了所有的单聊消息,我想问下文章中提到的timeline我能不能直 ...

它这个timeline应该是兼有队列和存储的作用,所以技术上应该不仅仅主Mongodb这种持久化存储技术,很可能还包含了内存数据库的技术概念,不然性能无法保证。如果是内存数据库的话,这个timeline就能很好的实现顺序性、订阅和分发。

返回顶部