即时通讯数据同步方案漫想

                           即时通讯数据同步方案漫想

这几天在思考如果自己实现一套即时通讯应该如何设计数据同步方案,有点成果,在此记录下来。

考虑到多端同步,这里把单聊和群聊都简化成群聊,抽象成这几个对象:
1.对话框
2.A用户手机终端
3.A用户PC终端
4.B用户手机终端
5.B用户PC终端
6.C用户手机终端
7.C用户PC终端

存储层对象抽象成:

  1. 对话框主表,记录对话框标题、设置等信息
  2. 对话框和用户关联表,记录该对话框关联的所有用户,单聊是2个,群聊是n个
  3. 消息主表,记录所有对话框产生的消息
  4. 对话框增量信息表,记录该对话框所有的变更信息,比如创建对话框、修改标题、添加成员、发送消息、撤回消息等,增量信息表只保存若干时间段,过期的数据物理删除
    表结构示意图

这块核心思想是对话框和消息主表设置版本号字段,对应增量信息表的主键,每次该对话框有事件发生,则在增量信息表插入一条数据,同时更新主表的版本号字段,消息主表的版本字段只有在该消息发生撤回等操作的时候更新。每个对话框都有一个独立的版本号,单调递增(不需要连续),由单独的序号服务生成。

消息的发送流程如下图:
消息同步流程

注意点:

  1. 消息发送到消息队列后即可回应发送者消息发送成功
  2. 消息推送为异步模式,发送失败则进行重试
  3. 消息存储为批量模式,提高系统吞吐
  4. 消息查询是根据终端本地存储的消息或全量或增量进行同步
  5. 缓存保存增量的消息,只缓存指定时间

异常场景注意事项:
6. 终端闪断闪连不进行增量同步,由消息队列重试机制保证消息送达

待完善点:
7. 怎么保证数据库和缓存增量数据的一致性?把消息队列的消费位置保存到缓存中,如果缓存重启、主从切换或者消费者重启后从缓存里获取上次消费的位置,这样能保证数据达到最终一致性
8. 由于是异步存储,怎么确保离线查询的数据和上线后的推送数据能接上? 暂时想到的方案是由消息队列的重试机制来保障,把上线时间点前5秒的事件重复推送给该终端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值