Camunda BPMでDeadlockを曞くこずができたすかそしお私はできる

画像


いく぀かの時間前、私は曞いた CamundaにIBM BPMからの移行が成功に぀いお、そしお今、私たちの生掻は幞せで快適な感想がいっぱいです。カムンダは倱望するこずなく、このBPM゚ンゞンずの友情を続けおいたす。



しかし、悲しいかな、カムンダは䞍快な驚きをもたらす可胜性がありたす。そのため、最も明癜な結果が埗られない堎合がありたす。この蚘事では、その単玔さにもかかわらず、䞀芋したずころよりも興味深く、やや耇雑であるこずが刀明した1぀のケヌスを怜蚎したす。



私たちは猫を蚓緎したす



問題を説明するために、総合的な䟋を考えたす。クラむアントベヌスを拡倧するこずを決定し、猫ず猫にサヌビスを提䟛する必芁があるずしたしょう。すべおの朜圚的なクラむアントをチェックし、おそらく䜕かをすぐに提䟛する必芁がありたす。



候補者の信頌性ず候補者が提䟛できるサヌビスを確認したす。信頌性チェックず可胜なサヌビスは、いかなる方法でも関連付けられおいたせん。これらのアクションは䞊行しお実行できたす。抂略的には、bpmn図では、次のようになりたす。





図1.ふわふわのサヌビス



の抂略プロセスこの図は、ゲヌトりェむの分岐ず収集結合の䞻な手順を抂略的に瀺しおいたす。





このアむコンは䞊列ゲヌトりェむを衚したす。Parallel Gatewayは、プロセスの䞊列郚分を構築するための最も簡単なゲヌトりェむです。



䞊列ゲヌトりェむには次の2぀のタむプがありたす。



  • fork-ブランチごずに個別の実行を䜜成したす。
  • join-すべおの着信実行が完了するのを埅ちたす。


実行 -ドキュメントからプロセスむンスタンスの「実行パス」を衚したす。぀たり、それはプロセスの実行のスレッドです。



次に、タスクを少し耇雑にしたす。サヌビスの確認ず怜玢は次の方法で行いたす。最初にクラむアントの状態を確認し、次にクラむアントに適したサヌビスを確認しお、いく぀かの前凊理を行いたす。さらに、いく぀かのサヌビスは䞀床にクラむアントに適しおいる可胜性があるため、すべおのサヌビスをクラむアントに提䟛できるはずです。



私たちは毛皮で芆われたクラむアントず協力するので、バレリアン、クロヌレヌキ、マスタヌの枕、その他の䟿利なサヌビスが適切です。





グラフ2.掗緎されたFluffyカスタマヌサヌビスグラフ



プロセスの新しいバヌゞョンは次のようになりたす。このプロセスは、信頌性の怜蚌ず可胜な提案の怜玢ず䞊行しおいたす。怜玢も䞊列化されたす。この堎合、察応する条件が満たされるブランチが実行されたす。



条件ずの䞊列化では、包括的ゲヌトりェむが䜿甚され、次のアむコンで瀺されたす。





包括的ゲヌトりェむは、分岐条件を持぀䞊列ゲヌトりェむです。条件が真である分岐が実行されたす。



ゲヌトりェむには2぀のタむプがありたす。



  • fork-条件が満たされた各ブランチに぀いお、実行が䜜成されたす。これは、Parallel Gatewayでの実行ず同じ方法で䞊列に実行されたす。
  • 䞊列ゲヌトりェむずは異なり、joinはすべおのブランチではなく、条件がtrueであるブランチのみの実行を埅機したす。


実行されたチェックが䞍十分であり、クラむアントを再床チェックする必芁がある堎合がありたす。これを行うには、我々は非垞に初めに再怜蚌のために送信するこずができたすすべおのチェック、の終わりに条件を远加





ダむアグラム3.動䜜するはずプロセスの最終版



それは面倒でしたが、このプロセスは、問題を解決したす。



䜕どうした



ここで奇劙なこずが起こり始めたす。信頌性怜蚌ブランチが実行され、収集䞊列ゲヌトりェむに到達したす。これたでのずころ、すべお順調です。



2番目のブランチは材料の状態をチェックし、結果に応じお、察応するタスクが実行されたす。次に、プロセスは包括的ゲヌトりェむを収集するゲヌトりェむで停止し、それ以䞊移動したせん。CoockpitKamundaの管理パネルを芋るず、実行は収集むンクルヌシブゲヌトりェむずパラレルゲヌトりェむでハングしたす。





図4.サヌビスプロセスのスタックゞョブは



完了したした。Camundaのプロセスでデッドロックが発生したず蚀えたす。この堎合、䞊列プログラミングの理論からのデッドロックずデッドロックには盎接関係したせん。



̶̶̶̶̶̶̶̶̶̶̶̶の答えを求めお



䜕が起こったのか、なぜプロセスが停止したのかを十分に理解しおいないため、問題を経隓的に解決する必芁がありたした。



おそらく、包括的ゲヌトりェむのデフォルトブランチが必芁です。それがないず、プロセスは正垞に実行できたせん。



もちろん奇劙ですが、デフォルトのブランチを远加しおみおください。それ以倖の堎合は単䞀の条件が満たされない可胜性があり、゚ラヌが発生するため、デフォルトのブランチが存圚するこずをお勧めしたす。





図5.デフォルトのブランチ



を䜿甚したサヌビスプロセス開始しおも同じ結果が埗られたす-プロセスは包括的ゲヌトりェむでハングしたたたです。



次に、あらゆる皮類のパラメヌタを敎理し、ドキュメントを読んで、半日続けたす。次の詊みでは、プロセスは予期せぬ運呜のゲヌトりェむを通り抜けたす。むンクルヌシブゲヌトりェむを備えた䞋のブランチは、怜玢およびデバッグプロセス䞭に、クラむアントの信頌性チェックで䞊のブランチが削陀された状況で機胜したした。぀たり、包括的ゲヌトりェむを䜿甚しおプロセスが䞋䜍ブランチのみに瞮退するず、プロセスは終了したした。





図6.瞮退プロセス



Parallel Gatewayが䜕らかの圢で包含ゲヌトりェむに圱響を䞎えるこずがわかりたす。これは奇劙で非論理的であり、そうあるべきではありたせん。



これはどのようにしお可胜ですかParallel and Inclusive Gatewayが再びどのように機胜するかに぀いおの理論を再読する䟡倀があるでしょう。参加ゲヌトりェむが党員をたずめおプロセスを続行するには、䜕が必芁ですかむンタヌネット䞊では、包括的ゲヌトりェむ参加を収集するすべおの人が、「分岐」分岐から出たずきず同じ数の人々が入るのを埅぀ず曞いおいたす。次に、別の質問が突然発生したす。このカりンタヌはどのように機胜したすか



あなたは䜕者ですかどのように働きたすか



この問題は、パズルゲヌムやむンテリゞェントテレビ番組にふさわしいものです。テレビ番組でのみ、友達に電話をかけるこずができたす。䞀方、私も助けを求めるこずができたす。ビゞネスプロセスアヌキテクトをDenisず呌びたす。



-デニス、こんにちはプロセスが先に進む時が来るず、収集の通路がどのように決定するか教えおいただけたすか圌らはどこにでも曞いおいる「どれだけ出おきた-たくさん入るべきだ」しかし、圌はそれをどのように正確に考えおいたすか

-ずおもシンプル。 Camundaはアクティブな実行の数をカりントしたす。

- どうもありがずうございたす。ずりあえず、




䜕が起こったのか考えおみたしょう。 これを行うには、もう䞀床初期刀明スキヌム、リコヌル





デフォルトの枝ず図7ハンギング・プロセスを



簡単にするために、すべおの条件が満たされた堎合を考えおみたしょう。これらの条件が満たされた埌の3぀のタスクが実行されたずき、私たちは䜕を持っおいたすか



アクティブな実行はいく぀ですか䞋郚のブランチに3぀、䞊郚に1぀、クラむアントの信頌性を確認したした。Camundaは、これらが完党に異なる䞊列ブランチであるこずを気にしたせん。重芁なのはアクティブな実行の数のみであり、そのうち4぀があり、着信包括ゲヌトりェむは3぀しか受信したせんでした。



èš‚æ­£



状況を修正するには、収集ゲヌトりェむがすべおの実行を䞀床に収集する必芁があり、その埌、理論的にはプロセスが続行されたす。のではなく2はゲヌトりェむぞの参加の1を残しおみたしょう





図8のプロセスの修正版



悲しいかなは、プロセスを線集した埌、私の意芋では、あたり目立たないで、倖芳に始たりたした。しかし、圓初の蚈画どおりに機胜したした。このク゚ストは無事終了し、倉曎をプッシュしお家に垰るこずができたした。



楜しみは始たったばかりです



この蚘事を曞くために腰を䞋ろしお、このケヌスを説明できるプロセスの䟋を思い぀いたずき、私はがっかりしたした。プロセスは正垞に機胜し、デッドロックはありたせんでした。



最初は、䟋のCamundaバヌゞョンがプロゞェクトよりも高いず想定しおいたしたが、新しいバヌゞョンではこの問題はすでに修正されおいたす。しかし、カムンダをダりングレヌドしおも䜕も起こりたせんでした。ちなみに、すべおの䟋でバヌゞョン7.8.0が䜿甚されおいたす。これは最新のものずはかけ離れおいたすが、問題ではありたせん。この問題もチェックされ、最新バヌゞョン7.13で再珟されたした。



詊行錯誀により、問題は確立されたした。元の停の䟋には、私が職堎で開発しおいたプロセスずは異なり、逆分岐がありたせんでした。



リバヌスブランチが存圚する堎合、問題が再珟され、䞀皮のデッドロックが発生したすが、リバヌスブランチがないず、すべおが正垞に機胜したす。



ケヌスの理解ず分析が必芁です。これを行うには、カムンダBPMの゜ヌスを調べる必芁がありたした。-問題が包含ゲヌトりェむずあったので、この芁玠の振る舞いに責任があるクラスの答えを探すために、論理的に思えたInclusiveGatewayActivityBehavior。プロセスの䞡方のバヌゞョンでデバッグを数回実行した埌、私はそれがどのように機胜するかを理解したした。



それが明確でない堎合-゜ヌスを参照しおください



退屈なストヌリヌテリングを行わないようにするために、゜ヌスコヌドに基づくInclusiveGatewayの䜜業の説明は抂略図になりたす。察象ずなるロゞックは、executeメ゜ッドに集䞭しおいたす。この堎合、activatesGatewayメ゜ッドが最も䟡倀がありたす。私の理解では、InclusiveGatewayを通過できるかどうかを確認しおいたす。 executeメ゜ッドは、実行ごず実行䞭のブランチごずに呌び出されたす。私たちの堎合、そのようなブランチは3぀ありたす。぀たり、このメ゜ッドは3回呌び出されたす。



activatesGatewayメ゜ッドがどのように機胜するかを芋おみたしょう。よりよく理解するために、すべおの実行可胜なブランチに名前を付けたしょう。





図9.実行を䌎うプロセス図



私が理解しおいるように、メ゜ッドのロゞックは次のずおりです。このゲッティに来た凊刑の数ずこのゲッタりェむに含たれおいる矢の数が比范されたす。このチェックは、すべおの包括的ゲヌトりェむブランチが実行される最も単玔な状況の堎合に行われ、収集ゲヌトりェむをチェックするロゞックは、入力された実行の数が着信矢印の数ず等しくなるたで埅機するこずです。぀たり、最も単玔なケヌスでは、コレクションゲヌトりェむに入るブランチの数だけexecuteメ゜ッドが呌び出され、その埌プロセスが続行されたす。



今回のケヌスでは、着信実行の数が1から3に増えるため、このメ゜ッドは3回呌び出されたす。最埌の呌び出しでは、着信および発信実行の数はそれぞれ3および4になり、falseブランチをたどりたす。



条件が満たされない堎合、残りの実行は包括的ゲヌトりェむに属しおいるかどうかがチェックされたす。぀たり、アクティブな実行が結合包括ゲヌトりェむに到達する胜力がチェックされたす。



ここであなたは忍耐匷く、息を吐き、読む必芁がありたす。デヌヌメントは近いです



activatesGatewayメ゜ッドのfalseブランチでは、包括的結合の実行でただ到着しおいないすべおの呌び出しが、この結合に到達する可胜性に぀いおチェックされたす。少なくずも1぀の実行が包括的ゲヌトりェむに぀ながる可胜性がある堎合は、それを考慮に入れお、この結合に到達するたで埅機する必芁がありたす。結合に぀ながる可胜性のある実行がない堎合、メ゜ッドはtrueを返したす。



最も興味深い郚分は来おいたす。䞀芋するず、最埌の実行図では-実行1は包括的ゲヌトりェむに぀ながりたせん。しかし、この怜蚌に携わっおいるcanReachActivityメ゜ッドの実装を怜蚎する䟡倀はありたす。この芁玠のこの動䜜の理由は明らかになりたす。



コヌドのすべおの詳现を砎棄するず、このメ゜ッド内でisReachableメ゜ッドが再垰的に呌び出されたす。このメ゜ッドは、この実行が収集䞭のInclusiveGatewayに到達する可胜性を段階的にチェックしたす。逆ブランチはそのような機䌚を䞎えるだけであり、悲しいこずに、これは考慮されたすが、すべおの結合の埌に戻るので、考慮されたせん。



その結果、包括的ゲヌトりェむは次の実行を埅っおいたす。したがっお、䞀皮のデッドロックが発生したす。原則ずしお、芏則を砎棄するず、叀兞的なデッドロックが発生したす。Parallelでの結合は、包含を含むブランチが実行されるのを埅ち、逆に、包含を含むブランチはParallelが実行されるのを埅ちたす。



以䞋の図は、パラレルブランチを介しおPrallelゲヌトりェむに参加するようになった実行からの包括的ゲヌトりェむ参加の可甚性をチェックするおおよその方向を瀺しおいたす。





図10.䞊列結合から包含結合ぞの可胜なパス



この図は、実際に䞊列ゲヌトりェむ結合から結合包含ゲヌトりェむが利甚可胜であるこずを瀺しおいたす。CamundaBPMロゞックによるず、それはすでに「先に円がある」こずを意味したせん。



理由を芋぀けた埌、無意識のうちに問題が発生したしたこれはバグですか、それずも機胜ですか私の意芋では、これはバグです。珟圚、カムンダチヌムにレポヌトを送信するための情報ずケヌスを収集しおいたす。



問題がロヌカラむズされおいるのは良いこずです。しかし、今はどうですか



実際、今-結論



  1. 事前譊告は前もっお行われたす。カムンダのこの振る舞いを考慮に入れおプロセスを構築する必芁がありたす。
  2. , . parallel join.
  3. Inclusive Gateway , , executions .
  4. , . , Parallel Gateway .


単玔さず明快さを誀解しおいるように芋えるこずがありたす。これは、知識の蓄積ず耇補を通じおのみ察凊できたす。悲しいかな、この問題を解決した圓時、私は包含的結合のロゞックに぀いお深い知識を持っおいなかったので、いじくり回さなければなりたせんでした。私はこの知識を詊行錯誀し、友人に電話し、゜ヌスをデバッグしたした。



これらすべおから、䜿甚するツヌルがどのように機胜するかを理解する必芁があるこずは明らかであり、新しい結論には皋遠いものです。よく理解すればするほど、そのような問題は少なくなりたす。



2番目の結論も明らかです。コヌドだけでなくプロセスも分解する必芁がありたす。



このケヌスの解析ず蚘事の䜜成に圹立぀リンク



  1. Camunda BPM゜ヌス
  2. 包括的ゲヌトりェむゞョブの説明
  3. パラレルゲヌトりェむゞョブの説明



All Articles