乐趣区

关于数据库:华为云PB级数据库GaussDBfor-Redis解析第二期Redis消息队列Stream的应用探讨

摘要:本文将对 Stream 的常用命令和利用场景进行介绍,并探讨原生 Redis Stream 音讯队列的缺点以及 GaussDB(for Redis)提供的解决方案,供大家学习和选用。

华为云高斯 Redis 团队欢送各路英才退出,分割邮箱:yuwenlong4@huawei.com

引言 :Redis Stream 是 Redis 5.0 引入的一种新的数据类型,其本质是一个音讯队列,相似于 kafka 等消息中间件。它提供了音讯的落地存储性能,并实现了相似 kafka 生产组和消费者的性能。与 kafka 相比,Redis Stream 同样领有弱小的性能,但因原生 Redis 无奈无效反对大规模数据存储,老本低廉,并存在数据失落 / 不统一危险等起因,导致其未能流行起来。本文将对 Stream 的常用命令和利用场景进行介绍,并探讨原生 Redis Stream 音讯队列的缺点以及 GaussDB(for Redis) 提供的解决方案,供大家学习和选用。

一、Redis Stream 简介

与 Pub/Sub 相比,Redis Stream 具备音讯的落地存储性能,每一个客户端能拜访任意时刻的音讯,并且能记录每一个客户端的拜访地位,还能保障音讯不会失落。Redis Stream 的构造如下所示,它有一个音讯链表,将所有退出的音讯都链接起来,每个音讯都有惟一的 ID 和对应的内容。

如图所示,每一个 Stream 队列蕴含多条音讯,每条音讯由惟一的 ID 进行标识,由工夫戳和序列号组成,例如 1627849609889-0。每条音讯以追加的形式增加到 Stream 队列中。同一个 Stream 队列能够蕴含多个生产组(Consumer Group),每个生产组的状态都是独立的,同一个 Stream 队列的音讯能够被多个生产组反复生产。

同一个生产组又蕴含多个消费者(Consumer),这些消费者之间是竞争关系,不同消费者不会反复生产同一条音讯,任意一个消费者读取了队列中的一条音讯都会使生产组中的游标 last_delivered_id 往前挪动。该形式进步了并发效率,例如,多个过程并发解决 Stream 队列中的音讯。每个消费者中维持一个状态变量 pending_ids,简称为 PEL(Pending Entries List),记录了以后曾经被客户端读取的但尚未被 ACK 的音讯,确保音讯被客户端胜利生产。

Redis Stream 命令能够分为音讯队列命令和消费者命令两类,如下所示:

以即时通讯中的聊天室场景为例,应用 Redis Stream 作为中间件,实现聊天室的发言以及信息查看。

1)应用 XADD 命令进行发言。

2)应用 XLEN 命令获取聊天室发言的数量。

3)应用 XRANGE 获取音讯队列的音讯。

4)应用 XREAD 命令读取音讯。能够在不设置生产组和消费者的状况下,应用 XREAD 的命令进行音讯读取,此时 Stream 队列相似于一个一般的列表(list)。

更多的 Redis Stream 命令应用请参考官网文档(https://redis.io/commands/xread)。

二、利用场景

因为 Redis Stream 人造有序,特地适宜存储时序数据,利用场景包含即时通讯、智慧医疗、流量削峰、智慧城市等畛域。

1)即时通讯:微信、QQ 等是咱们日常生活中罕用的通信软件,罕用的聊天形式蕴含点对点通信和群聊两种形式。下图是一个群聊的模型图,当采纳 Redis Stream 作为通信的中间件,创立一个群聊时,在 Redis 中对应地为该群聊创立一个 Stream 队列。在发送音讯时,将每个用户的音讯依照工夫程序增加到 Stream 队列中,保障了音讯的有序性。因为 Stream 是一个长久化的队列,无论是在线还是离线状态,每个用户能够屡次查看历史音讯,保障了通信的完整性。

(2)智慧医疗:医疗行业的信息化,能够更好地服务于每一个人。为每一个人从出世起建设一份衰弱档案,记录相应的衰弱信息,如体检报告、诊断报告、用药信息、以及智能终端实时上传的衰弱指标。这些信息都是一些时序数据,同样能够采纳 Redis Stream 来实现智慧医疗系统。建设起智慧医疗系统后,应用终端能够查看所有的医疗信息,并会提醒患者按时吃药,在终端上传身材指标异样时,会主动报警并预约挂号。现阶段每个医院都有本人的信息系统,不同的医院很难查到同一个患者的医疗信息,在将来,医疗上云将有利于解决医疗信息孤岛,更好的帮忙每一位患者。

(3)流量削峰:在常见的秒杀流动或团购中,如春运抢票、商城促销等,通常短时间内有大量的流量,导致系统解体。因为每一个用户在申请时对应惟一的工夫戳,所有的申请都有一个先后顺序,同样能够采纳 Redis Stream 作为中间件,将申请退出到 Redis Stream 音讯队列。将音讯转存到音讯队列间接提供给利用,而非间接发送给利用,能够避免大流量冲击导致的零碎解体。当音讯队列中的申请数量达到规定的最大值时,间接回复客户端抢购失败。

三、原生 Redis 是否真的实用于以上场景?

如上利用场景具备数据规模大、数据持续增长的特点,尽管原生 Redis 有良好的设计初衷,然而并不能解决理论问题。具体体现在:

  1. 无奈有效应对大规模数据:原生 Redis 是一个基于内存的数据库,单个节点存储容量无限,当扩大至 TB 级别的集群,将会呈现治理艰难,运维老本低等问题。
  2. 集群扩容影响业务性能:原生 Redis 在进行集群扩容时,须要从新划分 hash 槽并进行数据迁徙,必定会影响业务性能。
  3. 数据可能会失落:原生 Redis 尽管能够采纳 RDB 和 AOF 的形式对数据进行长久化,然而并不会实时地将每一条命令写入到硬盘中,当呈现掉电或集群解体的状况,必定会失落一部分数据,对于相似智慧医疗场景,是难以忍受的。

除此以外,必须思考数据库系统的可用性、数据一致性、老本和备份恢复能力等状况:

  1. 可用性:原生 Redis 若采纳一主一备的集群模式,当一对主备节点下线,集群局部数据将不可用。
  2. 数据一致性:当主节点宕机,主备节点切换,数据存在没有齐全同步的状况。
  3. 老本:原生 Redis 是一种内存型数据库,当内存容量扩大至 TB 级别,老本将十分低廉。
  4. 备份复原:须要人工连贯数据库执行 SAVE 或 BGSAVE 命令,不能反对定期主动备份,在复原到新实例时须要手动拷贝备份数据。

四、是否有更好的解决方案?

在以上场景中,亟需一种可能存储和解决大规模 Stream 数据、鲁棒性强、且老本低廉的数据库系统。而 GaussDB(for Redis)(下文简称 高斯Redis)正是以上场景中一种很好的利用解决方案。高斯 Redis 是华为云数据库团队自主研发的兼容 Redis 协定的云原生数据库,该数据库冲破原生 Redis 的内存限度,可轻松扩大至 PB 级存储,具备秒扩容、超可用、强统一和低成本等特点。

五、总结

Redis Stream 能够广泛应用在即时通讯、智慧医疗、流量削峰等畛域。在面对大规模的 Stream 数据时,原生 Redis 存在老本过高、容量太小、可用性差、数据不统一等问题,无奈实用于海量音讯队列的场景。与原生 Redis 相比,高斯 Redis 具备海量存储,低成本,可长久化等长处,可做为比原生 Redis 更现实的 Stream 队列承载计划。

附:参考资料

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

www.modb.pro/db/42739

  1. 《一场由 fork 引发的超时,让咱们从新探讨了 Redis 的抖动问题》

bbs.huaweicloud.com/blogs/22752…

  1. 《当 Redis 遇见计算存储拆散》

developer.huaweicloud.com/hero/forum/…

  1. 《GaussDB(for Redis)与原生 Redis 的性能比照》

bbs.huaweicloud.com/blogs/23694…

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

bbs.huaweicloud.com/blogs/23858…

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

退出移动版