卡夫卡生产者阻止回调

时间:2018-07-02 13:27:45

标签: scala apache-kafka kafka-producer-api

我正在我的kafka生产者中测试异步 send()。 我要连接的群集处于脱机状态。 我的假设是,我会快速发送10000个单独的请求(listToSend的长度)。 接下来,超时(60s)将开始,并且60秒后,我会看到回调以logger.error(s"failed to send record ${x._2}", e)击中了我 但是,似乎永远需要这种方法才能完成。

这就是为什么我在logger.debug("test: am I sending data")行中添加。

它会打印,然后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()。

1 个答案:

答案 0 :(得分:1)

我从不完全了解的并行性。

但是似乎是我的主题名称(我曾将其命名为“ [项目名称在这里] _connection”)。

即使我不知道主题名称中有任何保留的关键字,此行为也会弹出。

一些进一步的实验也提出带有尾随空格的主题名称也可能导致此现象。生产者将尝试将其发送到该主题,但是Kafka集群似乎不知道如何处理它,从而导致超时。

因此,对于所有遇到此问题的人,请在继续进行故障排除之前检查/更改主题名称。