ワークフローの並列度の調整
ワークフローの処理の仕組み
ワークフローは Kafka を使用してタスクを非同期に処理します。イベントが発生すると、システムは対応する Kafka Topic にメッセージを書き込み、ワークフローのコンシューマーサービスが読み取ってフローを実行します。実行中は、ワークシートなどの業務サービスの呼び出しや、データベースの読み書きも行います。
タスクが集中的に発生すると、Kafka がメッセージを一時的に保持し、業務サービスとデータベースへの瞬間的な負荷を軽減します。メッセージの滞留数が継続的に減少し、業務で許容される時間内に処理を完了できる場合は、並列度を変更する必要はありません。
ワークフローのコンシューマーサービスは、md-workflow-consumer コンシューマーグループで次の Topic を読み取ります。
| Topic | 用途 |
|---|---|
WorkFlow | メインフローの実行 |
WorkFlow-Process | サブフローの実行 |
WorkFlow-Router | ワークフローの低速キュー |
WorkFlow-Batch | ワークフローの一括実行 |
WorkFlow-Button | ボタンで起動したワークフローの実行 |
WorkSheet | 行レコードがワークフローの起動条件を満たすか確認 |
WorkSheet-Batch | 行レコードがワークフローの起動条件を満たすか一括確認 |
WorkSheet-Router | 低速キューで行レコードがワークフローの起動条件を満たすか確認 |
Kafka Topic は1つ以上のパーティションで構成されます。同じコンシューマーグループ内では、1つのパーティションを同時に割り当てられるコンシューマーは1つだけです。ワークフローで並列に処理できるパーティション数は、Topic のパーティション数、各コンシューマーサービスのスレッド数、インスタンス数で決まります。
パーティション数とコンシューマースレッドの総数を対応させる必要があります。Topic が10パーティションの場合、20スレッドを設定しても、パーティションを割り当てられるのは10スレッドだけです。Topic が20パー ティションでもスレッドが5つしかない場合は、同時に処理できるのは5パーティションだけです。
クラスターモードでは、コンシューマースレッドの総数は、各インスタンスのスレッド数とインスタンス数の積になります。実際に処理に参加するスレッド数は、Topic のパーティション数を超えません。
Topic のパーティション数を増やしても、既存のメッセージは再分配されません。滞留中のメッセージは元のパーティションで処理を待ちます。追加したパーティションには、拡張後に書き込まれた新しいメッセージだけが分配ポリシーに従って入ります。そのため、拡張直後に既存パーティションの LAG が減るわけではありません。
調整方法
ワークフローの並列度を上げる前に、データベースがより高い同時実行負荷に耐えられるか確認してください。CPU やディスク I/O の使用率が高い場合や、スロークエリが多い場合は、Kafka のパーティション、コンシューマースレッド、サービスインスタンスを増やすと、データベースの負荷がさらに増加します。
MongoDB のスロークエリ最適化を参照し、スロークエリ、インデックス、クエリ条件、サーバーリソースを確認してください。データベースのボトルネックを解消してから、ワークフローの並列度を調整します。