皆様、夏休みいかがお過ごしでしょうか?
今日は、夏休みっぽく?、自由研究ネタ(誰得?)でASTERIAの内部アーキテクチャのお話しをちょろっと。
サブフローとパラレルサブフローのお話しです。
ASTERIA WARP 4.7で実装されたパラレルサブフローとは、従来のサブフローとどう違うのか?
一番の大きな違いは、各サブフローがマルチスレッドで実行されるか、シングルスレッドで実行されるかです。
図1の様にこれまでのサブフローの場合は、実行時に親フローとその親フローに含まれるすべてのサブフローが展開されて1つのスレッドで実行されます。そのため、複数のサブフローやサブフローが繰り返し呼ばれる場合でもすべて直列に実行されます。
対してパラレルサブフローの場合、親フローから呼ばれるサブフローは、すべて個別のスレッドとして実行されるため、繰り返し呼ばれるサブフローをパラレルサブフローとした場合、マルチコアCPU、マルチCPU環境などでは、処理の並列化によるスループットの向上※1が可能となります。
ただ、お気づきの方もいらっしゃるかと思いますが、親と子を同じスレッドで処理する構成をとってしまうと同時実行数には限りがありますから、Dead Lock(親から呼ばれた子が待ち行列に入ってしまい、親がいつまでも終わらないなど)の発生が懸念されます。
もちろん、ASTERIAでは、そういう事態を避けるため、図2の様に親フロー用のキューとスレッド、パラレルサブフロー用のキューとスレッドを別立てでご用意しています。これにより、パラレルサブフローの処理状況に影響されることなく他のフローの処理が継続できます。
他にも処理の並列化の方法として、TimerコンポーネントやFlowInvokerコンポーネントがありますが、これらの動きは、上記とは、ちょっと違いますので、また機会があればご紹介したいと思います。
ご覧のようにASTERIA WARPでは、大規模トランザクションでもご活用いただけるようフローエンジンの改良を重ねています。
※1 処理内容や実行時のシステムリソース状態によっては、逆効果のケースもあります。