Kafka2.0サーバ側、ソースを開始

  よるカフカサーバKafka.scala主な機能のmain方法が開始されます。KafkaServerStartableクラスは読ん設定ファイル、起動方法/ストップサービスを提供しています。スタート/ストップサービスは、最終的な呼び出しである方法。KafkaServerstartup/shutdown

スタートプロセス

  1. ZKクライアントを起動します。
  2. 動的構成を開始します。
  3. スレッドプールをスケジュール起動します。
  4. ログを削除し、ログ、ログディスクブラシをクリーンアップ含め、ログマネージャのバックグラウンドスレッドを起動し、圧縮をログに記録します。
  5. NIOソケットサービスを開始します
    1. シンクを初期化Acceptor、即ちNIOソケットを開始。
    2. 追加num.network.threadsチャネル要求を受信しRequestChannel、プロセッサ・キャッシュConcurrentHashMap、鍵番号がインクリメントされ、プロセッサの値をProcessor
    3. Acceptor実行がCountDownLatch.await開始する通知を待ちます。
    4. キャッシュAcceptorへのConcurrentHashMap鍵は、あるEndPoint値は、Acceptor
  6. コピーマネージャを起動します。
  7. ZKに登録ブローカー。
  8. コントローラ。
  9. スタートアップグループのコーディネーター。
  10. トランザクション・コーディネーターを開始します。
  11. 初期化KafkaApis
  12. プロセッサキャッシュの初期化スレッドプール
    1. 開始num.io.threads要求処理スレッドをKafkaRequestHandler
    2. キューブロックからArrayBlockingQueue呼び出し、取得要求をKafkaApis.handle集中処理要求のための方法を、。
  13. プロセッサスレッドを起動します
    1. 最初のCountDownLatch.countDown通知は、目を覚ますAcceptorのスレッドを。
      1. 使用NIO.selectポーリング。
      2. イベントの準備ができて、その後、現在の受信可能な場合はSocketChannel、バッファキューの追加をConcurrentLinkedQueue
    2. キューバッファから取り出しSocketChannelバインドするために、KafkaChannel
    3. キューの長さをブロックキャッシュ制限に受信した要求ArrayBlockingQueue

要求処理の流れ

サービス要求の処理フローを終了します

詳細なソースコード解析

アクセプタスレッド

def run() {
  serverChannel.register(nioSelector, SelectionKey.OP_ACCEPT) // 注册接收事件
  startupComplete() // 通知 Acceptor 线程
  var currentProcessor = 0
  while (isRunning) {
    val ready = nioSelector.select(500) // 轮询事件
    if (ready > 0) {
      val keys = nioSelector.selectedKeys()
      val iter = keys.iterator()
      while (iter.hasNext && isRunning) {
        val key = iter.next
        iter.remove()
        if (key.isAcceptable) { // 有可接受事件
          val processor = synchronized {
            currentProcessor = currentProcessor % processors.size
            processors(currentProcessor) // 缓存 Processor 
          }
          accept(key, processor) // 将 SocketChannel 缓存到队列
        }
      }
    }
  }
}

プロセッサのスレッド

override def run() {
  startupComplete() // CountDownLatch.countDown 唤醒 Acceptor 线程。
  while (isRunning) {
    configureNewConnections() // 从缓存队列取出 SocketChannel,绑定到 KafkaChannel
    processNewResponses() // 处理返回客户端的响应
    poll() // Kafka.Selector 轮询读取/写入事件
    processCompletedReceives() // 处理客户端的请求,放到阻塞队列
    processCompletedSends() // 处理返回客户端响应后的回调
    processDisconnected() // 断开连接后的处理
  }
}

KafkaRequestHandlerスレッドブロッキングキュー

def run() {
  while (!stopped) {
    val startSelectTime = time.nanoseconds
    // 从阻塞队列拉取请求
    val req = requestChannel.receiveRequest(300) 

    req match {
      case request: RequestChannel.Request =>
        try {
          apis.handle(request) // 调用`KafkaApis.handle`方法,进行集中处理请求。
        }
    }
  }
}

KSelector

  クライアントの参照元の分析。

おすすめ

転載: www.cnblogs.com/bigshark/p/11204428.html