基于电商秒杀项目中,关于使用 Kafka 替代 Redis Stream 实现消息队列的技术选型,个人认为主要在于可靠性上进行选择。
- 可靠性
- 持久化 & 故障恢复:Redis Stream 是基于 Redis 自身实现的持久化,具有内存的持久化特征,主要保证的是服务在宕机后能够快速恢复。AOF 虽然能记录每一条指令,但是持久化到磁盘中是根据刷盘策略来决定的,根据
appendfsync策略选择,决定了数据丢失的多少。虽然可以做到零丢失,但是 Redis 作为一个高性能的缓存中间件服务,是不可能牺牲过多的性能来换取绝对的持久化可靠性保证。所以,在消息持久化的可靠性上 Redis 是天然残疾的。
- 投递、消费可靠:Redis Stream 是只提供了消费 ACK 机制,并没有提供投递 ACK 机制,可能会出现投递消息丢失的风险。
除了可靠性外,可用性和性能也是几个可考虑的点。
- 可用性
- Kafka 是天然的分布式架构,Topic、Broker、Partition 的架构能天然而成进行分布式拓展。而 Redis 以单机为主,高可用依赖 Redis Sentinel 或 Cluster。
- 性能
- 性能上,Kafka 基于批量写 + 零拷贝(sendfile)优化能达到百万吞吐量。而 Redis 基于单线程模型和内存压力吞吐量单机为几万 QPS