2013-12-12 37 views
4

前言:我正在嘗試將我認爲是非常常見的用例的提案放在一起,並且我想使用Amazon的SWF和SQS來完成我的目標。可能有其他服務能夠更好地匹配我想要做的事情,所以如果您有任何建議,請隨時將它們拋出。基於SQS消息觸發SWF工作流程

問題:最基本的需求是需要客戶端(移動設備,Web服務器等)發佈消息,該消息將被異步處理而不會響應客戶端 - 非常基本。

預期的實現是讓客戶端將消息發佈到預先確定的SQS隊列。那時,客戶端就完成了。我們還將擁有一個定義的SWF工作流程,負責從隊列中提取消息並(在某些操作之後)將其放入Dynamo DB中 - 這一切都非常簡單。

雖然我似乎無法弄清楚,但如何觸發工作流程開始。從我一直在閱讀的工作流程來看,並不是一個無限期的過程。它有一個開始,一箇中間和一個結束。根據SWF文檔,工作流程可以運行不超過一年(Setting Timeout Values in SWF)。

所以,我的問題是:如果我假設一個工作流表示一個消息處理流程,那麼每當消息發佈到SQS時如何啓動工作流?

注意:我已經研究過使用SNS代替SQS。這將允許我運行可訂閱SNS的服務器,然後在發佈通知時啓動工作流程。這當然是一種解決方案,但我想避免爲單個Web服務設置服務器,然後根據正在處理的消息數量來管理/縮放。我首先考慮使用SQS/SWF的原因是有一個自動縮放系統,我不必擔心。

預先感謝您。

+0

對於什麼是值得的,您可以對Amazon SNS進行評分以減少縮放問題。請參閱以下設置:http://docs.aws.amazon.com/sns/latest/dg/DeliveryPolicies.html#delivery-policy-maximum-receive-rate – brightball

回答

5

我會創建一個工作進程來監聽SQS隊列。收到消息後,它會調用SWF API來啓動工作流程執行。應該根據消息內容生成工作流執行ID,以確保重複的消息不會導致重複的工作流。

+0

這幾乎是我們通過一些小的變化完成的。感謝您的迴應。 – Merwer

2

您可以將AWS Lambda用於此目的。一個lambda函數將被SQS事件調用,因此您不必顯式編寫隊列輪詢器。然後,lambda函數可以向SWF發出發佈請求以啓動工作流程

+2

是的,事情可能有點不同 – Strawberry

+0

lambda是否必須運行整個工作流程運行?或者它只需要*啓動*工作流程(然後lambda可以退出)? –

+0

它只需啓動工作流程。但工作流程(決策者)工作人員仍然需要一直運行。不幸的是,SWF團隊仍然不支持作爲lambda函數運行的決策者。 –