Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 我们可以在高流量的多线程环境中使用多个Kafka生产者吗?_Multithreading_Apache Kafka - Fatal编程技术网

Multithreading 我们可以在高流量的多线程环境中使用多个Kafka生产者吗?

Multithreading 我们可以在高流量的多线程环境中使用多个Kafka生产者吗?,multithreading,apache-kafka,Multithreading,Apache Kafka,我们有一个前端层,它只接收消息并写入Kafka主题以进行后端处理。我们以非常高的速率发送信息;我们每天处理10亿条信息。我们有一个线程池,它接受消息并写入Kafka producer实例。在这里,我只创建了一个生产者(单个实例),它在多个线程之间共享 最近,我观察到90%的线程处于阻塞状态。我发现卡夫卡正在按顺序发送数据。Kafka Java驱动程序中的producer.send()方法中存在同步块: def send(messages: KeyedMessage[K,V]*) { **

我们有一个前端层,它只接收消息并写入Kafka主题以进行后端处理。我们以非常高的速率发送信息;我们每天处理10亿条信息。我们有一个线程池,它接受消息并写入Kafka producer实例。在这里,我只创建了一个生产者(单个实例),它在多个线程之间共享

最近,我观察到90%的线程处于阻塞状态。我发现卡夫卡正在按顺序发送数据。Kafka Java驱动程序中的
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实例的数量,它就变得更好了。我也遇到过类似的情况。这意味着您已经完全优化了从单个客户端获得的吞吐量。在此之后,添加更多生产者实例是有意义的。