概要: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
网友评论