データが見つからない場合にDB内のレコードをチェックするタスクを実行するワークフローがあり、1分間待ってからタスクを実行します。以下は、ワークフローからの抜粋です。
<intermediateCatchEvent id="BHTimer" name="Wait 1 Minute">
<incoming>BHNotActive</incoming>
<outgoing>IsTickOpen</outgoing>
<timerEventDefinition>
<timeDuration xsi:type="tFormalExpression">PT1M</timeDuration>
</timerEventDefinition>
</intermediateCatchEvent>
DB レコードが追加されても、このタスクが無限にループし続けることに気付きました。奇妙なことに、タスクが実行される頻度が 1 分から 200 ミリ秒に変更され、数百万のレコードが ACT_HI_ACTINST テーブルに蓄積されます。以下は、システム内の多くのそのようなプロセスの 1 つの表データ統計です。
数秒で、イベントは何千回も実行され、データベース テーブル「ACT_HI_ACTINST」および「ACT_RU_EXECUTION」の下に、同じジョブの何百万ものプロセス エントリが永遠に作成され続けます。
以下のクエリを実行すると、何百万ものレコードが返さ
れます。2. select * from ACT_RU_EXECUTION where PROC_INST_ID_ = 'f33c539a-dfe2-11e8-9d30-0050569941b2';
以下は、パフォーマンスの問題が発生したときのアクティビティ テーブルの統計です。
テーブル名 : レコード数
ACT_RU_EXECUTION: 3435162 ACT_RU_TASK: 318122 ACT_RU_IDENTITYLINK: 251334 ACT_RU_VARIABLE: 265008
テーブル名 : レコード数
ACT_HI_IDENTITYLINK: 2526867 ACT_HI_PROCINST: 54564894 ACT_HI_ACTINST: 28169298 ACT_HI_TASKINST: 4769590 ACT_HI_VARINST: 8711507
これらのプロセスの一部は孤立します (close が発行されたときにプロセスが終了していません)。私たちが気付いたもう 1 つのことは、そのようなプロセスの act_ru_job テーブルの例外メッセージです。「JobEntity [id=2786e249-dff6-11e8-a9c8-005056990bf2] は、別のトランザクションによって同時に更新されました」というメッセージが例外メッセージ列から出ています。
完了したプロセスに関連するデータを削除するためのパージ ジョブがあります (act_hi_procinst テーブルに end_time_ が入力されたプロセスですが、これらのプロセスは無限ループを終了しないため削除されません)。
ワークフローを調べたところ、並列実行パスが表示されないため、このエラーが発生する理由がわかりません。注意すべきことの 1 つは、これが 2 ノード クラスター環境に展開されていることです。両方のノードが同時に実行するプロセスを取得している可能性があります。
私たちの質問は次のとおりです。1. Activiti はどのようにしてプロセス実行クラスターを安全にしますか? クラスタ固有の構成はありますか? 2. デザイナーを使用して生成したワークフローに欠陥がありますか? 添付のワークフロー スニペット、図、およびアドバイスをご覧ください。ダイアグラム イメージ: https://i.stack.imgur.com/xMQWm.jpg。完全なワークフロー XML が必要な場合は、それも添付できます。文字数制限のため省略。
ワークフローは、BPMN Designer を使用して生成されます。Activiti バージョン: 5.17.0、データベース: Oracle、Web サーバー: Tomcat
これにより、本番環境で深刻なパフォーマンスの問題が発生しています。これを解決するための助けをいただければ幸いです。