Redis 团队为 Redis 5.0引入了新的Streams数据类型。由于 Streams 从第一个角度看起来像 Kafka 主题,因此似乎很难找到使用它的真实示例。
在流介绍中,我们与 Kafka 流进行了比较:
- 运行时消费者组处理。例如,如果三个消费者中的一个永久失败,Redis 将继续服务第一个和第二个,因为现在我们将只有两个逻辑分区(消费者)。
- Redis 流更快。他们从内存中存储和操作,所以这个就是这样。
我们有一些与 Kafka、RabbitMq 和 NATS 相关的项目。现在我们深入研究 Redis 流,尝试将其用作“pre kafka 缓存”,在某些情况下用作 Kafka/NATS 替代方案。现在最关键的一点是复制:
- 使用 AOF 复制将所有数据存储在内存中。
- 默认情况下,异步复制不会保证 XADD 命令或消费者组状态更改被复制:在故障转移之后,可能会丢失某些东西,这取决于追随者从主服务器接收数据的能力。这看起来像是扼杀任何尝试高负载流的兴趣。
- 由 Sentinel 或 Redis Cluster 操作的 Redis 故障转移过程仅执行尽力检查以故障转移到最新的追随者,并且在某些特定故障下可能会提升缺少某些数据的追随者。
还有上限策略。Redis Streams 的真正“上限资源”是内存,因此要存储多少项目或使用哪种上限策略并不那么重要。因此,每次您的消费者失败时,您都会获得峰值内存消耗或因上限而丢失的消息。
我们使用 Kafka 作为 RTB 投标人前端,每秒处理约 1,100,000 条消息,负载约 120 字节。使用 Redis,我们在写入时消耗约 170 mb/秒的内存,使用 512 GB RAM 服务器,我们为约 50 分钟的数据写入“保留”。因此,如果此时处理系统处于脱机状态,我们就会崩溃。
您能否详细介绍一下 Redis Streams 在现实世界中的使用情况,并且在某些情况下您可能会尝试自己使用它?或者可能是 Redis Streams 可以用于少量数据?