注册的空间网站,创建一个网站的一般步骤要点,中国货源网一件代发,想做网站kafka的topic如果一开始没有做合理拆分#xff0c;在业务不断膨胀的情况下#xff0c;容易产生消息堆积#xff0c;问题难以定位排查。以下是几种不同情况下做拆分或迁移的方案 一、发送者不变、topic不变、新增consumer group 二、新增发送者、从原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的消息旧消费者消费的消息新消费者绝不会消费新消费者消费的消息旧消费者绝不会消费数据是根据创建时间也即idkey天然隔离的。 当创建时间小于a的消息完全终态后旧消费者只丢弃消息新消费者消费全部消息。旧消费者可以下线。 线上稳定运行后新消费者可以去掉判断逻辑。 这种方案需要可以在新旧消息体中添加创建时间字段且数据必须具有创建时间这一属性。
序号动作状态1上线旧消费者当创建时间时间戳为空或者小于上线后的某个时间点a旧消费者消费消息时间戳为空旧消费者稳定消费2上线新消费者旧消费者稳定消费消息新消费者无流量3上线旧生产者携带时间戳旧消费者稳定消费消息新消费者无流量4上线新生产者携带时间戳旧消费者稳定消费消息新消费者丢弃消息5时间点a到来之前旧消费者稳定消费消息新消费者丢弃消息6时间点a之后旧消费者仅消费订单创建时间小于a的订单新消费者仅消费订单创建时间大于等于a的订单7创建时间小于a的订单消息全部消费完成后旧消费者只丢弃消息新消费者消费全部消息8旧消费者下线新消费者稳定消费全部消息旧topic稳定发送给其它需要旧消息的消费者9新消费者端去掉判断逻辑新消费者稳定消费全部消息
五、新增发送者、旧发送者下线、新增topic