Kafka多线程多分区消费顺序错乱问题

发表于: 2019-07-30   最后更新时间: 2019-07-30 19:29:51   4,555 游览

问题描述 :

目前kafka生产端有30个分区,采用30个线程去消费,消息消费过程中,没有按照预想的顺序,
即 : 后面推送的数据被先消费, 导致最终得到的数据结果不够准确,因为我们的业务场景对顺序要求非常严格,所以顺序问题必须得到保障

想要达到的目标:

每一个线程,只消费这一个分区的数据,这个分区没有数据,线程就进行等待,直到数据过来

已经尝试或者测验过的方案有以下几种:

  1. 极端情形 : 采用单线程,单分区 数据一致性得到保证,但消费速度完全不能满足需求,造成大量数据堆积
  2. 多线程,多分区,但只往一个分区发送数据(测试) 测试结果符合预期, 即该分区的数据仅有一个线程消费
  3. 自定义分区 ; 采用自定义分区, 把一笔交易所有的数据发送到同一个分区,(该分区的数据有序)

测试结果 : 数据一致性问题有所改善, 但仍然存在这样的问题 : 同一笔交易经验证所有数据落在同一分区,但消费的时候不是同一个线程消费,依然会存在顺序错乱导致数据不一致的问题

请问,我该怎么彻底解决这个问题,或者有什么好的建议?

发表于 2019-07-30
添加评论

你的问题,我清楚,你的困扰我也清楚。kafka的顺序保证我想你也很清楚了。
剩下就是消息顺序的给到了你,而你的消费者直接new出线程去消费,但是,这时候出现了虽然线程new出的比上一个晚,但是有可能上一个先执行的问题。

你的业务有很强的耦合性,你上面的那几种方式都是无法使用多线程来处理。

-> 半兽人 5年前

感谢博主分享这么宝贵的经验, 关于之前反应的问题,现在已经得到解决了, 之前遇到问题是采用的多线程消费方式为java线程池, 在打印日志的时候发现,一个线程会消费多个分区的数据, 后面摒弃了这种做法,尝试着使用SpringBoot提供的Kafka异步消费方式, 发现一个分区的所有数据仅由一个线程来消费,目前改进后的程序在实时处理时数据一致性得到了保证.

张乘辉 -> 4年前

你可以使用多线程消费时,采用内存队列,一条线程对应一个内存队列,将相同key的消息发往同一个内存队列中,这样可以确保多线程顺序消费了
但其实kafka无法保证严格的消费顺序,具体原因可以看下我写的一篇博客分析:
https://mp.weixin.qq.com/s/BaRAbk5Zeg9VhCQlhg6ACA

你的答案

查看kafka相关的其他问题或提一个您自己的问题