跟踪每个分区的值的最佳实践

时间:2019-10-07 20:31:55

标签: java apache-kafka

我正在尝试以相反的顺序读取请求的kafka消息数量。由于存在多个分区,因此我需要跟踪读取的所有偏移量,以便在完成所有操作后停止。有两个步骤,第一步是获取开始偏移量(结束偏移量-请求的消息数量)和结束偏移量。 (偏移不是连续的,存在间隙)。第二步是轮询消息并计数每个分区中的消息,如果不满足请求的消息数,请再次重复第一步和第二步,直到遇到每个分区的消息数为止。

第一步:

当前,我有一个Map<Integer,OffsetValue>,其中的键是分区号,值是一个Java对象(OffsetValue)-startOffset,endOffset。我会寻找从开始偏移开始消耗的分区。

第二步:

现在这是我开始轮询请求的消息数量时出现的问题。假设用户希望每个分区有10条消息。我使用哈希图来跟踪每个分区读取的消息。

条件

初始轮询可能不会返回任何记录,因此请继续轮询。 当达到每个分区的结束偏移量时停止轮询,否则轮询不返回任何结果。 检查每个分区,以读取与请求的消息相同的消息。如果是,则标记为完成,如果没有,则标记为继续并重复步骤

问题:

我如何增强以下逻辑,以了解已为每个分区读取了所有消息并退出循环?如果有帮助,每个分区中的消息将按顺序排列。我们知道每个分区中消息的上限(在我们的示例中为10)。因此,我需要一些逻辑来使用offsetMap知道我已经到达结束偏移量并跟踪并针对所有分区重复此操作,然后退出循环。

 List<KafkaRecord> messages = new ArrayList<>();
 Map<Integer,Integer> messagesReadMap= new HashMap<>();
 Map<Integer,OffsetValue> offsetMap = getOffsetMap();
 while(true){
    List<KafkaRecord> kafkaRecords = pollKafka();// will poll from all partitions from the set start offset
    for(KafkaRecord kafkaRecord: kafkaRecords) {// read the messages and process
      OffsetValue offset = offsetMap.get(kafkaRecord.partition);
      if(kafkaRecord.offset < offset.endOffset) {// this is needed to make sure we are not processing messages past the set end offset
       //Add code here to track the messages read in each partition. Once we have have 10 messages for each partition or reached the end offset for that partition we can exit the loop and return the messages.
         messagesReadMap.merge(kafkaRecord.partition,1,(a,b)->a+b);
         messages.add(kafkaRecord);
      }
 }

请问我是否需要更多信息。让我知道是否有更好的方法来解决该问题。

0 个答案:

没有答案