【发布时间】:2019-03-30 10:07:33
【问题描述】:
Redis 团队为 Redis 5.0 引入了新的 Streams 数据类型。由于 Streams 乍看之下看起来像 Kafka 主题,因此似乎很难找到使用它的真实示例。
在streams intro 中我们与 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/sec 的内存,使用 512 GB RAM 服务器,我们为约 50 分钟的数据写入“保留”。因此,如果此时处理系统处于脱机状态,我们就会崩溃。
您能否详细介绍一下 Redis Streams 在现实世界中的使用情况,并且在某些情况下您可能会尝试自己使用它?或者可能是 Redis Streams 可以用于少量数据?
【问题讨论】:
-
我一直在玩Redis Streams,是的,在某些情况下可以替换Kafka/RabbitMQ。尤其是当性能比数据持久性更重要时。我正在维护一个存储库以在由 Redis Streams 支持的 NodeJS 上实现总线:hfxbus
标签: redis redis-streams