2015-04-27 87 views
2

這可能是一個愚蠢的問題,但我現在有一個很大的心理障礙。我看不到我的SQS隊列和將處理消息的EC2實例之間的連接。在亞馬遜上處理郵件

也就是說:客戶端完成網頁上的表單(此網頁託管在EC2實例中),並將該表單作爲消息發送到SQS隊列。之後,我的雲應用程序的目標是獲取消息的表單信息並使用該信息運行.sh。這個過程的一個例子顯示,在未來的畫面:

enter image description here

那麼,怎樣才能我的SQS隊列運行在EC2實例.SH?我想通過Python-Boto解決這個問題的唯一方法就是創建一個「監聽者」來不斷地閱讀這些消息並用這個消息「做些什麼」。

while 1: 
    m = conn.receive_message(
     q, 
     number_messages=1, 
     message_attributes=['configName'], 
     attributes='All' 
    ) 
if not m: 
    time.sleep(5) 
else: 
    a = str(m[0].message_attributes.get('configName').get('string_value')) 
    rh = str(m[0].receipt_handle) 
    # Processing the message in a EC2 instance 
    conn.delete_message_from_handle(q, rh) 
    time.sleep(5) 

因此,如在上面的代碼中看出,我讀消息的屬性(在這種情況下,只有一個爲簡單起見),我必須處理它。

如何在不同的EC2實例中並行處理傳入消息?我不明白,因爲我只有一個偵聽器,並且如果偵聽器正忙於處理一條消息,它將不會處理任何其他消息,直到它完成第一條消息。我希望聽者並行處理任何數量的消息(當然,取決於實例的數量和我要支付的賬單)。我如何知道哪個EC2實例將運行我的.sh程序?

還有另一種方法可以使用任何Amazon服務以更簡單的方式執行此操作?

感謝

+0

你可能想看看這裏:https://wiki.python.org/moin/ParallelProcessing –

+0

您也可以看看這個答案:HTTP: //stackoverflow.com/a/20549090/1851986 –

+0

如果您希望多個EC2實例並行處理消息,則需要從隊列中讀取多個實例。只要每個工作人員讀取消息,在處理過程中使其不可見,然後在完成工作時刪除消息,則可以根據需要獲取儘可能多的工作者實例。 – garnaat

回答

2

那麼,怎樣才能我的SQS隊列運行在EC2實例.SH?

它看起來像你有這個問題回答你自己的代碼。

我想通了與Python,寶途這樣做的唯一途徑,是建立一個 「監聽器」,不斷與 該消息讀取消息和「做一些事情」。

是的,這就是隊列的工作原理。

如何在不同的EC2 實例中並行處理傳入消息?

只需運行該代碼處理多個EC2實例消息

我不知道怎麼樣,因爲我只有一個聽衆,如果聽衆 忙於處理一個消息,它在 完成第一個之前,將不會處理任何其他信息。

這對您的單線程是正確的。所以你可以創建多個運行該循環的線程。您還可以創建多個進程,這些進程中有這些線程(在同一個VM或多個VM上)。

如何知道哪個EC2實例將運行我的.sh程序?

你不知道。無論哪個EC2實例採用它都會運行它。這通常是通過隊列解耦前端和後端處理的預期行爲。

還有另一種方法可以使用任何Amazon服務以更簡單的方式執行此操作?

不,這種方法是最簡單的,假設您試圖從前端Web服務器分離和/或卸載支持的處理。我不認爲這很複雜。

此外,刪除你的睡覺,而是使用long polling

+0

這就是我所說的心理障礙。我只需要在正在運行的實例中運行偵聽器,並且每個實例都將並行處理消息。謝謝 – VinsanityL