KafkaConsumer实现多线程消费的一种实现思路——不考虑消息的顺序性问题基础
背景介绍
一种Kafka多线程消费的实现思路以及方案,此方案不考虑消息消费的顺序性问题,假定消息之间没有依赖关系。
这个项目是公司里面开发有个SDK的所谓”飞行窗口“特性产生的需求,主要是为了保证消费者拉取的消息可以异步交由线程池执行,同时又不触发线程池的拒绝策略。
目前我的组长使用了他自己的认为好的方案,这套实现基本没人用,想着不能浪费,所以就提供了出来啦,当然把有些敏感信息都摘掉了,测试什么的做的不是很完善,所以大家想用的话可以参考,不承担任何责任哈。
实现思路
基本实现是前端由一个单线程去执行循环poll拉取数据,然后异步发送到线程池去执行,同时在发送时提供一个最大执行窗口的信号量来控制提交;
所以分区提交的offset交由后台的一个单独提交线程去执行;
由于线程的乱序执行,同时,kafka消息偏移量的一维概念,所以目前能保证的是尽量不重复消费,同时只提交已经完成的最小偏移量,而不是最大,
所以提交线程里面维护了一个待提交偏移量的队列,每个偏移量简单的做了层包装,实现了一个小的状态机。
中间还包括Rebalance的处理,以及关闭时的优雅处理等。
基本的运行时架构如下图,设计上还是比较简单的。
代码地址
https://github.com/MarshWinter/kafka-multithread-consume