即时通讯系统为什么选择GaussDB(for Redis)?

即时通讯,系统,为什么,选择,gaussdb,for,redis · 浏览次数 : 269

小编点评

## 摘要 **高性能企业级KV数据库选择指南** **主要内容:** * GaussDB(for Redis) 是一个高性能企业级KV数据库,可以用于实现即时通讯系统(IM)的架构。 * IM 系统架构采用读扩散模型,读取操作很轻,写入操作很重,资源消耗相对小一些。 * 写扩散模型读取操作很轻,写入操作很重,资源消耗相对大一些。 * GaussDB(for Redis) 对数据进行分片,在故障场景下可以自动进行接管,最多可以满足N-1个计算节点故障。 * im系统对可用性的要求,客户端程序可以通过ELB接入GaussDB(for Redis)实例,实现自动负载均衡。 * GaussDB(for Redis) 支持突发的高流量、大量的历史消息数据处理。 **痛点:** * 高斯Redis开源版本可靠性差,甚至丢数据,会直接导致IM系统瘫痪。 * 大流量、高并发场景如何支持连接管理? **解决方案:** * 使用GaussDB(for Redis) 来实现一个简单的IM应用。 * 采用先进的存算分离架构,在IM系统持续运营的过程中,如果出现突发流量,可以迅速对计算层资源进行秒级扩缩容;历史消息持续增长时,也可以单独对存储层资源大小进行秒级动态调整,最高可扩容至PB级。

正文

摘要:如果你需要一款稳定可靠的高性能企业级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)?相似的内容:

即时通讯系统为什么选择GaussDB(for Redis)?

摘要:如果你需要一款稳定可靠的高性能企业级KV数据库,不妨试试GaussDB(for Redis)。 每当网络上爆出热点新闻,混迹于各个社交媒体的小伙伴们全都开启了讨论模式。一条消息的产生是如何在群聊中传递的呢?让我们一起来探索即时通讯系统(IM)的原理。 IM系统架构的原理 当你在群聊“相亲相爱一

[转帖]linux下/proc/sysrq-trigger详解

/proc/sysrq-trigger详解 这是一组“魔术组合键”,只要内核没有被完全锁住,不管内核在做什么事情,使用这些组合键能即时打印出内核的信息。 使用SysRq组合键是了解系统目前运行情况的最佳方式。如果系统出现挂起的情况或在诊断一些和内核相关,比较怪异,比较难重现的问题的时候,使用SysR

火山引擎ByteHouse:OLAP如何支持超高QPS点查?

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 在当今高速发展的互联网时代,信息传播迅速,用户数量激增。在面对如此庞大的用户群体和高频的访问需求时,系统高并发访问的性能问题成为了无法回避的挑战。为了满足业务场景中对数据并发查询的即时性和准确性要求,越来越多的企业

[转帖]JVM系列之:关于即时编译器的那些事

本文为《深入学习 JVM 系列》第十六篇文章 我们在前文学习 Java 是如何执行的这篇文章中有提及即时编译器,这是一项用来提升应用程序运行效率的技术。通常而言,代码会先被 Java 虚拟机解释执行,之后反复执行的热点代码则会被即时编译成为机器码,直接运行在底层硬件之上。 那么问题来了,既然在 Ho

[转帖]JVM系列之:关于逃逸分析的学习

本文为《深入学习 JVM 系列》第十九篇文章 上文讲解完方法内联后,JIT 即时编译还有一个最前沿的优化技术:逃逸分析(Escape Analysis) 。废话少说,我们直接步入正题吧。 逃逸分析 首先我们需要知道,逃逸分析并不是直接的优化手段,而是通过动态分析对象的作用域,为其它优化手段提供依据的

GGTalk 开源即时通讯系统源码剖析之:聊天消息防错漏机制

GGTalk 内部实现了多种机制以确保消息的可靠性(不会错漏消息和重复消息),那么这些机制具体是怎么实现的了?

[转帖]初步探索GraalVM——云原生时代JVM黑科技

https://baijiahao.baidu.com/s?id=1749705890892955339&wfr=spider&for=pc 1 云原生时代Java语言的困境 经过多年的演进,Java语言的功能和性能都在不断的发展和提高,诸如即时编译器、垃圾回收器等系统都能体现Java语言的优秀,但

初步探索GraalVM——云原生时代JVM黑科技

1 云原生时代Java语言的困境 经过多年的演进,Java语言的功能和性能都在不断的发展和提高,诸如即时编译器、垃圾回收器等系统都能体现Java语言的优秀,但是想要享受这些功能带来的提升都需要一段时间的运行来达到最佳性能,总的来说Java是面向大规模、长时间使用的服务端应用而设计的。 云原生时代,J

颜值经济下,车企的必备武器

摘要:对于买车的你,除了性价比,“颜价比”占多少呢? 新消费需求的冲击 时代赋予新时代年轻人丰富多彩的物质世界,他们受到互联网、即时通讯、智能手机等科技产物的影响很大,这个群体在消费方面既感性又理性,正在逐渐成为消费的主力军。 根据《2020年中国消费者调查报告》,二线及以下城市“年轻购物达人”仅占

文章学习|即时通信的安全加密通信模型研究

> 学习文章:[即时通信的安全加密通信模型研究](https://mp.weixin.qq.com/s/RLmq_yzoUny9_yUpBGzpQA),具体见[原论文](https://kns.cnki.net/kcms2/article/abstract?v=3uoqIhG8C44YLTlOAiT