即时通讯系统为什么选择GaussDB(for Redis)?
摘要:如果你需要一款稳定可靠的高性能企业级KV数据库,不妨试试GaussDB(for Redis)。
每当网络上爆出热点新闻,混迹于各个社交媒体的小伙伴们全都开启了讨论模式。一条消息的产生是如何在群聊中传递的呢?让我们一起来探索即时通讯系统(IM)的原理。
IM系统架构的原理
当你在群聊“相亲相爱一家人”中,发送了一条“我找到女朋友了,今天带回家吃饭”,你自然是希望全家人都收到你的喜讯,为你女朋友的到来分头准备。那么正常的流程应该是这样:遍历群成员、查询每个成员的在线状态、如果小伙伴们在线则实时进行推送,如果小伙伴们不在线则暂存至离线库待上线后主动拉取。

这种模式就是传统的IM架构,由于发送成功的消息不会落入离线库,因此聊天记录多端漫游无法实现。如果在线用户推送发生异常,会导致个别人员丢失关键发言,错失重要信息。为了保证消息存储的可靠性,我们对IM系统架构进行了优化,不管成员是否在线都要先把消息和发送对象存储起来,再进行推送。流程变成:遍历群成员、为群聊的每一个人对应的消息队列都存一份消息、查询每个成员的在线状态、对在线成员进行推送。这就是所谓的写扩散模型。

这里显然还存在一个问题,我们向每个小伙伴的消息队列中都存储了相同的“我找到女朋友了,今天带回家吃饭”消息,对磁盘和带宽造成了很大的浪费,这是写扩散的最大弊端。所以我们继续优化,群消息实体存储一份,用户只存消息 ID 索引。流程优化为:遍历群聊的成员、先存一份消息实体、群聊所有人都存一份ID 引用、查询每个成员的在线状态、对在线成员进行推送。这就是所谓的读扩散模型。

简单总结下:
1.读扩散:读取操作很重,写入操作很轻,资源消耗相对小一些。
2.写扩散:读取操作很轻,写入操作很重,资源消耗相对大一些。
IM系统架构优化实践
接下来,让我们使用GaussDB(for Redis) 来实现一个简单的IM应用。

- 使用GaussDB(for Redis)的List类型实现一个消息队列,防止发送端瞬时高流量会压爆消息处理模块;
- 收到消息后,先生成一个全局唯一ID标识该信息,将消息ID和消息内容存入String类型的消息存储库中,如果消息字段复杂也可以考虑使用Hash类型;
- 对于消息中可索引的信息,将消息的索引信息存入Zset类型的消息索引库中,这样无论是接收者还是发送者,都可以按照一定规则对历史消息进行检索;
- 通过查询Set类型的消息关系群组库,查询该信息的接收者集合,这个集合可以根据一定的规则动态增删;
- 将消息ID推入Stream类型的消息同步库,每个Stream对象对应一个接收者,接收者可以通过XRANG命令获取一个范围内的未读信息ID;
- 最后,接收者再通过这组ID,从消息存储库中读取消息原始内容,即完成了一次消息传递。
Why GaussDB (for Redis)?
IM系统有哪些痛点?高斯Redis如何解决这些痛点?
- 开源Redsi数据库可靠性差,甚至丢数据,会直接导致IM系统瘫痪。
GaussDB(for Redis)对数据进行分片,在故障场景下可以自动进行接管,最多可以满足N-1个计算节点故障;存储层使用华为自研的企业级存储池DFV Pool,基于分布式、强一致、高性能的先进架构,实现3AZ6副本存储,保证了在任何时间点的数据强一致,故障情况下数据不丢失。 - 大流量、高并发场景如何支持连接管理,按业务况分散压力?
GaussDB(for Redis)可以满足IM系统对可用性的要求,客户端程序通过ELB接入GaussDB(for Redis)实例,可实现自动负载均衡。 - 突发的高流量、大量的历史消息数据如何处理?
GaussDB(for Redis)采用先进的存算分离架构,在IM系统持续运营的过程中,如果出现突发流量,可以迅速对计算层资源进行秒级扩缩容,快速扛住流量尖峰;历史消息持续增长时,也可以单独对存储层资源大小进行秒级动态调整,最高可扩容至PB级。
GaussDB(for Redis)广泛适用于社交媒体、游戏、电商、推荐系统等领域,在海量并发场景具备极强的高可用能力。如果你需要一款稳定可靠的高性能企业级KV数据库,不妨试试GaussDB(for Redis)。
即时通讯系统为什么选择GaussDB(for Redis)?的更多相关文章
- easy-im:一款基于netty的即时通讯系统
介绍 easy-im是面向开发者的一款轻量级.开箱即用的即时通讯系统,帮助开发者快速搭建消息推送等功能. 基于easy-im,你可以快速实现以下功能: + 聊天软件 + IoT消息推送 基本用法 项目 ...
- 视酷即时通讯系统应用源码 V1.0
视酷即时通讯系统(原创),成熟稳定,拥有和微信一样强大的功能不再是梦,节省几个月研发时间迅速融合进项目中: 1.首家支持聊天室群聊 2.支持和微信一样的语音聊天,可以显示时长.未读状态,自动轮播未读语 ...
- 为自己搭建一个分布式 IM(即时通讯) 系统
前言 大家新年快乐! 新的一年第一篇技术文章希望开个好头,所以元旦三天我也没怎么闲着,希望给大家带来一篇比较感兴趣的干货内容. 老读者应该还记得我在去年国庆节前分享过一篇<设计一个百万级的消息推 ...
- GGTalk ——C#开源即时通讯系统
http://www.cnblogs.com/justnow/ GGTalk ——C#开源即时通讯系统 下载中心 GGTalk(简称GG)是可在广域网部署运行的QQ高仿版,2013.8.7发布GG ...
- 可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)
(最新版本:V6.2,2019.01.03 .Xamarin移动端版本已经推出,包括 Android 和 iOS) GGTalk开源即时通讯系统(简称GG)是QQ的高仿版,同时支持局域网和广域网, ...
- GGTalk即时通讯系统(支持广域网)终于有移动端了!(技术原理、实现、源码)
首先要感谢大家一直以来对于GGTalk即时通讯系统的关注和支持!GGTalk即时通讯系统的不断完善与大家的支持分不开! 从2013年最初的GG1.0开放源码以来,到后来陆续增加了网盘功能.远程协助功能 ...
- 即时通信系统中实现全局系统通知,并与Web后台集成【附C#开源即时通讯系统(支持广域网)——QQ高仿版IM最新源码】
像QQ这样的即时通信软件,时不时就会从桌面的右下角弹出一个小窗口,或是显示一个广告.或是一个新闻.或是一个公告等.在这里,我们将其统称为“全局系统通知”.很多使用C#开源即时通讯系统——GGTalk的 ...
- 即时通信系统中实现聊天消息加密,让通信更安全【低调赠送:C#开源即时通讯系统(支持广域网)——GGTalk4.5 最新源码】
在即时通讯系统(IM)中,加密重要的通信消息,是一个常见的需求.尤其在一些政府部门的即时通信软件中(如税务系统),对即时聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新 ...
- GGTalk——C#开源即时通讯系统源码介绍系列(一)
坦白讲,我们公司其实没啥技术实力,之所以还能不断接到各种项目,全凭我们老板神通广大!要知道他每次的饭局上可都是些什么人物! 但是项目接下一大把,就凭咱哥儿几个的水平,想要独立自主.保质保量保期地一个个 ...
- 【转】GGTalk即时通讯系统(支持广域网)终于有移动端了!(技术原理、实现、源码)
原文地址:http://www.cnblogs.com/justnow/p/4836636.html 首先要感谢大家一直以来对于GGTalk即时通讯系统的关注和支持!GGTalk即时通讯系统的不断完善 ...
随机推荐
- SqlServer 不能收缩 ID 为 %s 的数据库中 ID 为 %s 的文件,因为它正由其他进程收缩或为空。
SQLServer数据库通常都不建议进行SHRINKFILE操作,因为SHRINKFILE不当会造成一定的性能问题. 但是当进行了某些操作(例如某个超大的日志类型表转成分区表切换了数据文件),数据库某 ...
- git—分支设置
什么是分支? 项目以上线,但需要开发新的功能.不能直接在项目上进行开发的,这时候就需要创建一个分支,去完成新功能的开发.测试等.完成之后合并到主分支上面.如果新功能的开发不用分支,导致的问题就会有很多 ...
- gensim
官方文档: https://radimrehurek.com/gensim/models/word2vec.html 1.训练模型定义 from gensim.models import word2v ...
- 【JIRA】jira issue reindex
参考文档: https://community.atlassian.com/t5/Marketplace-Apps-Integrations/Scriptrunner-Listener-Reindex ...
- discuz论坛或门户下载的图片无法显示?
discuz论坛或门户下载的图片无法显示? 使用某些插件或者软件(例如火车头采集器,简数采集工具等)的图片下载功能,发现下载成功了后台也有但是前台无法显示,捣鼓了一轮最终才发现是路径的问题. disc ...
- alt_flash_open_dev读写EPCS出现“Cannot open flash device”的解决办法
转载 http://www.corecourse.cn/forum.php?mod=viewthread&tid=28317 在对EPCS读写操作时alt_flash_open_dev(EPC ...
- STM32上特殊管脚应用 重映射那个GPIO_Remap_SWJ_JTAGDisable
对于初学习者来说为什么用到PB3和PB4时无法控制输出呢? 下面就这一问题进行分析讲解. 首先,STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能 ...
- linux内存管理之malloc、kmalloc、kzalloc、vmalloc的区别
1 用户空间申请内存的方式 1.1 函数原型 void *malloc(unsigned int num_bytes): 1.2 函数解释和说明 如果分配成功则返回指向被分配内存的指针(此存储区中的初 ...
- Android笔记--查询联系人
查询联系人 先在raw_contacts表里面查到每个联系人的不同的id,然后再根据各个id去查询各个联系人的详细信息 然后利用id得到相应的uri的值: 之后,就直接根据uri查询各个联系人的详细信 ...
- P7213 [JOISC2020] 最古の遺跡 3 乱写
不想写题解了,把写在草稿纸上的东西整理了一下 感谢 crashed 大佬的题解与对本人问题的回答,没有他我就不会搞懂这道神仙计数题.