如何使Kafka生产者并行生成事件?

时间:2018-11-14 14:31:57

标签: multithreading scala apache-kafka

那么,这就是我的代码,我需要在属性中添加一些内容吗?

起初,我认为这与分区有关,但事实证明,有一种方法可以使kafka生产者使用更多线程。

有人可以解释我该怎么做吗?

val props = new Properties()
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, url)
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer")
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer")
props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, "IdPartitioner")
var kafkaProducer = new KafkaProducer[String, String](props)

2 个答案:

答案 0 :(得分:0)

  

事实证明,有一种方法可以使kafka生产者使用更多线程

不是本机的,不。您将必须自己制作一个new Thread,或使用可能会为您完成此任务的更高级别的生成库。可以选择Spring Kafka或Akka的Kafka支持。或Spark / Flink / Beam(因为您拥有

已经可以批量发送多条消息,并且每条产生的记录都包含一个主题名称和密钥,因此,即使是单个线程也可以“并行”产生多个可能的代理人

答案 1 :(得分:0)

KafkaProducer通过使用内部线程向代理发送消息来保证线程安全。 它确实保留了要发送的邮件的内部缓存(由linger.ms控制),并且可能发生以下情况:

  • 线程1向生产者提交消息M1(目标= topic1 / partition1)
  • 线程2向生产者提交消息M2(目标= topic2 / partition1)
  • 假设:t1 / p1和t2 / p1都托管在同一经纪人上
  • 生产者的内部线程被唤醒,并在同一请求中发送它们两者

通常,它可以满足您的要求-您可以并行提交产品请求,这些请求将由KafkaProducer本身组织。