卡夫卡消费者在它开始时读起来,然后永远挂起

时间:2015-01-12 01:20:19

标签: scala apache-kafka

我已经设置了一个带有1个生产者和1个消费者的Kafka解决方案,并验证所有连接都是正确的(我可以生成消息并使用它们)。 ZK服务器& Kakfa Server已启动且稳定。

如上所述,我的问题是,消费者会很好地阅读消息并从中断消息,但只会读取在开始阅读之前创建的消息。之后,在我杀死消费者并重新启动他之前,不会读取新消息。

相关消费者Scala代码

  val consumer = Consumer.create(new ConsumerConfig(readConsumerPropertiesFromConfig))
  val filterSpec = new Whitelist("some-valid-topic")

  val stream: KafkaStream[String, String] =
    consumer.createMessageStreamsByFilter(filterSpec, 1, new StringDecoder, new StringDecoder).head

  log.info(s"Consumer started. Listening to topics [$filterSpec].")

  def read() = stream map digest

digest采用MessageAndMetadata并享受其乐趣

def digest(messageAndMeta: MessageAndMetadata[String, String]) = {
    log.info(s"processing the message [$messageAndMeta]")

属性

properties.put("group.id", "default_consumer_group")
properties.put("zookeeper.connect", "localhost:2181")
properties.put("auto.offset.reset", "smallest")
properties.put("consumer.timeout.ms", 2000)

我可以用这个

重现的时间表
  • 制作5条消息
  • 启动消费者
  • 消费者阅读5条消息
  • 制作15条消息
  • 消费者忽略新消息并永久挂起
  • 终止并重启消费者
  • 消费者阅读15条消息,并再次永久挂起

有什么想法?感谢。

2 个答案:

答案 0 :(得分:2)

问题是我忽略了一个正在崩溃我的消费者的ConsumerTimeoutException,我把这误认为是消费者永远挂掉"。

来自消费者配置的文档:

  

默认情况下,此值为-1,如果没有新消息可供使用,则消费者将无限期地阻止。

我将此设置为几秒钟,之后它会抛出。通过将此值设置为-1,我得到了所需的行为,尽管理想的解决方案(对于我的用例)将实现此项目的某些内容:https://github.com/kciesielski/reactive-kafka

This thread pointed me in the right direction

希望它可以帮助别人。

答案 1 :(得分:1)

我怀疑你的问题是调用map以便从流中使用。

尝试直接通过stream.iterator.hasNext和stream.iterator.next使用迭代器,看看是否有所作为。这里有一个例子: https://cwiki.apache.org/confluence/display/KAFKA/Consumer+Group+Example

此外,如果2秒内没有数据可用,您将收到ConsumerTimeoutException,因此请确保您的代码已准备好处理它。