1

Amazon SWF を使用してワークフローを作成していて、ダウンストリーム サービスで TPS を制御する方法を考えていました。

並行して実行される複数の子ワークフローを開始する親ワークフローがあります。

私の子ワークフローは、いくつかのダウンストリーム サービス (それぞれが異なるアクティビティ内) を呼び出します。

  1. ダウンストリーム サービス 1 を呼び出します。成功した場合は続行し、失敗した場合は終了します
  2. ダウンストリーム サービス 2 を呼び出します。成功した場合は続行し、失敗した場合は終了します

ダウンストリーム サービスの TPS を個別に管理できるようにしたいと考えています。

ダウンストリーム サービスで TPS を制限するにはどうすればよいですか? たとえば、理想的には、ダウンストリーム サービス 1 に 100 の最大 TPS が必要であると言えます。非同時コンテキストでは、Guava RateLimiter のようなものを使用できますが、これは複数のホストで実行されます。特定のアクティビティのインスタンスを一度に 100 個だけ実行するように指定できますか? フロー フレームワークでそのための注釈を見つけることができませんでした (フロー フレームワークと Spring を使用しています)。必要に応じて、子ワークフローを個別のワークフローに分割し、親ワークフローで各子ワークフローを次々と呼び出すようにします。

子ワークフロー:

1. take entity id as input
2. call dependent service 1 workflow
3. return

次に、上記が正常に完了すると、親ワークフローは依存サービス 2 を呼び出す次の子ワークフローを呼び出します。失敗すると、親ワークフローは終了します。

特定の依存サービス ワークフローまたは特定のアクティビティのインスタンス数に同時実行制限を設定することは可能ですか? これはタスクリストの良い/潜在的な使用法ですか? ワーカー ホストの数によって TPS を制御できますか?

ご提案ありがとうございます。

4

1 に答える 1

2

SWF は、アクティビティ実行のレート制限をネイティブにサポートしているとは思いませんし、タスク リストの正確な最大タスク配信レートをサポートしているとは思いません。

別の方法は、ワーカー レベルでレート制限を実装することです。ActivityWorkerはすでにsetMaximumPollRatePerSecondによるレート制限をサポートしています。1 つのワーカーが呼び出しレートを維持できる場合、このワーカーをマスターとして選択し、 suspendPollingを介して他のすべてのワーカーを一時停止すると、問題が解決します。複数のワーカーが必要な場合は、複数のマスターが同時にアクティブになり、それぞれのレートが全体のレートの一部に制限されます。

個別の SWF ワークフローを使用して、ワーカーをマスターとして選択できます。マスター選択ワークフローの基本的な考え方は、GetLockアクティビティを使用することです。それを実行するホストは、マスターと見なされます。このアクティビティのハートビート タイムアウトは小さく (たとえば 20 秒)、全体的なタイムアウトは大きくする必要があります。したがって、それを所有するホストは、ロックを維持するために少なくとも 20 秒ごとに 1 回ハートビートする必要があります。何らかの理由でワークフローのハートビートに失敗した場合、ワークフローは失敗し、他のホストが取得するアクティビティを再スケジュールします。

于 2015-05-29T03:27:24.620 に答える