Table of Contents
はじめに:イベント処理におけるスピードに対する重要なニーズ
低レイテンシブアプリケーションは、すべてのミリ秒の問題が重要な現代のデジタルインタラクションのバックボーンを形成します。 金融取引プラットフォーム、リアルタイムの不正検知、マルチプレイゲーム、およびIoTセンサーネットワークは、正確な応答を提供し、ユーザーの信頼を維持するため、最小限の遅延で処理イベントに依存しています。 これらのシステムの中心は、イベント処理パイプラインのことです。 ステージのシーケンスは、ほぼリアルタイムでデータを摂取、フィルタ、変換、および出力します。 これらのパイプラインを最適化することは単なるオプションではありません。 競争の激しい要素を追跡し、必要な戦略を最適化するための要件です。
イベント処理のパイプラインの理解
イベント処理パイプラインは、ストリーミングデータで動作する処理手順のチェーンです。各ステージはイベントを受信し、特定の操作を実行し、結果を次のステージに渡します。パイプラインの全体的なレイテンシーは、ステージごとに費やされた時間とステージ間の移動データ量の合計です。真の低レイテンシのために、すべてのステージは最小限のオーバーヘッドのために設計する必要があります。
データ摂取
パイプラインは、Webサーバー、メッセージブローカー、またはハードウェアセンサーなどの外部ソースからイベントを受信する、インゲスションから始まります。インゲスションは、可変的な入力速度と潜在的に大規模な並列処理をしなければなりません。一般的な技術には、Apache Kafka、NATS、RabbitMQ、またはカスタムUDPベースの受信機が含まれます。主な最適化には、非ブロッキングID/O、プール接続、および可能な場合にはゼロコピーのdeserializationを採用しています。例えば、Kafkaの[FLT][FLT] [F] [F] {[F]} [F] と[F] [F] と[F] [F] [F] [F]] と[F] [F] [F] [F] [F] [F] [F] [F] と [F] [F] [F] [F] [F] [F] [F] [F] [F] [F] [F] [F] [F] [[F] [F] [[F] [[F] [[F] [[F] [F] [F] [[F]
フィルタリング
フィルタリングは、下流処理負荷を削減するために、早期に関連したイベントを削除します。このステージは、単純な述語チェックを実行します。遅延を最小限に抑えるために、フィルタリングはイベントの最下形(例えば、完全なdeserializationの前にバイト)で動作するはずです。 ]]Bloom filter]または]の確率的データ構造:3:は、高い評価を通過することを可能にします]は、高出力のシナリオでメンバーシップを加速することができます。
トランスフォーメーション
変換はイベントデータが濃縮、集計、または変更されます。このステージは通常、最も計算的な決定です。一般的な操作には、データフォーマット変換、フィールド抽出、ウィンドウアグリゲーション、および機械学習の推論が含まれます。ここで最適化は、]]の列データモデル[、事前割り当てバッファ、およびの調整時間(JIT)コンパイルされた状態]を使用するか、または[FLT]をスライドさせる[FLT]を[FLT]]を[FLT]]]にまとめました。[FLT]:[FLT]:[FLT]:[FLT]:[FLT]:[F]:[FLT]:[FLT]:[F]:[F]:[FLT]:[F]:[F]:[FLT]:[FLT]:[F]:[F]:[F]:[F]:[F]:[F]:[F]:[F]:[F]:[F]:[F]:[FLT]
出力
最終段階は、データベース、API、またはダウンストリームパイプラインなどのシンクに加工されたイベントを配信します。 出力は信頼性が高くても高速でなければなりません。 テクニックには、]]非同期書き込み、]]のバッチ[が含まれます。 (遅延を追加するのを避けるために、慎重にフラッシュ間隔を)、接続プールが含まれます。 データベースに書き込みするとき、準備されたステートメントとインデックスを使用して、オーバーヘッドを上書きすることができます。
最適化のための戦略
パイプラインの最適化は、全体的なビューを必要とします。1つのステージの変更は、他のユーザーに影響を与える。 以下は、実用的な実装ガイダンスで重要な戦略です。
リーンデータ構造による処理オーバーヘッドの低減
熱いループ内でオブジェクトの作成を避けてください。 ミュータブルなコンテナを再利用し、ボックスタイプではなくプリミティブ配列を使用し、マイクロバッチに滞在するデータに対して[オフヒープメモリを好む。 たとえば、Javaベースのパイプラインでは、FlatBuffersまたはProtocol Buffers[FLT]FLT:[FLT]FLT:[FLT]FLT:[FLT]FLT:[FLT]FLT:[FLT]F]FAT]FAT:[F]FLT:[F]FLT:[F]FAT:[F]FAT]FAT]FAT:[FAT]FAT:FAT:[FAT]FAT:[FAT:[FAT]FAT]FAT:[FAT]FAT:[F]F]FAT:[FAT:[F]F]FAT:[F]FAT:[F]F]FAT:[F]F]FLT:[F
並列処理と決定的並列化
現代の CPU アーキテクチャは、並列性を有利にしています。 スレッドプールを使用して同時実行できる独立したステージにパイプラインを分解します]、 アクターモデル (例: Akka)、または[]]] の ]] (例:Apache Flink、Kafka Streams)が、 [FLT: (例: [FLT:] (例: [FLT:] ) と 同じように、 [FLT: [FLT:] は、 が、 同じ、 [FLT: [FLT: [FLT: [FLT:] が、 が、 [FLT: [F] が、 [FLT: [FLT:] が、 [F] の構成を、 [F] が、 [FLT: [F] が、 [F] が、 [FLT: [FLT: [F] が、 [F] が、
効率的なデータシリアライズ
シリアル化は、多くの場合、パイプラインレイテンシに最大の単一コントリビューターです。速度、スキーマの進化、相互運用性の間で取引するシリアライズ形式を選択します。絶対低レイテンシーの場合、FlatBuffersと[[Cap'n Proto]はゼロコピー読み取りを可能にする - データは、デコードなしでバッファから直接アクセスされます[FLT:] [FLT:[FLT:]]と[FLT:[FLT:]]は、通常のオプションが必要です[FLT]:[F]:[F]:[FLT:[F]:[F]:[FLT:[F]:[F]:[F]:[F]:[F]:[F]:[F]:[F]:[FLT:[F]:[F]:[F]:[F]:[F]:[F]:[F]:[F]:[F]:[F]:[F]:[F]:[F]
ネットワーク通信の最適化
ネットワークレイテンシは、多くの場合、ハードバインドです。同じホストまたは同じラックのパイプラインステージを連結することで、]RDMA]またはInfiniBandをインターノード転送します。アプリケーションレイヤーでは、送信前のバッチイベント(ただし、レイテンシを追加しないバッチサイズを小さく保つ)。 TCPDECK[FLT]]を強制的に使用して、レイテンシーシステムが無効にするには、 [FLT] [FLT]を[FLT]、[FLT]を[FLT]、[F]]]を強制的に、または[FLTF]を[FLT]に変換する[FLT]、[F]、[FLT]を[FLTFLTF]、[FLTF]、[F]、[F]、[F]、[FLTFLTF]、[FLTF]を[FLTF]、[F]を[F]、[F]、[F]、[FLTF]に変換して、または[FLTFLTFLTF]、[F]、[FLTFLTF
レバージャージハードウェアアクセラレーション
GPUとFPGAは、フィルタリングと変換で共通する並行計算で大幅並行して計算されます。例えば、[]]]Jetson GPUはリアルタイムのビデオ分析パイプラインに使用できますが、FPGAはマッチングのための金融取引所で人気があります。しかし、ハードウェアアクセラレーションは複雑さを増大させ、ホットパスのために予約するのが最善です。CPUとアクセラレータ間のデータ転送のオーバーヘッドを評価します。多くの場合、これは、バッチだけに役立ちます。
バックプレッシャーとフロー制御
制御されていない入力は、パイプラインを圧倒し、レイテンシのスパイクを引き起こす可能性があります。 バックアップを実行: ダウンストリームが混雑したときに上流ステージが遅くなります。 反応ストリーム(例えば、[]])プロジェクトリアクター、[]]])は、標準のバックプレッチャ信号を提供します。 カフカベースのパイプラインでは、sumcons]は、コンシューマの、[FLT:]を監視します。 [FLT:]は、[FLT]を監視します。 [[FLT]:]:]:] 常に、 [[FLT:] 監視対象グループが、 [[FLT]、[F]、[F]、[F]、[F]、[F]、[FLT:[F]、[FLT:[FLT:[F]、[F]、[F]、[F]、[F]、[F]、[F]、[FLT:[F]、[FLT:[F]、[FLT:[F]、[F]、[FLT:
モニタリングと調整
最適化は、測定、分析、調整の継続的なサイクルです。正確な監視なしで、努力は盲目です。
追跡する主要なメートル
- [エンドツーエンドレイテンシー(p50、p99、p999) - パイプラインの究極の測定。
- [] の — 各ステージの入退出と入退出によるイベント。
- CPU使用量と[GCは]を一時停止します。 - シリアル化ボトルネックまたはメモリ圧力を特定します。
- []Network 往復時間]と[]パケットロス - リモートパイプラインステージ用。
- 各ステージの急行深さ[]]は、バックプレッシャーまたは不均衡容量を示します。
プロファイルと可視化のためのツール
メトリック収集と[]] の ] のダッシュボード用。 分散トレース(ステージが遅延を引き起こしているピンポイントに不可欠)の場合は、 の ] または ] は、 パイプラインを介して個々のイベントをトレースすることができます[FLT:] と [FLT:[FLT:] の[FLT:] と [FLT:] [FLT:] [FLT:]] [FLT:[F]]] は、 [FLT:[FLT:[FLT:[F] [FLT:[F] の遅延] [F] [F] [F] [F] [F] [FLT:[FLT:[F] [F] [F] [F] [FLT:[F] [F] のストリームの[F] の[F] [F] [F] [F] [F] [FLT:[
戦略の調整
- concurrencyを調節して下さい:CPU-bound操作が飽和するポイントまで糸を増加して下さい;過度な記述を避けて下さい。
- []バッファサイズ]]:より大きいバッファはスループットを高めますが、レイテンシを追加します。 必要に応じてp99内のレイテンシを保つためにチューン。
- []バッチサイズ]]:書き込みの場合、フラッシュ間隔が制御されている場合のみ、バッチ。サイズベースと時間ベースのフラッシュを使用してください。
- [] ギャルベージコレクション]:JVMパイプラインで、G1GCまたはZGCに切り替え、古い世代の大きなオブジェクトを直接割り当てます。
- [CPU ピンニング]]: 特定のコアへの結合パイプラインは、キャッシュのローカリゼーションを改善し、コンテキスト切り替えを削減します。
高度な検討
極端に低いレイテンシーシステムのために、さらなる建築パターンが再生されます。
イベントの調達とCQRS
イベントの調達は、決定的な再生を可能にするイベントのログとしてすべての状態の変化を保存します。 コマンドクエリの責任の分離(CQRS)と組み合わせ、読み取りモデルは、書き込み操作が承認されたまま、低遅延のクエリのために最適化することができます。 このデカップリングは、データベースボトルネックからのパイプラインを分離します。
ステートフル対ステートレス処理
Stateless ステージは、スケールと最適化が容易です。しかし、多くのユースケース(例えば、ユーザーセッション集計)は状態を必要とします。 組み込みステートストア] (Kafka Streams の RocksDB のような) または [] メモリーマップ] をリプリケーションで使用してください。 障害を生きなければならない状態については、ロックをKafka Streams または を[FLT] でチェックしてください[FLT]:[FLT] または [[FLT] を[FLT] ] を[FLT] 保存] または [[FLT] 保存します。 [[FLT] 保存] または [[F] 保存します。 [[F] または [[FLT] 保存] 保存] または [[F] 保存します。 [[F] 保存します。 [[F] 保存 保存 保存 保存 保存 保存 保存 保存] 保存 保存 保存
ストリーム処理フレームワーク
[Apache Flink, []Kafka Streams], Apache Beam]]]は、組み込みの最適化を提供します。 オペレータのチェーン、状態管理、チェックポイント、および正式なオンスセマティクス。 それらは多くの低レベルの懸念を抽象化し、独自のオーバーヘッドを追加します。 必要に応じて、 逆流リンク (FLT:FLT:) 必要に応じて、FLT: 外部リンク (FLT:) またはFLT: [FLT:] またはFLT: は、FLT: は、FLT: またはFLT: のロック (FLT: ) の解除 (F) ) ) ) または または の解除 (FLT: ) ) の解除 (FLT: [FLT: [F: [FLT: ) の解除 (FLT: の解除 (FLT: の解除 (FLT: の解除 (F) ) )
コンテンツ
レイテンシブルのためのイベント処理パイプラインの最適化は、ソフトウェア設計、ハードウェアの活用、および継続的なパフォーマンスエンジニアリングに及ぶマルチファステッド・ディストリビューションです。パイプラインのデータフローを理解し、各ステージで現在のパフォーマンスを測定することで開始します。対象の最適化を適用します。リーン・データ構造、並列性、効率的なシリアライズ、および適切なハードウェアアクセラレーション。モニタリングを中止しないでください。プロメテウスやジェなどのツールを使用して、回帰を早期に検出します。方法により、KALT1Fの要件を満たすことができます。