【ソフトウェアアーキテクチャ】パイプライン・デザイン・パターン – ゼロからヒーローへ

この記事では、パイプライン・デザイン・パターンの基本からより複雑なソリューションまで、さまざまな実装方法を探ります。

パイプラインパターン

パイプラインパターンは、一連の処理を構築および実行する機能を備えたソフトウェアのデザインパターンです。

https://www.hojjatk.com/2012/11/chain-of-responsibility-pipeline-design.html

このパターンはプラグイン パターンと一緒に使用するとよく、アプリケーションが起動すると動的にパイプラインを構築することができます。

Sequence

パイプラインの最も基本的な実装は、単純な操作のシーケンスになります。

操作のインターフェイスは、データ処理のために呼び出されることができます。 パイプラインクラスはIOperationインターフェイスも実装しているので、これらを組み合わせることができます。

操作は専用のクラスで書くこともできます。

ラッパーを使ってラムダから自動的に操作を作成することも可能です。

パイプラインのオペレーションは、パイプラインが起動される前に登録する必要があります。

Circuit Breaker

パイプラインに追加したい最初の機能は、サーキットブレーカーです。

それぞれのオペレーションは結果 : fail または success を返します。

操作が失敗した場合、パイプラインの実行は停止する必要があります。

Asynchronous

別の要件としては、非同期操作を処理できるパイプラインを持つことも可能です。

すべての操作は、データ処理が終了した後、パイプラインの次の操作を呼び出す必要があります。

この操作は非同期で、専用のスレッドで実行され、時間切れになると次の操作を呼び出してパイプラインを継続します。

汎用操作は単純なアクションと両方使用でき、機能を使用すれば組み込みのサーキットブレーカーを使用できます。

この簡単な例では、実装した機能のいくつかを使用しています。

さて、パイプラインを非同期にする方法が分かりましたね !

前の処理への別のコールバックがあれば、パイプラインを通じて結果を逆流させることができて、さらに良くなるでしょう。

プラグイン

パイプライン デザイン パターンを使用する主な理由は、既存のパイプラインに操作を追加する、または操作を途中でフックするプラグインを追加できるようにすることが必要な場合が多いからです。

パイプラインは本当に基本的ですが、今回は操作が公開されています。

3 つのステップをコンソールに表示するだけのパイプラインを持つ単純なアプリケーションを例に挙げてみましょう。

最初のプラグインは、パイプラインの 2 番目のスロットに別のオペレーションをフックします。

アプリケーションとプラグインをまとめると、パイプラインを呼び出すことができます。

Batch

別の便利な機能は、単一のアイテムよりもバッチデータを同じパイプラインで処理できるようになったことです。

バッチ・パイプラインはパイプラインをラップして、すべてのアイテムですべてのオペレーションを呼び出します。

このオペレーションは、整数が必要な大きさのオーダーを持っているかどうかをチェックします。

パイプラインは、整数のバッチの大きさのオーダーをチェックするつもりです。

パイプラインは、失敗しなかった項目に対してのみ次の操作を呼び出します。

ハイパフォーマンス パイプライン

パイプライン デザインパターンは、より具体的でパフォーマンス重視のソフトウェアアーキテクチャも参照することができます。

いくつかのプロジェクトでは、パイプラインの各処理を専用のスレッドで実行することにより、膨大なデータの処理を最適化するためにパイプラインが使用されています。

各スレッドは、バッファとして機能する同時キューのデータを消費および生成します。

今回は、サーキットブレーカーによる非同期オペレーションを使用します。

操作が成功したら次を起動し、失敗したら終了します。

パイプラインはサーキットブレーカーを回避するように設計されています。 成功しても失敗しても、常に親パイプラインのシーケンスを継続し、次の操作を呼び出します。

シナリオは少し複雑なので、すべてを説明するつもりはありません。 アイデアは、受信した注文を処理するために異なるスレッドを持つことです。 注文の処理が終了すると、注文のステータスをチェックします。

各注文プロセッサーは専用のスレッドで分離されているので、データの格納方法を最適化でき、ロックを使用せずに直接メモリ アクセスが可能です。 同時実行の問題を気にすることなく、任意の残高を取得または更新できます。

パイプラインは、一連の処理をできるだけ高速に処理することです。

結論

Theipeline Design Pattern には、単純な Chain of Command からより複雑な Workflow まで、非常に多くの異なる実装方法があります。

Circuit-breaker, asynchronous or buffer など多くの機能が必要な場合がありますが、ほとんどの場合、パイプラインの実行フローにフックできるプラグインが欲しいときに、パイプラインが使用されるでしょう。

コメントを残す

メールアドレスが公開されることはありません。