Multithreading 我们可以在高流量的多线程环境中使用多个Kafka生产者吗?
我们有一个前端层,它只接收消息并写入Kafka主题以进行后端处理。我们以非常高的速率发送信息;我们每天处理10亿条信息。我们有一个线程池,它接受消息并写入Kafka producer实例。在这里,我只创建了一个生产者(单个实例),它在多个线程之间共享 最近,我观察到90%的线程处于阻塞状态。我发现卡夫卡正在按顺序发送数据。Kafka Java驱动程序中的Multithreading 我们可以在高流量的多线程环境中使用多个Kafka生产者吗?,multithreading,apache-kafka,Multithreading,Apache Kafka,我们有一个前端层,它只接收消息并写入Kafka主题以进行后端处理。我们以非常高的速率发送信息;我们每天处理10亿条信息。我们有一个线程池,它接受消息并写入Kafka producer实例。在这里,我只创建了一个生产者(单个实例),它在多个线程之间共享 最近,我观察到90%的线程处于阻塞状态。我发现卡夫卡正在按顺序发送数据。Kafka Java驱动程序中的producer.send()方法中存在同步块: def send(messages: KeyedMessage[K,V]*) { **
producer.send()
方法中存在同步块:
def send(messages: KeyedMessage[K,V]*) {
**lock synchronized {**
if (hasShutdown.get)
throw new ProducerClosedException
recordStats(messages)
sync match {
case true => eventHandler.handle(messages)
case false => asyncSend(messages)
}
}
}
文档说我们不需要创建多个生产者实例;一个实例可以在多线程环境中共享。但是我们怎么能做到呢?还是我们最好创建一个生产者实例池?之所以建议跨线程共享发布者客户端,是因为这样可以更好地进行批处理,因为消息是在分区级别进行批处理的。更好的批处理可以带来更好的压缩(如果启用)和更好的吞吐量。您可以考虑调整缓冲存储器和逗号、MS和批次大小等参数以优化吞吐量。 一个这样做,然后你可以考虑添加多个生产者。
此外,如果主题的输入率相当高,请考虑增加主题的分区数量。 我尝试了您提到的所有选项,但对我正在处理的高数据速率没有帮助。一旦我增加了producer实例的数量,它就变得更好了。我也遇到过类似的情况。这意味着您已经完全优化了从单个客户端获得的吞吐量。在此之后,添加更多生产者实例是有意义的。