ELK系列-(六)Redis也能作为消息队列?(上)
一、前文回顾 🔍
在前面的ELK系列中,我们已经搭建了ELK的核心组件,包括:
- ELK系列-(一)Docker部署ELK核心组件
- ELK系列-(二)LogStash数据处理的瑞士军刀
- ELK系列-(三)Kibana 数据可视化的艺术家
- ELK系列-(四)轻量级的日志收集助手-Beat家族
- ELK系列-(五)指标收集-MetricBeat(上)
- ELK系列-(五)指标收集-MetricBeat(下)
有关整个系统架构的部署,大家可以回顾前面的文章。今天,我们将继续探讨Beats与ElasticSearch的链接-消息队列!🌟
系统架构图 📊
二、Redis介绍
Redis 是一个开源的 内存数据结构存储系统,广泛应用于:
- 🔹 缓存
- 🔹 会话管理
- 🔹 实时分析
它支持多种数据结构,如字符串、哈希、列表、集合和有序集合等。
Redis 不仅仅是一个缓存数据库,它还能灵活地作为消息队列使用!虽然可能不如专业消息队列(如 RabbitMQ、Kafka)功能全面,但在某些特定场景下,尤其是我们的日志场景,它是一个绝佳的选择。由于消息一致性要求不高,丢失一些也无妨,使用 Redis 作为消息队列也是一个不错的选择。
三、为什么选择Redis作为消息队列? 🤔
在我们的架构中,面临着一些独特的挑战 💡:
- 🌐 数台机器在云端(云服务器规格小)
- 💻 数台机器在本地(性能好)
因此,ELK核心组件部署在了本地,我们需要一个 轻量级中间件 来实现数据中转。考虑到:
- Redis 的易用性 ✅
- 我们已经在使用 Redis 作为缓存 ✅
选择复用现有的 Redis 来完成这个任务,简直是再自然不过的决定!
四、Redis如何作为队列?
Redis 提供了多种实现队列的方式,最基础的是使用 List 数据结构,通过 LPUSH/RPUSH 和 LPOP/RPOP 命令实现消息的存取。如果需要延时队列,可以使用 Zset,利用其 score 特性存储执行时间。对于需要发布订阅模式的场景,Redis 提供了 Pub/Sub 机制。在 Redis 5.0 之后,还引入了功能更完善的 Stream 类型,它支持消费确认机制,能更好地保证消息的可靠性。
官方文档
接下来我们将对各种实现方法进行讲解
1. List
Redis 列表是一种简单而高效的数据结构,它以字符串列表的形式存储数据,并按照插入顺序进行排序。通过以下命令,Redis 列表可以轻松实现队列功能:
LPUSH
:从左侧插入数据RPUSH
:从右侧插入数据LPOP
:从左侧弹出数据RPOP
:从右侧弹出数据BLPOP
:阻塞等待直到从左侧弹出数据BRPOP
:阻塞等待直到从右侧弹出数据
这些特性使得 Redis 列表成为实现异步队列的一个简单而有效的选择。
优点:✨ 简单高效
局限性:⚠️
- 消息不可重复消费
- 缺乏主题订阅功能
- 无消费确认机制
2. Zset
有序集合(Zset)在列表的基础上增加了一个 score
属性,这使得它可以存储时间戳等信息,从而实现延迟队列。这种特性在需要定时执行任务或在特定时间后触发操作的场景中非常有用。
优点:⏱️ 支持定时任务
局限性:⚠️
- 消息不可重复消费
- 无法存储重复消息
3. Pub/Sub
Redis 的发布订阅模式提供了一种简单的消息传递机制,允许消息的发布者和订阅者之间进行通信。尽管这种模式非常直观,但也有一些局限性:
局限性:🚨
- 消息不持久化
- 要求消费者实时在线
- 缺乏消费确认机制
4. Stream
Redis 5.0 引入了 Stream 数据类型,它在 Pub/Sub 机制的基础上增加了消费者确认功能,大大减少了消息丢失的概率。Stream 提供了更强大的功能,适合需要更高可靠性的消息队列场景。
特点:🌈
- 支持消费者确认
- 减少消息丢失概率
- 适合高可靠性场景
注意:⚠️ 目前 elastic-beats 系列尚不支持 Stream
完成了理论的准备,在下一篇文章中,我们正式探讨如何在 ELK 架构中具体使用 Redis 消息队列。