【笔记】即时通讯设计

记录一下最近对im功能的设计

写扩散

  • 1)遍历群聊的成员并发送消息;
  • 2)群聊所有人都存一份;
  • 3)查询每个成员的在线状态;
  • 4)在线的实时推送。

读扩散

  • 1)遍历群聊的成员并发送消息;
  • 2)先存一份消息实体;
  • 3)然后群聊所有人都存一份消息实体的 ID 引用;
  • 4)查询每个成员的在线状态;
  • 5)在线的实时推送。
  • 用户
  • 用户->用户终端设备:每个用户能够多端登录并收发消息;
  • 用户->消息:考虑到读扩散,每个用户与消息的关系都是 1:n;
  • 用户->消息队列:考虑到读扩散,每个用户都会维护自己的一份“消息列表”(1:1),如果考虑到扩容,甚至可以开辟一份消息溢出列表接收超出“消息列表”容量的消息数据(此时是 1:n);
  • 用户->用户连接状态:考虑到用户能够多端登录,那么 app/web 都会有对应的在线状态信息(1:n);
  • 用户->联系人关系:考虑到用户最终以某种业务联系到一起,组成多份联系人关系,最终形成私聊或者群聊(1:n);
  • 联系人关系
  • 业务决定用户与用户之间的关系:比如说,某个家庭下有多少人,这个家庭群聊就有多少人;在 ToB 场景,在钉钉企业版里,我们往往有企业群聊这个存在;
  • 消息
  • 消息->消息队列:考虑到读扩散,消息最终归属于一个或多个消息队列里,因此群聊场景它会分布在不同的消息队列里;
  • 消息队列
  • 消息队列:确切说是消息引用队列,它里面的索引元素最终指向具体的消息实体对象
  • 用户连接状态
  • 用户连接状态:

- 对于 app 端:网络原因导致断线,或者用户手动 kill 掉应用进程,都属于离线

- 对于 web 端:网络原因导致浏览器断网,或者用户手动关闭标签页,都属于离线

- 对于公众号:无法分别离线在线

- 对于小程序:无法分别离线在线

  • 用户终端设备
  • 终端设备:客户端一般是 Android&IOS,web 端一般是浏览器,还有其他灵活的 WebView(公众号/小程序)

Reference

《基于实践,设计一个百万级别的高可用 & 高可靠的 IM 消息系统》-腾讯云开发者社区-腾讯云 (tencent.com)

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KakaopayAmt": "", "IsBlue": "", "BlueResultNo": "", "BlueAmt": "", "IsAsiana": "", "AsianaResultNo": "", "AsianaAmt": "", "IsSmilecard": "", 腾讯云IM提供了适用于 Vue.js 的即时通讯 SDK,可以方便地在 Vue.js 项目中 "SmilecardResultNo": "", "SmilecardAmt": "", "IsHanaskcard": "", "Hanaskcard使用。使用前需要先引入 SDK,并且需要在腾讯云 IM 控制台上创建应用并获取 SDKAppIDResultNo": "", "HanaskcardAmt": "", "IsHanaone": "", "HanaoneResultNo": "", 和密钥信息。 以下是使用腾讯云 IM SDK 在 Vue.js 中实现简单的即时通讯功能的示 "HanaoneAmt": "", "IsLotte": "", "LotteResultNo": "", "LotteAmt":例代码: ```html <template> <div> <div v-for="msg in msgList" :key="msg.time "", "IsHyundaione": "", "HyundaioneResultNo": "", "HyundaioneAmt": "", ""> <p>{{ msg.sender }}: {{ msg.content }}</p> <small>{{ msg.time }}</small> </div> IsNonghyupone": "", "NonghyuponeResultNo": "", "NonghyuponeAmt": "", <input v-model="inputMsg" @keydown.enter="sendMsg" /> </div> </template> <script> import TIM from ' "IsSamsungone": "", "SamsungoneResultNo": "", "SamsungoneAmt": "", "IsWoorionetim-js-sdk' export default { data() { return { tim: null, userID: 'user1', convID": "", "WoorioneResultNo": "", "WoorioneAmt": "", "IsShinhancardone": "", : 'conv1', inputMsg: '', msgList: [] } }, mounted() { this.initIM() "ShinhancardoneResultNo": "", "ShinhancardoneAmt": "", "IsHyundaicardone }, methods: { initIM() { this.tim = TIM.create({ SDKAppID: 'xxx', // 替换为": "", "HyundaicardoneResultNo": "", "HyundaicardoneAmt": "", "IsSamsun自己的 SDKAppID userID: this.userID, userSig: 'xxx' // 替换为自己的密钥ghappyone": "", "SamsunghappyoneResultNo": "", "SamsunghappyoneAmt": "", 信息 }) this.tim.on(TIM.EVENT.MESSAGE_RECEIVED, this.handleMsgReceived) this.tim.login() }, sendMsg() "IsNonghyupcardone": "", "NonghyupcardoneResultNo": "", "Nonghyupcard { const msg = this.tim.createTextMessage({ to: this.convID, payload: { text: this.inputMsg } }) this.tim.sendMessage(msg) this.msgList.push({ sender: this.userID, content: this.inputMsg, oneAmt": "", "IsHappymoneycardone": "", "HappymoneycardoneResultNo": "", " time: new Date().toLocaleString() }) this.inputMsg = '' }, handleMsgReceived(event) { const msgHappymoneycardoneAmt": "", "IsCulturesurvivalone": "", "CulturesurvivaloneResult = event.data[0] this.msgList.push({ sender: msg.from, content: msg.payload.text, time: newNo": "", "CulturesurvivaloneAmt": "", "IsDongaone": "", "DongaoneResultNo Date(msg.time * 1000).toLocaleString() }) } } } </script> ``` 这个示例中,": "", "DongaoneAmt": "", "IsGmarketone": "", "GmarketoneResultNo": "", 我们使用了 tim-js-sdk 库来操作腾讯云 IM,通过创建 TIM 实例来进行登录、发送消息、接收消息 "GmarketoneAmt": "", "IsEtcCardone": "", "EtcCardoneResultNo": "", "EtcCardoneAmt": "", "IsBlueone": "", "BlueoneResultNo": "", "BlueoneAmt": "", 等操作。在模板中,我们使用 v-for 指令来展示消息列表,并通过 v-model 指令来实现输入框的双向绑定,通过 @keydown.enter 事件监听来发送消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值