(8)Kafka怎么体现消息顺序性

2021-02-27  本文已影响0人  hedgehog1112

概要:2:方案1、2、3,消费多线程只串行,有点鸡肋了

一、Kafka只能保证分区内消息顺序有序,无法保证全局有序

生产者:通过分区leader顺序写入,保证顺序性

消费者:同分区只能被一个group里一个消费者消费

消息发不同分区,分区间顺序是无法保证的

二、如何做到并发且全局有序?

解题思路:1)发送端 或 消费端并发,多线程发送或消费

                  2)一个分区,或按顺序发送到多个分区 原顺序消费

整体思路:顺序发送到同一分区增加生产/消费者并发度

方案1

topic一个分区多线程生产消费

实现简单,但有热点瓶颈问题

方案2

多个分区,数据发送到  同一分区,多线程消费

优点:多分区,分摊非同类数据压力

弊端:相同业务同一分区,热点瓶颈

方案3

多分区,数据发送  不同分区,按发送分区顺序消费,线程发送和消费

步骤:多线程生产,按分区号大小,依次发送,相同数量大小数据,按分区号顺序消费

缺点:消费性能极大下降无法真正并发

4、多线程消费能保证顺序消费吗

1)发:1消息入给A线程、2给B、3给C

2):A拿1、B拿2、C拿3

3)比较:全部拿到才可下一步,比较id满足MA<MB<MC

4)入库:按线程顺序M1、M2、M3,通过join、CounDownLatch、Executors.SingleThreadExecutor等实现线程串行执行

实际来说,不可能 分区并发有序,消费多线程只串行,有点鸡肋了

三、最优方案:加队列

一个 topic,一个 partition,一个 consumer,内部单线程消费,吞吐量低,一般不用

N 个内存 queue,相同 key 同一 queue;N 个线程,分别消费queue,保证顺序性

四、Kafka顺序性应用

采集用户访问 轨迹,重写分区器把用户id作为分区键,用户访问埋点记录按顺序到一个分区有序消费

https://blog.csdn.net/jacksonking/article/details/107458383

https://www.cnblogs.com/windpoplar/p/10747696.html

上一篇 下一篇

猜你喜欢

热点阅读