【问题标题】:When to call KafkaProducer close method?何时调用 KafkaProducer 关闭方法?
【发布时间】:2021-07-05 21:57:34
【问题描述】:

正如Kafka文档所说,

生产者是线程安全的并且共享一个生产者实例 跨线程通常比拥有多个线程更快 实例。

所以我有以下代码,并且希望每个发送请求只有一个 KafkaProducer 实例。但是什么时候是代码中调用 close 方法的最佳位置呢?因为我不能在 send 方法中调用 close 方法。应该怎么写代码来处理?

public class Producer {
    private final KafkaProducer<Integer, String> producer;

    public Producer(String topic, Boolean isAsync) {
        Properties props = new Properties();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, KafkaProperties.KAFKA_SERVER_URL + ":" + KafkaProperties.KAFKA_SERVER_PORT);
        props.put(ProducerConfig.CLIENT_ID_CONFIG, "DemoProducer");
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, IntegerSerializer.class.getName());
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        producer = new KafkaProducer<>(props);
    }

    public void send(String message) {
        producer.send(new ProducerRecord<>(topic, messageNo, messageStr);
    }
}

【问题讨论】:

    标签: apache-kafka kafka-producer-api


    【解决方案1】:

    Kafka producer 实现了 AutoClosable 接口。所以你可以在 try-with-resources 块中声明它,当你的代码超出块的范围时,它应该负责释放资源。

    【讨论】:

    • 我不想每次调用 send 后都关闭生产者,否则我每次都必须创建一个生产者实例。
    • 如果它是一个永久运行的应用程序,那么调用close() 方法可能没有多大意义。
    • 是的,它是一个 Spring Boot Web 应用程序。所以不需要调用close方法?
    • 我想是的。在我们的生产中,我们有一个基于休息的应用程序,可以将数据摄取到 Kafka,我很确定它永远不会关闭。到目前为止,我们还没有看到任何与生产者相关的资源泄漏,所以应该没问题。
    • 太棒了,谢谢。这就是我想知道的。如果有一些资源泄漏,我也在考虑实现我的Producer 类的Closeable 接口。
    【解决方案2】:

    您可以先创建生产者并将其传递(注入)到您的网络资源或资源中。

    然后你可以使用关闭钩子来关闭生产者及其引用。

    如果您可以在框架中使用生命周期停止钩子,那就更好了。 下拉向导中的示例: https://www.dropwizard.io/en/latest/manual/core.html?highlight=managed#managed-objects

    【讨论】:

      【解决方案3】:

      您是否需要在运行时更改生产者参数?例如在更改代理 url 或在测试期间?

      如果你需要它并且你有一个单调生产者,请确保提供一个挂钩来关闭并使用新参数重新创建生产者。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-04
        • 2012-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多