この記事では、パイプライン・デザイン・パターンの基本からより複雑なソリューションまで、さまざまな実装方法を探ります。
パイプラインパターン
パイプラインパターンは、一連の処理を構築および実行する機能を備えたソフトウェアのデザインパターンです。
このパターンはプラグイン パターンと一緒に使用するとよく、アプリケーションが起動すると動的にパイプラインを構築することができます。
Sequence
パイプラインの最も基本的な実装は、単純な操作のシーケンスになります。
操作のインターフェイスは、データ処理のために呼び出されることができます。 パイプラインクラスはIOperationインターフェイスも実装しているので、これらを組み合わせることができます。
操作は専用のクラスで書くこともできます。
ラッパーを使ってラムダから自動的に操作を作成することも可能です。
パイプラインのオペレーションは、パイプラインが起動される前に登録する必要があります。
Circuit Breaker
パイプラインに追加したい最初の機能は、サーキットブレーカーです。
それぞれのオペレーションは結果 : fail または success を返します。
操作が失敗した場合、パイプラインの実行は停止する必要があります。
Asynchronous
別の要件としては、非同期操作を処理できるパイプラインを持つことも可能です。
すべての操作は、データ処理が終了した後、パイプラインの次の操作を呼び出す必要があります。
この操作は非同期で、専用のスレッドで実行され、時間切れになると次の操作を呼び出してパイプラインを継続します。
汎用操作は単純なアクションと両方使用でき、機能を使用すれば組み込みのサーキットブレーカーを使用できます。
この簡単な例では、実装した機能のいくつかを使用しています。
いくつかのプロジェクトでは、パイプラインの各処理を専用のスレッドで実行することにより、膨大なデータの処理を最適化するためにパイプラインが使用されています。
各スレッドは、バッファとして機能する同時キューのデータを消費および生成します。
今回は、サーキットブレーカーによる非同期オペレーションを使用します。
操作が成功したら次を起動し、失敗したら終了します。
パイプラインはサーキットブレーカーを回避するように設計されています。 成功しても失敗しても、常に親パイプラインのシーケンスを継続し、次の操作を呼び出します。
シナリオは少し複雑なので、すべてを説明するつもりはありません。 アイデアは、受信した注文を処理するために異なるスレッドを持つことです。 注文の処理が終了すると、注文のステータスをチェックします。
各注文プロセッサーは専用のスレッドで分離されているので、データの格納方法を最適化でき、ロックを使用せずに直接メモリ アクセスが可能です。 同時実行の問題を気にすることなく、任意の残高を取得または更新できます。
パイプラインは、一連の処理をできるだけ高速に処理することです。
結論
Theipeline Design Pattern には、単純な Chain of Command からより複雑な Workflow まで、非常に多くの異なる実装方法があります。
Circuit-breaker, asynchronous or buffer など多くの機能が必要な場合がありますが、ほとんどの場合、パイプラインの実行フローにフックできるプラグインが欲しいときに、パイプラインが使用されるでしょう。