在从Kafka主题中消耗掉所有可用消息后,如何返回包含消息列表的未来?

时间:2017-03-06 23:33:52

标签: scala akka apache-kafka akka-stream akka-kafka

我可能忽略了卡夫卡消费者的观点,但我想做的是:

消费者订阅主题,抓取主题中的所有消息并返回带有所有这些消息列表的Future

我试图完成此操作的代码是

val sink = Sink.fold[List[KafkaMessage], KafkaMessage](List[KafkaMessage]()) { (list, kafkaMessage) =>
list :+ kafkaMessage
}

def consume(topic: String) =
Consumer.committableSource(consumerSettings, Subscriptions.topics(topic))
  .map { message =>
    logger.info(s"Consuming ${message.record.value}")
    KafkaMessage(Some(message.record.key()), Some(message.record.value()))
  }
  .buffer(bufferSize, overflowStrategy)
  .runWith(sink)

未来永远不会返回,它会消耗必要的消息,然后继续反复轮询该主题。有没有办法返回Future然后关闭消费者?

1 个答案:

答案 0 :(得分:1)

由于Kafka用于流数据,因此不存在“所有消息”,因为新数据可以随时附加到主题。

我想,你可以做两件事:

  1. 检查上一个poll返回的记录数,并终止或
  2. 您需要通过endOffsets获取“当前日志结束”并将其与每个分区的最新记录的偏移量进行比较。如果两者都匹配,则可以返回。
  3. 第一种方法更简单,但可能有缺点,它不如第二种方法可靠。从理论上讲,即使有可用的记录,民意调查也可以返回零记录(即使这种情况发生的变化不是很高)。

    不确定,如何在Scala中表达这种终止条件(因为我对Scala不是很熟悉)。