KafkaConsumer实现多线程消费的一种实现思路——不考虑消息的顺序性问题基础

背景介绍

一种Kafka多线程消费的实现思路以及方案,此方案不考虑消息消费的顺序性问题,假定消息之间没有依赖关系。

这个项目是公司里面开发有个SDK的所谓”飞行窗口“特性产生的需求,主要是为了保证消费者拉取的消息可以异步交由线程池执行,同时又不触发线程池的拒绝策略。

目前我的组长使用了他自己的认为好的方案,这套实现基本没人用,想着不能浪费,所以就提供了出来啦,当然把有些敏感信息都摘掉了,测试什么的做的不是很完善,所以大家想用的话可以参考,不承担任何责任哈。

实现思路

基本实现是前端由一个单线程去执行循环poll拉取数据,然后异步发送到线程池去执行,同时在发送时提供一个最大执行窗口的信号量来控制提交;

所以分区提交的offset交由后台的一个单独提交线程去执行;

由于线程的乱序执行,同时,kafka消息偏移量的一维概念,所以目前能保证的是尽量不重复消费,同时只提交已经完成的最小偏移量,而不是最大,

所以提交线程里面维护了一个待提交偏移量的队列,每个偏移量简单的做了层包装,实现了一个小的状态机。

中间还包括Rebalance的处理,以及关闭时的优雅处理等。

基本的运行时架构如下图,设计上还是比较简单的。

 

 代码地址

https://github.com/MarshWinter/kafka-multithread-consume

 

posted @ 2022-10-17 14:52  MarshWinter  阅读(787)  评论(0编辑  收藏  举报