【问题标题】:Kafka Stream: Graceful shutdownKafka Stream:优雅关闭
【发布时间】:2018-05-14 01:24:36
【问题描述】:

如果我们在后台启动 KafkaStream 应用程序(比如 Linux),是否有办法从外部向应用程序发出信号,从而启动正常关闭?

【问题讨论】:

    标签: apache-kafka apache-kafka-streams


    【解决方案1】:

    如文档 (https://kafka.apache.org/11/documentation/streams/tutorial) 中所述,建议注册一个调用 KafkaStreams#close() 的关机钩子以彻底关机:

    final CountDownLatch latch = new CountDownLatch(1);
    
    // attach shutdown handler to catch control-c
    Runtime.getRuntime().addShutdownHook(new Thread("streams-shutdown-hook") {
        @Override
        public void run() {
            streams.close();
            latch.countDown();
        }
    });
    
    try {
        streams.start();
        latch.await();
    } catch (Throwable e) {
        System.exit(1);
    }
    System.exit(0);
    

    【讨论】:

    • 如果应用程序作为后台进程启动,我认为 control-c 可能不适用。我们可以使用 PID 杀死流应用程序实例,但不确定上述是否会启用干净关闭。请确认
    • Ctrl-C 发送SIGINT 信号,而普通kill <pid> 发送SIGTERM。这些信号被关闭钩子覆盖(参见docs.oracle.com/javase/8/docs/api/java/lang/Runtime.htmlstackoverflow.com/a/2541618/1743580)。未涵盖的是来自kill -9 <pid>SIGKILL。我建议阅读 Java 文档——这并不特定于 Kafka 的 Streams API。
    • 只是一个附加的后续,我们在 0.10.1,所以只为关闭钩子添加一个新线程,是否有可能面临下面列出的相同问题? stackoverflow.com/questions/42398294/…
    • 这应该不是问题。报告的多线程问题仅影响内部StreamThreads
    猜你喜欢
    • 2019-03-10
    • 2017-03-05
    • 2020-08-11
    • 2018-11-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    相关资源
    最近更新 更多