消息已读未读的模型设计_现代IM系统中的消息系统架构-实现篇

消息已读未读的模型设计_现代IM系统中的消息系统架构-实现
连杆机会
背景音乐播放系统
消息类场景是表格存储(Tablestore)主推的⽅向之⼀,因其数据存储结构在消息类数据存储上具有天然优势。为了⽅便⽤户基于Tablestore 为消息类场景建模,Tablestore封装Timeline模型,旨在让⽤户更快捷的实现消息类场景需求。在推出Timeline(v1、v2两个版本)模型以来,受到了⼤量⽤户关注。伴随模型推⼴与输出,Tablestore陆续发布了⼀系列专题⽂章,重点讨论介绍了IM场景的架构设计、模型概念以及Feed 流系统架构的设计⽅案,相信给很多⽤户提供了场景实现新思路。⽂章列表见《表格存储权威指南》。
但依然会有⽤户困惑,“框架、结构、模型等概念介绍了这么多,该如何基于Timeline模型,实现具体场景呢?”。
电子散热扇
本⽂就是为了让⽤户更快速的上⼿,带⽤户基于Timeline2.0 模型,详细讲解如何实现⼀个简易的IM系统。并开源了相应的实现代码。源码链接
相关系列⽂章见:《现代IM系统中的消息系统架构 - 架构篇》、《现代IM系统中的消息系统架构 - 模型
篇》
梗概
⽣活中最常见的即时聊天类软件如:钉钉、等,都可以描述为:实现了即时通讯能⼒的聊天⼯具。其中聊天会话可分为两⼤类,分别是:单聊、聊(类似单聊)。这⾥我们以钉钉(Ding Talk)的功能为参照,详细说明相应的功能基于Tablestore的Timeline模型如何实现。如:新消息提醒,未读消息数统计,查看会话中更久的聊天内容,名模糊检索,关键字查询历史记录,以及多客户端同步等。让⽤户在实现⽅案上有更清晰的认识,对模型的抽象概念、接⼝有更好的理解。
下⾯会按照聊天系统的功能模块分段,分别介绍每⼀部分的功能、⽅案介绍、表设计以及实现代码等。功能模块主要分为:消息存储、关系维护、即时感知、多端同步。
功能模块
消息存储
消息系统中,消息存储是最基本的功能。对于消息存储(提供消息的读、写、持久化),⼀⽅⾯需要持久化写⼊,保证消息数据的不丢失,另⼀⽅⾯,适合⽤户的快速、⾼效查询。在IM场景中,写⼊⽅式通常是单⾏、批量写⼊,⽽读取需要按照消息队列范围读取。有时⽤户还有对于历史消息的模糊查询
需求,这时就需要使⽤多维检索、全⽂检索的能⼒。
消息的存储都是基于Timeline模型,具体模型见⽂章《Tablestore发布Timeline 2.0模型》。样例中,消息数据的表结构见下图:
表设计:im_timeline_store_table
存储库
功能:会话窗⼝消息展⽰
激光器芯片存储库是聊天会话消息所对应的存储表,消息以会话分类存储,每个会话是⼀个消息队列。单个消息
队列(TimelineQueue)通过timelineId 唯⼀标识,所有消息基于sequenceId有序排列。消息体中含有发送⼈、消息id(消息去重)、消息发送时间、消息体内容、消息类型(类型包含图⽚、⽂件、普通⽂本,本⽂仅适⽤⽂本)等。
自动干手器>节能煤气灶如上图,当⽤户点击某⼀个会话时,窗⼝会展⽰相应会话的最新⼀页消息。图⽚⾥的消息都是从存储库拉取的,通过timelineId获取该会话
的Queue实例,然后调⽤Queue的scan接⼝与ScanParam参数(sequenceId范围+倒序)拉取最新的⼀页消息。当⽤户向上滚动,展⽰完
这⼀页消息后,客户端会基于第⼀次请求的最⼩sequencId发起第⼆次请求,获取第⼆页消息记录,单页消息数通常选择20-30条。会话的消息可以选择在客户端持久化,然后在感知到新消息之后更新本地消息,增加缓存减少⽹络IO。
核⼼代码
public List fetchConversationMessage(String timelineId, long sequenceId) { TimelineStore store = TimelineStoreTableInstance(); TimelineId

本文发布于:2024-09-22 11:19:34,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/183376.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:消息   模型   系统   实现   场景   数据   介绍   架构
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议