Scala 卡夫卡制作人在回调时阻塞
我正在测试kafka producer中的asyncsend()。 我要连接到的群集处于脱机状态。 我的假设是,我会快速发送10000个个人请求(listToSend的长度)。 接下来超时(60秒)将开始,60秒后,我会看到回调用Scala 卡夫卡制作人在回调时阻塞,scala,apache-kafka,kafka-producer-api,Scala,Apache Kafka,Kafka Producer Api,我正在测试kafka producer中的asyncsend()。 我要连接到的群集处于脱机状态。 我的假设是,我会快速发送10000个个人请求(listToSend的长度)。 接下来超时(60秒)将开始,60秒后,我会看到回调用logger击中我。错误(s“未能发送记录${x.\u 2}”,e) 然而,该方法似乎要花很长时间才能完成 这就是为什么我添加了logger.debug(“测试:我正在发送数据”)行 它打印出来,然后在60秒内什么也没发生。我看到第一条记录的回调失败。只有到那时,它才会
logger击中我。错误(s“未能发送记录${x.\u 2}”,e)
然而,该方法似乎要花很长时间才能完成
这就是为什么我添加了logger.debug(“测试:我正在发送数据”)
行
它打印出来,然后在60秒内什么也没发生。我看到第一条记录的回调失败。只有到那时,它才会继续前进
这是正常的行为还是我遗漏了一些基本的东西
listToSend.foreach { x =>
logger.debug("test: am I sending data")
// note: I added this 'val future =' in an attempt to fix this, to no avail
val future = producer.send(new ProducerRecord[String, String](topic, x._2), new Callback {
override def onCompletion(metadata: RecordMetadata, e: Exception) {
if (e != null) {
//todo: handle failed sends, timeouts, ...
logger.error(s"failed to send record ${x._2}", e)
}
else { //nice to have: implement logic here, or call another method to process metadata
logger.debug("~Callback success~")
}
}
}
)
}
注意:我不想阻止这段代码,我想让它保持异步。然而,不管怎样,它似乎在send()上阻塞了。我从未完全理解过并行性 然而,似乎我的主题名(我将其命名为“[projectname here]\u connection”)是问题所在 尽管我不知道在主题名中有任何保留关键字,但突然出现了这种行为 一些进一步的实验还发现,带有尾随空格的主题名也会导致这种行为。制作人将尝试将其发送到此主题,但卡夫卡集群似乎不知道如何处理它,导致这些超时
因此,对于所有遇到此问题的人,请在进行故障排除之前检查/更改主题名称。您需要了解未来,这不是阻碍吗?为了解决这个问题,我添加了“val future=”,它原来不在
producer.send
返回未来[RecordMetadata]
(或类似的内容)。您可以调用val meta=future.get()
来实际执行阻塞,以及producer.close
但我不想阻塞,这就是问题所在。它现在阻塞了,但我只想快速“清除”我的记录,让逻辑处理任何类型的故障/停机时间/…然后您需要在producer配置中将acks设置为零,而不是使用回调或分配未来