トンネルクライアントは、Tunnel Serviceの自動データ消費フレームワークです。Tunnel Serviceを使用する前に、トンネルクライアントの以下の機能について理解する必要があります。自動データ処理、自動ロードバランシング、優れた水平スケーリング、自動リソースクリーンアップ、および自動フォールトトレランス。
背景情報
トンネルクライアントは、フルデータと増分データの処理に関して、以下の機能をサポートしています。ロードバランシング、障害復旧、チェックポイント、および消費情報の順序を保証するために使用されるパーティション情報同期。トンネルクライアントを使用すると、各レコードの処理ロジックに集中できます。
トンネルクライアントの詳細なサンプルコードについては、Githubをご覧ください。
自動データ処理
トンネルクライアントは、定期的にハートビートをチェックしてアクティブなチャネルを検出し、ChannelとChannelConnectのステータスを更新し、データ処理タスクを初期化、実行、および終了します。
トンネルクライアントのリソースを初期化します。
トンネルクライアントの状態をReadyからStartedに変更します。
TunnelWorkerConfigでHeartbeatTimeoutとClientTagを設定して、ConnectTunnelタスクを実行し、Tunnel Serviceに接続して現在のトンネルクライアントのClientIdを取得します。
ChannelDialerを初期化して、ChannelConnectタスクを作成します。
各ChannelConnectタスクは、Channelに対応しています。ChannelConnectタスクは、データ消費チェックポイントを記録します。
データを処理するためのCallbackパラメーターと、Tunnel Serviceでチェックポイントを出力する間隔を指定するためのCheckpointIntervalパラメーターを設定します。これにより、チェックポイントを自動的に出力するデータプロセッサを作成できます。
TunnelStateMachineを初期化して、Channelのステータスを自動的に更新します。
ハートビートメッセージを定期的にチェックします。
TunnelWorkerConfigでheartbeatIntervalInSecパラメーターを設定して、ハートビートをチェックする間隔を設定できます。
ハートビートリクエストを送信して、Tunnel Serviceから最新の利用可能なチャネルのリストを取得します。リストには、ChannelId、チャネルバージョン、およびチャネルステータスが含まれます。
Tunnel Serviceから取得したチャネルのリストをローカルのチャネルのリストとマージし、ChannelConnectタスクを作成および更新します。以下のルールに従います。
マージ:Tunnel Serviceから取得した同じChannelIdの古いバージョンをローカルリストの新しいバージョンで上書きし、Tunnel Serviceからの新しいチャネルをローカルリストに挿入します。
ChannelConnectタスクの作成:ChannelConnectタスクがないチャネルに対して、WAIT状態のChannelConnectタスクを作成します。ChannelConnectタスクがOPEN状態のチャネルに対応している場合は、このChannelConnectタスクのデータを循環的に処理するReadRecords&&ProcessRecordsタスクを実行します。詳細については、ソースコードのProcessDataPipelineクラスを参照してください。
既存のChannelConnectタスクの更新:チャネルのリストをマージした後、チャネルがChannelConnectタスクに対応している場合は、同じChannelIdを持つチャネルの状態に基づいてChannelConnectの状態を更新します。たとえば、チャネルがCLOSE状態の場合、対応するChannelConnectタスクの状態をCLOSEDに設定して、対応するパイプラインタスクを終了します。詳細については、ソースコードのChannelConnect.notifyStatusメソッドを参照してください。
チャネルステータスを自動的に処理します。
ハートビートリクエストで取得したアクティブなトンネルクライアントの数に基づいて、Tunnel Serviceは利用可能なパーティションを異なるクライアントに割り当てて負荷を分散します。
Tunnel Serviceは、次の図に示すようにチャネルステータスを自動的に処理し、チャネルの消費とロードバランシングを推進します。
Tunnel Serviceとトンネルクライアントは、ハートビートとチャネルバージョンの更新に基づいてステータスを変更します。
各チャネルは、最初はWAIT状態です。
増分データのチャネルは、親パーティションのチャネル消費が終了した場合にのみOPEN状態に変わります。
Tunnel Serviceは、OPEN状態のパーティションを各トンネルクライアントに割り当てます。
ロードバランシング中に、Tunnel Serviceとトンネルクライアントは、チャネルの状態をOPEN、CLOSINGからCLOSEDに変更するためのスケジューリングプロトコルを使用します。BaseDataチャネルまたはStreamチャネルを消費した後、トンネルクライアントはチャネルを終了として報告します。
自動ロードバランシングと優れた水平スケーリング
複数のトンネルクライアントは、同じTunnelまたはTunnelIdを使用してデータを消費できます。トンネルクライアントがハートビートタスクを実行すると、Tunnel Serviceはチャネルを自動的に再配布し、アクティブなチャネルを各トンネルクライアントに割り当ててロードバランシングを実現しようとします。
トンネルクライアントを追加して、データ消費能力をスケールアウトできます。トンネルクライアントは、1つ以上のインスタンスで実行できます。
自動リソースクリーンアップとフォールトトレランス
リソースクリーンアップ:トンネルクライアントが正常にシャットダウンされない場合(異常終了や手動終了など)、システムはリソースを自動的にリサイクルします。たとえば、システムはスレッドプールを解放し、対応するチャネルに登録したシャットダウンメソッドを呼び出し、Tunnel Serviceへの接続を終了できます。
フォールトトレランス:トンネルクライアントでハートビートタイムアウトなどの非パラメトリックエラーが発生した場合、システムは自動的に接続を更新して安定したデータ消費を継続します。