背景
- 目标:使用多线程消费来自kafka的数据
- 要求:线程数可控制,代码简洁
大致实现思路
- 从Kafka分批拉取数据,每批数据分给多个线程并发处理(此处是公司包装的Kafka调用方式
- 在处理代码中通过阻塞队列获取实际执行处理的对象,交由该对象进行处理,处理完毕后将该对象返回阻塞队列
- 并发控制分为两个部分:
一方面对于封装的Kafka调用可以配置启用处理线程数,每个线程的执行是相对独立的(对于每个包内取出的数据采用平均分配的方式,若包内数据条数少于线程数,则只能启动数据条数个数的处理线程)
另一方面可以使用java阻塞队列来管理用于处理数据的对象,每个对象的使用是对象压入队列与取出的过程是阻塞式的(每个对象只会类似于单例对象,同时只能被一个线程调用,即相当于可以使用阻塞队列来控制可以实际启动的最大处理线程个数)
总之此处其实有三个参数可以控制并发的数量:每次拉取的消息中的数据条数与处理线程个数、初始化的处理对象的个数、阻塞队列的大小。
可能的问题
目前该代码并不由我个人维护,我只是辅助对方完成一些bug的修复工作,也学习到了对于阻塞队列的一些使用方式。
有的地方我个人也还不是很明了,但谈谈个人对于这个程序未来可能存在的问题吧。
- 配置方面:对于实际处理数据过程中的部分配置如处理线程数量等需要进一步的测试工作
- 运行超时\异常:对方实际处理的工作可能面临较大的性能压力或可能需要较多执行时间,这方面可能也要考虑对Kafka消费者的配置优化