4

分散ワークフロー システムを構築するためのオプションとして、Amazon SWF を評価しています。主な言語は Java になるため、Flow フレームワークは当然の選択です。私を困惑させ続けていることが 1 つだけあります。それをアーキテクチャの重要なコンポーネントとして推奨する前に、他の意見をいくつか得たいと思います。

例はすべて、決定論的で比較的短い時間 (つまり、数分後) の後に結果を生成するタスクに関するものです。実際のビジネス ワークフローでは、問題は異なって見えます。ここでは、完了までに数週間かかる可能性があるタスクがあります。私はすでに計算機をチェックしましたが、30 日ほど存続するワークフローはコストの爆発につながらないため、その可能性はすでに考慮されているようです。

このようなシナリオで SWF を使用した経験を共有できる人はいますか? このようなワークフローを設計するための推奨事項やベスト プラクティスはありますか? フローはここで正しい選択ですか?

アクティビティの実装は最終的に同期的に値を返すことが期待されているように思えますが、長時間実行されるトランザクションの場合は、メッセージを使用してワーカーの結果を非同期的に送り返すことをお勧めします。

役立つフィードバックをお待ちしております。

4

1 に答える 1

3

Amazon Simple Workflow Serviceの観点からは、アクティビティの実行は API 呼び出しのペアであり、PollForActivityTaskタスクRespondActivityTaskCompletedトークンを共有します。同じスレッド、プロセス、またはホストからの呼び出しについては、要件はありません。

デフォルトでは、 AWS Flow Frameworkはアクティビティを同期的に実行します。@ManualActivityCompletionアノテーションを使用して、アクティビティ メソッドが返されたときにアクティビティが完了していないことを示します。このようなアクティビティは、 provided を使用して明示的に完了する (または失敗する) 必要がありますManualActivityCompletionClient

AWS Flow Framework 開発者ガイドからの例を次に示します。

@ManualActivityCompletion
public String getName() {
    ActivityExecutionContext executionContext = contextProvider.getActivityExecutionContext();
    String taskToken = executionContext.getTaskToken();
    sendEmail("abc@xyz.com", 
         "Please provide a name for the greeting message and close task with token: " + taskToken);
    return "This will not be returned to the caller";
}

public class CompleteActivityTask {

    public void completeGetNameActivity(String taskToken) {

        AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(…); //pass in user credentials
        ManualActivityCompletionClientFactory manualCompletionClientFactory = new ManualActivityCompletionClientFactoryImpl(swfClient);
        ManualActivityCompletionClient manualCompletionClient 
       = manualCompletionClientFactory.getClient(taskToken);
        String result = "Hello World!";
        manualCompletionClient.complete(result);
    }

    public void failGetNameActivity(String taskToken, Throwable failure) {        
        AmazonSimpleWorkflow swfClient
           = new AmazonSimpleWorkflowClient(…); //pass in user credentials
        ManualActivityCompletionClientFactory manualCompletionClientFactory 
           = new ManualActivityCompletionClientFactoryImpl(swfClient);
        ManualActivityCompletionClient manualCompletionClient 
           = manualCompletionClientFactory.getClient(taskToken);
        manualCompletionClient.fail(failure);
    }
}

アクティビティが使用して実装されること@ManualActivityCompletionは、実装の詳細です。ワークフロー コードは、同じインターフェイスを介してそれを呼び出し、同期的に実装されたアクティビティとは異なる方法で処理しません。

于 2012-12-28T21:17:47.553 に答える