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
Apache kafka 为什么KafkaServer必须是线程安全的_Apache Kafka - Fatal编程技术网

Apache kafka 为什么KafkaServer必须是线程安全的

Apache kafka 为什么KafkaServer必须是线程安全的,apache-kafka,Apache Kafka,我已经使用卡夫卡一段时间了,今天我必须阅读它的核心源代码 我发现关于启动卡夫卡经纪人的代码如下: 在这个scala文件中,有一个函数startup(),当我们启动Kafka代理时会调用该函数 让我感到困惑的是,似乎使用了一些原子变量来保证这个函数的线程安全。正如您所看到的,有一些原子布尔变量,例如isShuttingDown,startupComplete,isStartingUp def startup(): Unit = { try { info("starti

我已经使用卡夫卡一段时间了,今天我必须阅读它的核心源代码

我发现关于启动卡夫卡经纪人的代码如下:

在这个scala文件中,有一个函数
startup()
,当我们启动Kafka代理时会调用该函数

让我感到困惑的是,似乎使用了一些原子变量来保证这个函数的线程安全。正如您所看到的,有一些原子布尔变量,例如
isShuttingDown
startupComplete
isStartingUp

def startup(): Unit = {
    try {
      info("starting")

      if (isShuttingDown.get)
        throw new IllegalStateException("Kafka server is still shutting down, cannot re-start!")

      if (startupComplete.get)
        return

      val canStartup = isStartingUp.compareAndSet(false, true)
      if (canStartup) {
        brokerState.newState(Starting)

        /* setup zookeeper */
        initZkClient(time)
        ...
        ...
但我不知道为什么我们需要这样一个线程安全机制。据我所知,Kafka broker的一个进程只有一个
KafkaServer
,这意味着函数
启动
只有一次执行机会。如果我们试图在同一台机器上在短时间内启动Kafka broker的多个进程,那么这只是一个进程间问题,而不是多线程问题。线程安全似乎没有必要


有人能告诉我为什么这里使用一些原子变量吗?为什么这里需要线程安全?

如果您从两个不同的客户端(或从同一个客户端)向代理发送两个连续的关闭调用,如果
isShuttingDown
不是原子的,会发生什么?您不这么认为,但这就是它的工作原理。这是一台服务器。它监听命令。你认为如果我们都发出命令,它会等到你的命令完成,然后启动我的命令吗?它没有同步行为。当你调用www.google.com时,你认为服务器只是等待执行之前的命令,然后显示页面吗?这是正常的,因为它实现了原子检查其状态的机制。您看到的源代码,即这些命令,是从代理外部调用的。如果在布尔值不为原子的情况下调用两个连续的关闭命令,则两个命令都可能将其视为false,从而启动两个关闭。我重复一遍,它是一个服务器,正在侦听来自端点的命令。但是,您正在调用它,正如我也可以调用它一样,是在与您同时执行kafka-server-start.sh。你没有抓住重点。它接收命令并执行方法。如果前面调用的命令不能在连续的命令中反映出来,那么不能保证代理不会启动两次,或者尝试关闭五次!