高可靠场景下,Kafka 通常在数据持久化和分布式扩展性上优于 Redis Stream,更适合日志聚合与大规模事件流;Redis Stream 胜在运维轻量与内存性能,适合实时性要求高但数据量可控的业务。
先说结论:若业务对消息不丢失要求极高且数据量大,优先选 Kafka;若追求运维简单且能接受内存限制,可选 Redis Stream。
- 适合:Kafka 适合大规模流处理、日志聚合;Redis Stream 适合微服务事件流、轻量 MQ。
- 重点看:持久化机制(Kafka 基于磁盘日志,Redis 基于内存+AOF/RDB)与扩展方式(Kafka 水平扩展,Redis 垂直扩展为主)。
- 别忽略:Kafka 新版本支持 KRaft 模式可降低运维复杂度,Redis Stream 受内存容量限制需配置淘汰策略防止数据丢失。
高可靠核心参数配置
默认配置往往无法满足高可靠要求,生产环境需针对性调整关键参数。
1. Kafka 生产者配置
为确保消息不丢失,生产者需等待所有副本确认。在 producer.properties 或代码配置中:
# 所有副本确认写入成功
acks=all
# 最小同步副本数,防止 ISR 集合只剩 leader 时丢失数据
min.insync.replicas=2
# 重试次数,避免网络波动导致发送失败
retries=32. Redis 持久化与内存策略
Redis 默认配置可能因内存满淘汰数据或 AOF 刷盘策略导致丢失。通过 redis-cli 或配置文件调整:
# 禁止内存满时淘汰数据,避免消息被意外清除
CONFIG SET maxmemory-policy noeviction
# AOF 刷盘策略,everysec 可能丢失秒级数据,always 更安全但性能低
CONFIG SET appendfsync always
# 开启 AOF 持久化
CONFIG SET appendonly yes验证与监控命令
选型后需通过具体命令验证消息积压与消费状态,而非仅看监控面板。
1. Kafka 消费积压查询
使用官方脚本查看消费者组 Lag 情况:
bin/kafka-consumer-groups.sh `--bootstrap-server` localhost:9092 `--describe` `--group` your_group_id重点关注 LAG 列,若持续大于 0 说明消费能力不足。
2. Redis Stream 消费组状态
查看 Stream Pending 消息数及消费者状态:
XINFO GROUPS your_stream_key关注 pending 字段,若数值持续增长说明消费者处理失败或未 ACK。
故障演练与排查
高可靠架构需经得住故障考验,建议定期执行以下演练:
1. 节点宕机模拟
Kafka 场景:手动停止一个 Broker 节点,观察生产者是否报错,消费者是否能自动 rebalance 继续消费。验证 min.insync.replicas 是否生效(若副本不足是否拒绝写入)。
Redis 场景:模拟 Redis 实例重启,验证 AOF 文件是否能完整恢复数据。检查重启后 XINFO STREAM 中的消息数量是否与宕机前一致。
2. 网络分区测试
通过防火墙策略模拟网络抖动,观察 Kafka 生产者重试机制是否触发,Redis 客户端重连策略是否生效。排查日志中是否有大量 "Connection refused" 或 "Timeout" 错误。
常见风险与误区
- Redis 内存爆炸:若未设置
maxmemory-policy noeviction,内存满时默认可能淘汰热点 key 导致消息丢失。需监控内存使用率,设置告警阈值。 - Kafka 运维依赖:传统 Kafka 依赖 Zookeeper 进行集群管理,运维复杂度高且存在单点风险。Kafka 2.8+ 及 3.0+ 版本支持 KRaft 模式,可移除 Zookeeper 依赖,建议新集群优先评估 KRaft。
- 消息顺序误解:Redis Stream 仅在单消费者组内保证顺序,Kafka 仅保证分区内有序。若需全局顺序,需将相关消息路由到同一分区或单分片处理。
- 可靠性错觉:Redis Pub/Sub 模式无投递保证,消费者断连即丢失。高可靠场景务必使用 Stream 数据结构而非 Pub/Sub。
- AOF 数据丢失风险:Redis 采用
appendfsync everysec策略时,宕机可能丢失秒级数据。对数据一致性要求极高的金融场景,建议慎用 Redis 或配置always并接受性能损耗。
参考文档
- Apache Kafka Official Documentation: Configuration
- Redis Official Documentation: Persistence
- Confluent: Kafka vs Redis Streams