要約:Kafkaネットワークモジュールのサーバー側は、サーバー側でリクエストを開始、受信、処理するプロセスを紹介します。
この記事は、HuaweiCloudCommunityの「KafkaNetworkModule-ServerSide」、原作者:ミドルウェアの兄弟から共有されています。
SocketServerは、Kafkaサーバーがリクエストを処理するために使用するモジュールであり、Kafkaの起動プロセス中に作成、初期化、および開始されます。
SocketServerの起動プロセス:
-
エンドポイントの順序でアクセプターを初期化し、各エンドポイントはアクセプターに対応し、各アクセプターのプロセッサーを作成し(番号は、num.network.threads構成アイテムによって決定されます)、アクセプターを起動します。アクセプターが起動すると、アクセプターが起動します。セレクターを介して接続を監視し、新しく確立された接続がプロセッサーに引き渡されます(プロセッサーを選択するためのポーリング)
-
すべてのプロセッサを起動します
-
Acceptorが開始し、接続プロセスをリッスンします。
-
Acceptorが起動すると、serverSocketChannelが作成され、acceptorに対応するエンドポイントでリッスンし、セレクターにOP_ACCEPTを登録して、無限ループに入ります。各ループで、レディキー(つまり、以前に登録されたserverSocketChannel)セレクターを介して取得され、接続が到着したら、accept()を介して接続に対応するsocketChannelを作成し、ポーリングしてアクセプターを担当するプロセッサーから1つを選択し、選択したプロセッサーにsocketChannelを渡して処理します。つまり、接続をプロセッサに渡します。
-
Acceptorは、処理のために接続をプロセッサに渡します。これは、socketChannelをプロセッサの接続キューnewConnectionに追加することであり、プロセッサは、runメソッドで接続を継続的に取得して処理します。
-
プロセッサはnewConnectionからsocketChannelを取得した後、セレクタにOP_READを登録し、対応するKafkaChannelを作成します。
サーバー側でリクエストを受信して処理するプロセス:
-
プロセッサがOP_READイベントを受信して準備ができたら、SSLハンドシェイクとSASL検証を確認して完了してみてください(ハンドシェイクは現時点では完了していない可能性があるため、プロセッサがOP_READイベントを受信して準備ができたら、最初に確認してハンドシェイクが完了していることを確認します。SSL/SASL関連リファレンス(セクション9.4)
-
SSLハンドシェイクとSASL検証が完了したら、チャネルからデータを読み取り、NetworkReceiveオブジェクトを作成し、stagedReceivesにキューに入れます。
-
stagedReceivesチームの最初の要素を取り出し(削除)、completedReceivesを追加します
-
completeReceivesの要素を取り出し(削除しないで)、Requestオブジェクトを作成し、requestQueueに参加し、OP_READのイベント登録を削除し、対応するKafkaChannelをMUTEDに設定してから、MUTED_AND_RESPONSE_PENDINGに設定します。
-
KafkaRequestHandlerは、requestQueueから要素を取得(削除)し、それらをKafkaApiモジュールに渡してリクエストを処理します
-
KafkaApiはリクエストを処理した後、対応するプロセッサのresponseQueueとinflightResponsesにレスポンスを入れ、セレクターをウェイクアップします。
-
プロセッサはresponseQueueから応答を取得(削除)します。応答をクライアントに返送する必要がある場合は、応答の送信をKafkaChannelに割り当て、OP_WRITEイベントを登録します。
-
チャネルが書き込みの準備ができたら、チャネルの書き込みバッファーに送信を書き込み、送信が終了したら、OP_WRITEイベントの登録を削除し、completedSendsに送信を追加します。
-
対応する応答をinflightResponsesから削除し、応答コールバックを実行し、KafkaChannelをMUTEDに設定してから、MUTEDからNOT_MUTEDに設定し、OP_READイベント登録を再度追加します。