我剛開始使用AWS Ruby SDK來管理簡單的工作流程。我立即注意到的一種行爲是,在提交新的工作流程執行之前,至少有一名相關工作人員和一名相關決策人員正在運行。亞馬遜SWF:至少有一名員工需要跑步,爲什麼?
如果我在啓動我的工作人員和決策者之前提交新的工作流程執行,那麼即使我仍處於超時限制內,任務也不會被提取。爲什麼是這樣?根據HTTP長輪詢如何工作的描述,我希望任何應用程序在調用poll()時都能接收相關任務。
作業失敗後(例如,由於工作人員或決定器錯誤,或由於終止),我遇到其他死鎖情況。有時候,重新運行甚至只是開始一個全新的工作流程執行,都會導致工作流執行死鎖。 AWS控制檯的工作流程執行歷史記錄中顯示了初始決策任務,但決策者從未收到它們。無可否認,我在確認/減少這個問題時遇到了麻煩,但我懷疑它與上述問題有關。這大概發生在10%到20%的時間;剩下的時間,一切正常。
一些其他的事情要提到的是:我使用單個任務列表來執行按順序運行的兩個單獨的活動任務。工作人員和決策者都在輪詢相同的任務列表。
這裏是我的工人:
require 'yaml'
require 'aws'
config_file_path = File.join(File.dirname(File.expand_path(__FILE__)), 'config.yaml')
config = YAML::load_file(config_file_path)
swf = AWS::SimpleWorkflow.new(config)
domain = swf.domains['test-domain']
puts("waiting for an activity")
domain.activity_tasks.poll('hello-tasklist') do |activity_task|
puts activity_task.activity_type.name
activity_task.complete! :result => name
puts("waiting for an activity")
end
編輯
在AWS論壇另一位用戶評論說:
我認爲原因是SWF不能立即識別長輪詢連接關閉。當你殺死一名工人時,它的連接一段時間可以被服務認爲是開放的。所以它仍然可以派遣一個任務給它。對你來說,看起來新員工從來沒有得到它。驗證它的方法是檢查工作流歷史記錄。您將看到活動任務啓動事件,其中包含死亡工作人員的主機和PID。最終這樣的任務將會超時並且可以由決策者重新嘗試。
請注意,在頻繁終止連接的單元測試期間,這種情況很常見,對於任何生產應用程序來說都不是問題。常見的解決方法是對每個單元測試使用不同的任務列表。
這似乎是一個相當合理的解釋。我會試着證實這一點。
感謝您的詳細解釋。我認爲我一直在做錯事,但看起來像所有事情都按預期工作或多或少。我沒有得到自己寫測試。 – Tom 2013-02-24 18:59:56
快樂是我的,我做了一個爆炸,最終學到了一些東西。 – oozie 2013-02-26 20:35:07
這有助於。謝謝 – Tzu 2015-07-29 18:27:31