摘要:如果你需要一款稳定可靠的高性能企业级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如何解决这些痛点?

  1. 开源Redsi数据库可靠性差,甚至丢数据,会直接导致IM系统瘫痪。
    GaussDB(for Redis)对数据进行分片,在故障场景下可以自动进行接管,最多可以满足N-1个计算节点故障;存储层使用华为自研的企业级存储池DFV Pool,基于分布式、强一致、高性能的先进架构,实现3AZ6副本存储,保证了在任何时间点的数据强一致,故障情况下数据不丢失。
  2. 大流量、高并发场景如何支持连接管理,按业务况分散压力?
    GaussDB(for Redis)可以满足IM系统对可用性的要求,客户端程序通过ELB接入GaussDB(for Redis)实例,可实现自动负载均衡。
  3. 突发的高流量、大量的历史消息数据如何处理?

GaussDB(for Redis)采用先进的存算分离架构,在IM系统持续运营的过程中,如果出现突发流量,可以迅速对计算层资源进行秒级扩缩容,快速扛住流量尖峰;历史消息持续增长时,也可以单独对存储层资源大小进行秒级动态调整,最高可扩容至PB级。

GaussDB(for Redis)广泛适用于社交媒体、游戏、电商、推荐系统等领域,在海量并发场景具备极强的高可用能力。如果你需要一款稳定可靠的高性能企业级KV数据库,不妨试试GaussDB(for Redis)。

点击关注,第一时间了解华为云新鲜技术~

即时通讯系统为什么选择GaussDB(for Redis)?的更多相关文章

  1. easy-im:一款基于netty的即时通讯系统

    介绍 easy-im是面向开发者的一款轻量级.开箱即用的即时通讯系统,帮助开发者快速搭建消息推送等功能. 基于easy-im,你可以快速实现以下功能: + 聊天软件 + IoT消息推送 基本用法 项目 ...

  2. 视酷即时通讯系统应用源码 V1.0

    视酷即时通讯系统(原创),成熟稳定,拥有和微信一样强大的功能不再是梦,节省几个月研发时间迅速融合进项目中: 1.首家支持聊天室群聊 2.支持和微信一样的语音聊天,可以显示时长.未读状态,自动轮播未读语 ...

  3. 为自己搭建一个分布式 IM(即时通讯) 系统

    前言 大家新年快乐! 新的一年第一篇技术文章希望开个好头,所以元旦三天我也没怎么闲着,希望给大家带来一篇比较感兴趣的干货内容. 老读者应该还记得我在去年国庆节前分享过一篇<设计一个百万级的消息推 ...

  4. GGTalk ——C#开源即时通讯系统

    http://www.cnblogs.com/justnow/ GGTalk ——C#开源即时通讯系统 下载中心   GGTalk(简称GG)是可在广域网部署运行的QQ高仿版,2013.8.7发布GG ...

  5. 可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)

      (最新版本:V6.2,2019.01.03 .Xamarin移动端版本已经推出,包括 Android 和 iOS) GGTalk开源即时通讯系统(简称GG)是QQ的高仿版,同时支持局域网和广域网, ...

  6. GGTalk即时通讯系统(支持广域网)终于有移动端了!(技术原理、实现、源码)

    首先要感谢大家一直以来对于GGTalk即时通讯系统的关注和支持!GGTalk即时通讯系统的不断完善与大家的支持分不开! 从2013年最初的GG1.0开放源码以来,到后来陆续增加了网盘功能.远程协助功能 ...

  7. 即时通信系统中实现全局系统通知,并与Web后台集成【附C#开源即时通讯系统(支持广域网)——QQ高仿版IM最新源码】

    像QQ这样的即时通信软件,时不时就会从桌面的右下角弹出一个小窗口,或是显示一个广告.或是一个新闻.或是一个公告等.在这里,我们将其统称为“全局系统通知”.很多使用C#开源即时通讯系统——GGTalk的 ...

  8. 即时通信系统中实现聊天消息加密,让通信更安全【低调赠送:C#开源即时通讯系统(支持广域网)——GGTalk4.5 最新源码】

    在即时通讯系统(IM)中,加密重要的通信消息,是一个常见的需求.尤其在一些政府部门的即时通信软件中(如税务系统),对即时聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新 ...

  9. GGTalk——C#开源即时通讯系统源码介绍系列(一)

    坦白讲,我们公司其实没啥技术实力,之所以还能不断接到各种项目,全凭我们老板神通广大!要知道他每次的饭局上可都是些什么人物! 但是项目接下一大把,就凭咱哥儿几个的水平,想要独立自主.保质保量保期地一个个 ...

  10. 【转】GGTalk即时通讯系统(支持广域网)终于有移动端了!(技术原理、实现、源码)

    原文地址:http://www.cnblogs.com/justnow/p/4836636.html 首先要感谢大家一直以来对于GGTalk即时通讯系统的关注和支持!GGTalk即时通讯系统的不断完善 ...

随机推荐

  1. oracle从1到10生成顺序号

    oracle从1到10生成顺序号,脚本案例如下: select 'ABAB'|| lpad(level,5,0) as serial_no from dual connect by level< ...

  2. logrotate 切割Tomcat的catalina.out文件

    使用logrotate进行切割.   在/etc/logrotate.d下,新建tomcatrotate,编辑tomatrotate,写入如下内容:    /usr/local/tomcat/logs ...

  3. CentOS7 使用Mariadb 安装 hive

    前提:已成功安装hadoop ──────────1. MariaDB安装 ──────────第一步 参照以下内容安装MariaDBhttps://www.linuxprobe.com/chapte ...

  4. SQL Server 2014 启动时提示:无效的许可证数据,需要重新安装

    路径:C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE 双击运行DDConfigCA.exe后,Sql Server 20 ...

  5. 使用Python+Appium+夜神模拟器,并连接uiautomatorviewer

    本文不介绍安装步骤,实在是太多博文了 一.安装 Python:3.8 Appium:1.22.3 夜神模拟器 node JDK1.8 SDK 二.成功连接模拟器 PytCharm代码如下: # cod ...

  6. Liunx下tomcat安装配置

    1.在LIUNX下下载tomcat.wget apache-tomcat-7.0.41.tar.gz 2.在安装目录下解压. tar -zxvf apache-tomcat-7.0.41.tar.gz ...

  7. html、css、js 压缩或混淆方法

    普通的压缩代码的方法包括在线工具和服务器打包处理,有一个共同的痛点是:压缩后的代码无法还原成原始的带有注释的源代码.正如大家所知,在源代码中调试Bug事半功倍.在线工具HCJCompress(ihon ...

  8. 手把手教你基于luatos的4G(LTE Cat.1)模组接入华为云物联网平台

    摘要:本期文章采用了4G LTE Cat.1模块,编程语言用的是lua,实现对华为云物联网平台的设备通信与控制 本文分享自华为云社区<基于luatos的4G(LTE Cat.1)模组接入华为云物 ...

  9. Android Studio报错--Build failed with an exception.

    错误描述 在代码写好之后,点击运行,会爆出这样的错误,查看日志,发现是Manifest.xml文件爆出来的错误 具体解决 我的错误没有别的版本那么麻烦,就是我建立了Empty Activity之后,我 ...

  10. 声网 VQA:将实时互动中未知的视频画质用户主观体验变可知

    在实时互动场景中,视频画质是影响观众体验的关键指标,但如何实时评价视频的画质一直是个行业难题,需要将未知的视频画质用户主观体验变成可知. 未知的部分往往是最需要攻克的,声网也一直在持续探索符合实时互动 ...