摘要:揭秘高斯 Redis 在IM场景中的利用。

本文分享自华为云社区《华为云PB级数据库GaussDB(for Redis)揭秘第五期:高斯 Redis 在IM场景中的利用》,原文作者:神思胖 。

一、背景

即时通讯(Instant Messaging,简称IM)是一个实时通信零碎,容许两人或多人应用网络实时的传递文字音讯、文件、语音与视频。微信、QQ等IM类产品在这个高度信息化的互联网时代已成为生存必备品,IM零碎中最外围的局部是音讯零碎,音讯零碎中最外围的性能是音讯的同步、存储和检索。

  • 音讯同步:将音讯残缺的、疾速的从发送方发送至接管方。音讯同步零碎最重要的掂量指标是消息传递的实时性、完整性、程序性以及撑持的音讯规模。
  • 音讯存储:即音讯的长久化,传统音讯零碎通常反对音讯在接收端的本地存储,数据根本不具备可靠性。古代音讯零碎反对音讯在云端存储,从而实现音讯异地查问:账号可在任意客户端登陆查看所有历史音讯。
  • 音讯检索:音讯个别是文本,所以反对全文检索也是必备的能力之一。传统音讯零碎通常来说基于本地存储的音讯数据来构建索引,反对音讯的本地检索。而古代音讯零碎反对音讯的在线存储以及存储过程中构建索引,提供全面的音讯检索性能。

二、IM零碎架构设计

上图为IM零碎的利用场景,可用于聊天,游戏、智能客服等诸多行业。不同行业对IM零碎的老本、性能、可靠性、时延等指标的需要是不同的,架构设计须要进行均衡。接下来将介绍IM零碎架构设计所波及到的一些基本概念。

2.1 传统架构 vs 古代架构

  • 传统架构

Ø 先同步后存储。

Ø 在线音讯同步和离线音讯缓存。

Ø 服务端不会对音讯进行长久化,无奈反对音讯异地查问。

  • 古代架构

Ø 先存储后同步。

Ø 划分音讯存储库与音讯同步库。音讯存储库用于全量保留所有会话音讯,次要用于反对音讯异地查问。音讯同步库,次要用于接管方的多端同步。

Ø 提供音讯全文检索能力。

2.2 读扩散vs 写扩散

《2020微信数据报告》指出,截至2020年9月,微信月沉闷用户数为10.825亿,日音讯发送次数450亿次,日音视频呼叫胜利次数4.1亿次。面临这么多的音讯,如何保障消息传递的可靠性、一致性并且无效的升高服务器或者客户端的压力是非常具备技术挑战的。其中,采纳何种读写模型对IM零碎至关重要,这里介绍两种模型:读扩散和写扩散。

如上图所示,用户B与每个聊天的人(A1,A2,A3)都有一个信箱(一种数据结构的形象,用于存储音讯),B在查看聊天信息时需读取所有有新音讯的信箱。IM零碎里的读扩散通常是每两个相关联的人就有一个信箱。

读扩散的长处:

  • 写操作(发消息)轻量,不论是单聊还是群聊,只须要往相应的信箱写一次即可。
  • 每一个信箱人造就是两个人的聊天记录,能够不便查看和搜寻聊天记录。

读扩散的毛病:

  • 读操作(读音讯)很重,存在读放大效应。

如上图,在写扩散中,用户(B1,B2,B3)都只从本人的信箱里读取音讯,但写(发消息)的时候,对于单聊跟群聊解决如下:

  • 单聊:往本人的信箱跟对方的信箱都写一份音讯;同时,如果须要查看两个人的聊天历史记录的话还须要再写一份。
  • 群聊:发信息时须要针对所有群成员的信箱都写一份音讯。群聊应用的是写扩散模型,而写扩散很耗费资源,因而微信群有人数下限(目前是500)。

写扩散长处:

  • 读操作很轻量,只须要读取本人的邮箱。
  • 能够很不便实现音讯的多终端同步。

写扩散毛病:

  • 写操作很重,尤其是对于群聊来说。

2.3 推模式 vs 拉模式 vs 推拉联合模式

在IM零碎中,音讯的获取通常有三种模式:

  • 推模式(Push):新音讯达到时由服务器被动推送给所有客户端;须要客户端和服务器建设长连贯,实时性很高,对客户端来说只须要接管解决音讯即可;毛病是服务端不晓得客户端解决音讯的能力,可能会导致数据积压。
  • 拉模式(Pull):由前端被动发动拉取音讯的申请,为了保障音讯的实时性,个别采纳推模式,拉模式个别用于获取历史音讯;因客户端拉取新音讯的工夫距离不好预设,太短

可能会导致大量的连贯拉取不到数据,太长导致数据接管不及时。

  • 推拉联合模式:兼顾push和pull两种模式的长处。新音讯来长期服务器会先推送一个新音讯达到的告诉给前端,前端接管到告诉后就向服务器拉取音讯。

三、IM技术挑战

上图为IM零碎的总体架构图,Client单方通信会通过Server转发来实现消息传递。其外围为音讯存储库和音讯同步库。这两种库对存储层的性能有极高的要求。

  • 撑持海量数据存储:对于音讯存储库来说,如果须要音讯永恒存储,则随着工夫的积攒,数据规模会越来越大,需存储库反对容量有限扩大以应答日益增长的音讯数据。
  • 低存储老本:音讯数据具备显著的冷热特色,大部分查问集中在热数据,冷数据须要一个低成本的存储形式,否则随着工夫的积攒,数据量一直收缩,存储老本会一直回升。
  • 数据生命周期治理:不论是对于音讯数据的存储还是同步,数据都须要定义生命周期。存储库是用于在线存储音讯数据自身,通常须要设定一个较长周期的保留工夫。而同步库 是用于写扩散模式的在线或离线推送,通常设定一个较短的保留工夫。
  • 极高的写入吞吐:绝大部分IM类场景,通常是采纳写扩散模型,写扩散要求底层存储具备极高的写入吞吐能力,从而应答音讯洪峰。
  • 低提早的读:音讯零碎通常利用于在线场景,具备较高的实时性,读取提早应尽可能低。

四、高斯Redis在IM场景中的劣势

IM零碎的外围是存储层,其性能差别将间接影响IM零碎的用户体验。目前存储层可抉择的数据库产品有很多,如HBase、开源Redis等等。抉择何种数据库,需依据业务规模、老本、性能等指标来进行综合抉择。这里介绍一种NoSQL数据库:高斯Redis,在性能和规模上,能够满足IM系统对存储层的严格要求:海量数据存储、低存储老本、生命周期治理、写入吞吐大、读取时延低。

4.1高斯Redis简介

高斯Redis是华为云数据库团队自主研发且兼容Redis5.0协定的云原生数据库,采纳计算存储拆散架构。存储侧应用自研的存储系统,容量有限扩大、强统一、高牢靠。计算侧基于 LSM 存储引擎实现,通过将大量的随机写转换为程序写,从而极大的晋升了数据写入性能,同时也通过读缓存、bloom filter 等极大优化了读取性能。下图是高斯Redis在IM场景的劣势介绍。

4.2基于高斯Redis的IM利用案例:

下图是基于高斯Redis的IM零碎模型图,这里咱们应用stream作为根本数据结构。Redis stream不仅能够作为音讯存储容器,还实现了生产者、消费者等根本模型,具备IM零碎的基本功能,如音讯订阅,散发、减少消费者等,用户可基于高斯Redis疾速构建一套IM零碎。创立一个群聊时,在Redis中对应地为该群聊创立一个stream队列。在发送音讯时,每个用户都将音讯依照工夫程序增加到stream队列中,保障了音讯的有序性。stream是一个长久化的队列,可保障信息不失落。

五、总结

高斯Redis通过一系列技术创新实现了读写性能程度扩大,秒级扩容,低成本以及主动备份等性能, 可作为IM零碎的存储层,其优异的读写性能和高级个性将会极大助力IM利用.同时,高斯Redis在开源Redis的根底之上,较好均衡了性能和老本,可能广泛应用在智慧医疗、流量削峰、计数器等畛域。

六、完结

本文作者:华为云高斯Redis团队。

杭州西安深圳简历投递:yuwenlong4@huawei.com

更多技术文章,关注高斯Redis官网博客:https://bbs.huaweicloud.com/community/usersnew/id_1614151726110813

七、参考资料

1.《GaussDB(for Redis)官方主页》

https://www.huaweicloud.com/product/gaussdbforredis.html

2.《华为云GaussDB(for Redis)与自建开源Redis的老本比照》

https://www.modb.pro/db/42739

3.《华为云PB级数据库GaussDB(for Redis)揭秘第一期:Redis与存算拆散》

https://bbs.huaweicloud.com/blogs/238584

4.《华为云PB级数据库GaussDB(for Redis)揭秘第三期:一场由fork引发的超时,让咱们从新探讨了Redis的抖动问题》

https://bbs.huaweicloud.com/blogs/245651

5.《古代 IM 零碎中的音讯零碎架构—架构篇》

https://www.infoq.cn/article/...

点击关注,第一工夫理解华为云陈腐技术~