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

发表于: 2019-07-30   最后更新时间: 2019-07-30  

问题描述 :

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

想要达到的目标:

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

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

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

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

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



您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容





发表于: 24天前   最后更新时间: 24天前   游览量:101
上一条: kafka berberos报错?
下一条: kafka 2.11-2.1.1 java.lang.OutOfMemoryError: Direct buffer memory 如何处理

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

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

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