如何在生产环境平滑迁移Redis发布订阅到Kafka_通过双写策略平稳过渡

浅静大大_4406

浅静大大_4406

2026-05-29

693人浏览

原创

不推荐用双写策略将 redis pub/sub 迁移至 kafka,因其语义本质不同:pub/sub 是无状态广播,kafka 是有状态日志系统;双写会加剧不一致、时序混乱与消费模型错配。应采用“功能替代+渐进切换”路径,按场景拆解并逐个替换,同步处理位点、幂等、ack 等关键差异。

如何在生产环境平滑迁移redis发布订阅到kafka_通过双写策略平稳过渡

直接说结论:不推荐用双写策略把 Redis Pub/Sub 平滑迁到 Kafka,因为 Pub/Sub 本身不具备消息可靠性保障能力,双写会放大不一致风险,且无法解决语义差异问题。

Redis Pub/Sub 和 Kafka 的语义根本不同

Pub/Sub 是纯广播、无状态、无持久化的即时通信机制;Kafka 是有分区、有位点、可回溯、带 ACK 的日志型消息系统。两者不是“同一种东西的两个版本”,强行双写等于在两个不同范式之间硬搭桥。

常见错误现象包括:

  • 业务误以为 PUBLISH 成功 = 消息已送达,但实际下游订阅者离线时消息直接丢弃,而 Kafka 中 send() 返回成功仅表示进入 broker 队列,后续可能因 ack 设置不当丢失
  • 双写时序难控制:先写 Kafka 再 PUBLISH,则旧逻辑收不到事件;先 PUBLISH 再写 Kafka,则 Kafka 消息可能重复(因 Pub/Sub 无幂等性保障)
  • 消费模型错配:Pub/Sub 是“所有在线订阅者都收到同一份副本”,Kafka 是“每个 consumer group 独立消费一份流”,迁移后权限、重试、死信逻辑全要重设计

真正可行的过渡路径是“功能替代 + 渐进切换”

不要试图让旧代码同时调用 PUBLISH 和 kafkaProducer.send(),而是按业务场景拆解 Pub/Sub 的实际用途,逐个替换:

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 如果用于实时通知类场景(如订单创建后推送给前端 WebSocket 服务),保留 Redis Pub/Sub,新增 Kafka Topic 仅用于下游异步处理(如风控、积分、日志归档),两者并存,互不干扰
  • 如果用于服务间解耦(如库存扣减后通知物流),停用 PUBLISH,改由原发布方直接发 Kafka,并在消费者端补全幂等和重试逻辑 —— 这才是 Kafka 的正确打开方式
  • 如果用于广播配置变更(如开关刷新),改用 Kafka 的 compact topic + log.cleaner.policy=compact,配合 consumer 使用 seekToBeginning() 实现“启动即同步最新值”

关键参数差异:

  • redisTemplate.convertAndSend("order:created", ...) → 必须替换成 kafkaTemplate.send("order-created-topic", key, value),注意 key 要设为订单 ID 才能保证同一订单路由到同一 partition
  • Kafka 需显式配置 acks=all 和 retries=Integer.MAX_VALUE,否则无法替代 Pub/Sub 的“尽力送达”假象
  • 旧订阅者代码中 MessageListenerAdapter + PatternTopic 要全部下线,改用 @KafkaListener(topics = "order-created-topic", groupId = "inventory-consumer")

最容易被忽略的坑:消费者位点与上线节奏

Pub/Sub 没有 offset,Kafka 有。迁移时若直接切流量,新 Kafka 消费者会从 latest 开始读,导致历史事件全部丢失;若从 earliest 开始读,又可能重复处理已执行过的逻辑。

必须做三件事:

  • 在 Kafka Topic 中预先写入一个 marker 消息(如 {"type":"MIGRATION_START","ts":1748269876}),并在消费者中跳过该 marker 之前的所有消息
  • 旧 Redis 订阅者保持运行至少 72 小时,期间监控 Kafka 消费延迟和业务指标,确认无异常后再下线
  • 所有 Kafka 消费者必须实现基于业务主键的幂等写入(如 MySQL INSERT ... ON DUPLICATE KEY UPDATE 或 Redis SET key value NX EX 300)

真正的平滑不在代码双写,而在业务语义对齐和消费者生命周期管理。Pub/Sub 切 Kafka 不是换一个客户端,而是把“广播喇叭”换成“邮局挂号信”,寄信规则、收件地址、签收回执,全都得重新约定。

相关文章

Kafka Eagle可视化工具
Kafka Eagle可视化工具

Kafka Eagle是一款结合了目前大数据Kafka监控工具的特点,重新研发的一块开源免费的Kafka集群优秀的监控工具。它可以非常方便的监控生产环境中的offset、lag变化、partition分布、owner等,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

redis

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.01.12

2766

5

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

630

5

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

604

5

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

2026.02.04

670

32

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4529

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4075

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

7572

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

643

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

756

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习