kafka topic迁移方案及过程记录(待整理)

kafka的topic如果一开始没有做合理拆分,在业务不断膨胀的情况下,容易产生消息堆积,问题难以定位排查。以下是几种不同情况下做拆分或迁移的方案
一、发送者不变、topic不变、新增consumer group
二、新增发送者、从原topic拆出部分消息作为新topic、consumer group不变
三、新增发送者、从原topic拆出部分消息作为新topic、新增consumer group
四、新增发送者、从原topic拆出部分消息作为新topic、旧topic消息不变
这种场景是最混乱的,新旧topic同时存在,生产者也是分开的,意味着消息体无法保证完全一致(时间戳),同时产生两份消息,而上线期间新旧消费者也同时存在,需要避免重复消费和乱序消费。
这种场景,通常存在于一个topic多方在消费,而只新增新的一个topic希望拆分出某个服务下的独立topic和消费者。旧topic不能动。所以是不能停止旧生产者的。
我的思路是,新旧消费者一定要以某种方式区分开彼此必须消费对方不消费的key,为什么是key呢,因为key相同可以保证是同一状态序列的对象,比如同一个订单的key是相同的订单号,发到同一个partition从而避免消费顺序错乱。并且一段时间后新消费者自动消费全部消息,旧消费者不再消费任何消息,实现新服务上线的自动切换。
要实现这种思路,我的第一个想法就是使用时间戳区分。发送消息的时候携带订单创建时间时间戳。新旧消费者同时加一段逻辑,当时间戳为空或者小于上线后的某个时间点a,旧消费者消费消息。时间戳存在且大于等于a则旧消费者不消费、新消费者消费消息。时间点a是静态的,与机器时间无关。
细节是:旧消费逻辑加一个开关,如果开关开且大于a则旧消费者不消费。出现问题可以回滚开关
上线期间,先上线旧消费者,稳定消费后上线新消费者,新消费者无流量。如果新旧消费者在一个服务里也没有关系。此时是时间戳为空,旧消费者稳定消费消息。
再上线新生产者,新旧生产者如果在同一个服务也没关系。此时现象是由于时间点在a之前,因此只有创建时间小于a的数据,旧消费者稳定消费消息,新消费者丢弃消息。
当时间点大于a后,新消费者开始消费,新旧消费者同时有消息在消费。旧消费者仅消费订单创建时间小于a的消息,新消费者仅消费订单创建时间大于等于a的消息,旧消费者消费的消息新消费者绝不会消费,新消费者消费的消息旧消费者绝不会消费,数据是根据创建时间也即id(key)天然隔离的。
当创建时间小于a的消息完全终态后,旧消费者只丢弃消息,新消费者消费全部消息。旧消费者可以下线。
线上稳定运行后,新消费者可以去掉判断逻辑。
这种方案,需要可以在新旧消息体中添加创建时间字段,且数据必须具有创建时间这一属性。

序号动作状态
1上线旧消费者,当创建时间时间戳为空或者小于上线后的某个时间点a,旧消费者消费消息时间戳为空,旧消费者稳定消费
2上线新消费者旧消费者稳定消费消息,新消费者无流量
3上线旧生产者,携带时间戳旧消费者稳定消费消息,新消费者无流量
4上线新生产者,携带时间戳旧消费者稳定消费消息,新消费者丢弃消息
5时间点a到来之前旧消费者稳定消费消息,新消费者丢弃消息
6时间点a之后旧消费者仅消费订单创建时间小于a的订单,新消费者仅消费订单创建时间大于等于a的订单
7创建时间小于a的订单消息全部消费完成后旧消费者只丢弃消息,新消费者消费全部消息
8旧消费者下线新消费者稳定消费全部消息,旧topic稳定发送给其它需要旧消息的消费者
9新消费者端去掉判断逻辑新消费者稳定消费全部消息

五、新增发送者、旧发送者下线、新增topic

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/12673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

监控和可观察性在 DevOps 中的作用!

在不断发展的DevOps世界中,深入了解系统行为、诊断问题和提高整体性能的能力是首要任务之一。监控和可观察性是促进这一过程的两个关键概念,为系统的健康状况和性能提供有价值的可见性。虽然这些术语经常互换使用,但它们代表了理解和管理复杂…

c++网络编程

网络编程模型 c/s 模型:客户端服务器模型b/s 模型:浏览器服务器模型1.tcp网络流程 服务器流程: 1.创建套接字2.完善服务器网络信息结构体3.绑定服务器网络信息结构体4.让服务器处于监听状态5.accept阻塞等待客户端连接信号6.收发数据7.关闭套…

Appium+python自动化(二十八)- 高级滑动(超详解)

高级溜冰的滑动 滑动操作一般是两点之间的滑动,这种滑动在这里称其为低级的溜冰滑动;就是上一节给小伙伴们分享的。然而实际使用过程中用户可能要进行一些多点连续滑动操作。如九宫格滑动操作,连续拖动图片移动等场景。那么这种高级绚丽的溜…

【node.js】04-模块化

目录 一、什么是模块化 二、node.js中的模块化 1. node.js中模块的分类 2. 加载模块 3. node.js 中的模块作用域 4. 向外共享模块作用域中的成员 4.1 module对象 4.2 module.exports 对象 4.3 exports对象 5. node.js 中的模块化规范 一、什么是模块化 模块化是指解…

Kafka中的主题(Topic)和分区(Partition)是什么?它们之间有什么关系?

在Kafka中,主题(Topic)和分区(Partition)都是用于组织和存储消息的概念,它们有密切的关系。 主题(Topic):主题是消息的逻辑分类。可以将主题理解为一个逻辑上的消息容器&…

使用python库uvicorn替代Nginx发布Vue3项目

目录 一、Vue3项目打包 二、将打包文件放到python项目 三、配置uvicorn服务 四、启动服务 【SpringBoot版传送门:使用SpringBoot替代Nginx发布Vue3项目_苍穹之跃的博客-CSDN博客】 一、Vue3项目打包 (博主vue版本:3.2.44) 由…

Android平台GB28181设备接入侧如何同时对外输出RTSP流?

技术背景 GB28181的应用场景非常广泛,如公共安全、交通管理、企业安全、教育、医疗等众多领域,细分场景可用于如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、生产运输、车载终…

2023年自然语言处理与信息检索国际会议(ECNLPIR 2023) | EI Compendex, Scopus双检索

会议简介 Brief Introduction 2023年自然语言处理与信息检索国际会议(ECNLPIR 2023) 会议时间:2023年9月22日-24日 召开地点:中国杭州 大会官网:ECNLPIR 2023-2023 Eurasian Conference on Natural Language Processing and Information Retr…

【Linux】进程通信 — 管道

文章目录 📖 前言1. 通信背景1.1 进程通信的目的:1.2 管道的引入: 2. 匿名管道2.1 匿名管道的原理:2.2 匿名管道的创建:2.3 父子进程通信:2.3.1 read()阻塞等待 2.4 父进程给子进程派发任务:2.5…

Kafka的消息传递模型是什么?

Kafka的消息传递模型采用了发布-订阅模式。它使用了一种分布式的提交日志(commit log)结构来持久化消息,并将消息以主题(topic)的方式进行组织和分类。在这个模型中,消息会被发布到一个或多个主题&#xff…

使用adb通过电脑给安卓设备安装apk文件

最近碰到要在开发板上安装软件的问题,由于是开发板上的安卓系统没有解析apk文件的工具,所以无法通过直接打开apk文件来安装软件。因此查询各种资料后发现可以使用adb工具,这样一来可以在电脑上给安卓设备安装软件。 ADB 就是连接 Android 手…

NFT市场泡沫破裂了吗?投资NFT是否仍然安全?

近期,NFT市场的价格出现了明显的下跌趋势,许多人开始担心NFT市场是否已经进入了泡沫破裂的阶段。但是,我们需要认真分析这个问题,并且探讨投资NFT是否仍然安全。 NFT(Non-Fungible Token)是一种非同质化代币…

LeetCode 436. Find Right Interval【排序,二分;双指针,莫队】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

perl GetOptions

在Perl中,你可以使用标准模块Getopt::Long来解析命令行选项(Command Line Options)。Getopt::Long模块允许你定义命令行选项以及它们的值,并且还可以处理各种类型的选项,如标志选项(flag options&#xff0…

算法竞赛入门【码蹄集新手村600题】(MT1060-1080)

算法竞赛入门【码蹄集新手村600题】(MT1060-1080) 目录MT1061 圆锥体的体积MT1062 圆锥体表面积MT1063 立方体的体积MT1064 立方体的表面积MT1065 长方体的表面积MT1066 射线MT1067 线段MT1068 直线切平面MT1069 圆切平面MT1070 随机数的游戏MT1071 计算表达式的值M…

网络防御之IDS

1. 什么是IDS? IDS是入侵检测系统,一种对于网络传输进行及时监视,在发现可疑的传输时发出警报或者采取主动反应措施的网络安全设备。IDS是一种积极地主动的防御技术。 2. IDS和防火墙有什么不同? 防火墙是一种隔离并过滤非授权用…

Leetcode-每日一题【剑指 Offer II 075. 数组相对排序】

题目 给定两个数组,arr1 和 arr2, arr2 中的元素各不相同 arr2 中的每个元素都出现在 arr1 中 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 示例&…

EtherNet/IP转CAN网关can协议标准

生产管理设备中,会有设备与其他设备的协议不同,数据无法互通,让你的工作陷入困境。这时,一款神奇的产品出现了——远创智控YC-EIP-CAN通讯网关! 1, 这款通讯网关采用ETHERNET/IP从站功能,可以将各种CAN总线…

Lambda表达式

Java Lambda表达式是Java 8中最重要的新特性之一。 它们是一种可传递的匿名函数,可以作为参数传递给方法或存储在变量中,因此可以在需要的时候调用它们。 基础 1. 简介 Lambda表达式的主要目的是简化Java代码,使其更易于阅读和编写。 Lam…

【业务功能篇58】Springboot + Spring Security 权限管理 【中篇】

4.2.3 认证 4.2.3.1 什么是认证(Authentication) 通俗地讲就是验证当前用户的身份,证明“你是你自己”(比如:你每天上下班打卡,都需要通过指纹打卡,当你的指纹和系统里录入的指纹相匹配时&…