使用Kafka 1.0.0 Java API,罐子是kafka_2.11-1.0.0-cp1.jar,kafka-clients-1.0.0-cp1.jar,zkclient-0.10.jar和Confluent 4.1.0。< / p>
我们使用以下代码块编写并使用了过去两年保持稳定的使用者:
val props = new Properties
props.put("zookeeper.connect", zookeepers)
props.put("schema.registry.url", schema_reg)
props.put("group.id", group_name)
props.put("consumer.id", app_name + "_lab_consumer")
props.put("consumer.timeout.ms", "5")
props.put("auto.commit", "true")
props.put("auto.commit.interval.ms", "1000")
props.put("auto.offset.reset", "smallest")
props.put("backoff.increment.ms", "5000")
val vProps : VerifiableProperties = new VerifiableProperties(props)
run_consumer = Consumer.create(new ConsumerConfig(props))
run_iterator = run_consumer.createMessageStreamsByFilter(
new Whitelist(lab_topic), 1,
new KafkaAvroDecoder(vProps),
new KafkaAvroDecoder(vProps)
)(0).iterator
while (keep_looping) {
if (run_iterator.hasNext) {
var record : kafka.message.MessageAndMetadata[Object, Object] = null
var key : String = null
var value : GenericRecord = null
record = run_iterator.next
key = record.key.toString
value = record.message.asInstanceOf[GenericRecord]
// do some stuff with 'value' etc
} // if
// do some stuff to decide if to set keep_looping=false
} // while
但是现在我们的要求已将消息产生的速度提高了几倍。现在,这些主题每秒必须处理多达500条消息,而之前我们很少每秒处理超过50条消息。
架构很简单。一个生产者将所有消息发送到具有10个分区的单个主题。单线程使用者从该主题读取所有消息。这是该组中唯一的消费者。
我们还使用Confluent Kafka Elasticsearch-Connectors。它们由多个消费者实例组成一个消费者组,并且在处理增加的消息速率方面没有明显的问题。
但是,我们的消费者将在阅读有关该主题的所有消息的时间可变后停止阅读更多消息。然后,即使该主题处于活动状态并且消息正在通过Elasticsearch-Connectors流传输,它也会超时并自行关闭。
我们观察到,当我们的消费者停止阅读消息时,该主题似乎正在重新平衡。但是,如果组中只有一个消费者,为什么主题会变得更加平衡? (也许是因为Elasticsearch-Connector死了,迫使重新平衡吗?)重新平衡似乎是有问题的,并且似乎以Kafka java consumer freezes after rebalance failure中描述的方式影响Zookeeper,但是针对该帖子提出的解决方案不适用于我们,因为我们有一个单一的消费者消费者组。
重新平衡可以无限期进行,我们需要删除该主题并重新开始,然后我们的消费者才能再次订阅它。
这似乎更像是Kafka中的错误或我们的设计失败吗?谢谢。