设置非阻塞异步Kafka生产者的正确方法是什么?

时间:2019-07-09 11:41:12

标签: c++ asynchronous apache-kafka kafka-producer-api

我正在尝试创建一个异步Kafka生产者,该生产者可以同时被多个线程调用。 他们都以随机的时间间隔将数据发布到同一主题,最多有1000个生产者,而且任何线程都不应阻止任何其他线程。

我读到,这样做的首选方法是在生产者对象上创建并将其传递给所有线程对象以使用,因为Kafka是线程安全且异步的。

然后我的问题是,在生产者实现中我该怎么做,以确保各个线程不会阻塞其他线程,并且确保每个线程都发送了数据(假设代理处于联机状态)。

我从https://github.com/mfontanini/cppkafka/tree/master/examples

开始使用部分缓冲的生产者示例。

我将缓冲的生成器初始化为一个单独的类,并将对该对象的引用传递给所有其他类,以供它们在线程调用的方法中使用。

因此,在启动线程之前初始化生产者之后,我最初计划在每个线程函数中执行此操作:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>spring-mvc-crud-demo</display-name>

  <absolute-ordering />

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>

  ......

然后我读到flush()方法会阻塞并使生产者同步,并且应该改为使用Produce()

        builder.payload(payload);
        producer.add_message(builder);
        producer.flush();

,或者只是add_message()方法

        builder.payload(payload);
        producer.produce(builder);

然后根据我的queue.buffering.max.ms设置发送此数据。

但是当缓冲区最终被清空时会发生什么,这会使我的任何生产者都阻塞,还是会在后台线程中自动发生? 如果我将queue.buffering.max.ms设置为0,这是否与我将flush()放在那里的方式相同,还是仍然异步且非阻塞? 而且,如果我想在生产者失败/成功回调中记录数据,这些回调会导致任何生产者线程阻塞吗?

0 个答案:

没有答案