2016-02-18 15 views
0

我不熟悉AWS,但它是我們使用的堆棧,因此需要在AWS上運行。如何添加EC2節點並讓他們從共享工作池開始拾取?

我沒有看到AWS工具集中的任何內容幫助我啓動另一個EC2節點,然後自動處理將一堆任務分配到新節點的任務。

因此,作爲一個例子,我可能會有一堆請求來創建斐波納契數字。最初,單個EC2節點上的單個JVM可能啓動,竊取一批數字以處理並處理它們。

隨着負載的增加,第二個節點可能啓動,它的JVM會竊取下一批要處理的數字。

注意:沒有單個號碼必須多次處理,理想情況下。奇怪的重複並不重要,但是我們需要避免在整批工作上發生衝突。

我可以將任務存儲在RDS中,也可以存儲在DynamoDB中。然後,我必須將條目標記爲由特定EC2節點保留進行處理,並在完成後將其清除。更糟糕的是,如果EC2節點停機並留下一些標記爲處理的條目,則必須具有某種恢復邏輯。

我可以使用非AWS-y之類的東西,比如Redis,並通過JVM分配內存中的數據。我仍然需要在某些時候堅持參賽作品,因爲它們需要持久耐用,但這可能會更有效果。

我想我認爲這必須是一個非常普遍的要求:共享狀態並在越來越多的節點上處理它,必須有一個解決方案已經存在。

+0

請參閱:https://aws.amazon.com/documentation/autoscaling/ – alfasin

+0

我沒有看到任何解決共享狀態或從池中分配工作的內容。 – fiddlesticks

+0

假設您的ASG中的所有節點都配置了相同的AMI,您可以基於CPU使用情況或其他可用的watchwatch指標創建自動縮放規則,這樣當您的ASG超載時,AWS會自動啓動新實例。如果您沒有將實例邏輯烘焙到AMI中,也就是說,如果您添加的任何新實例需要手動安裝和配置 - 那麼AFAIK無法在沒有手動干預的情況下進行自動調整。 – alfasin

回答

0

要完成的任務應該發佈到SQS隊列中。在每個實例上完成工作的應用程序將從隊列中消耗。如果啓動新的EC2實例,它將開始從隊列中消耗。一旦任務成功完成,應用程序可以將其從隊列中刪除。如果任務沒有成功完成(實例被終止或應用程序意外死亡),則該任務將保留在下一個使用應用程序的隊列中。

請注意,SQS保證消息將「至少傳送一次」(https://aws.amazon.com/sqs/faqs/),因此您的應用程序應該能夠適當地處理重複任務。

另外,您可以根據SQS隊列的大小設置自動調節策略,以便在高峯負載時間消耗所有任務。

+0

這很有趣 - 這可能適用於斐波納契示例。然而,我還有一個額外的複雜因素:工作是基於時間的 - 即在時間1時,執行一組任務A,然後在時間2執行一組任務B.實際上,我的任務是將消息發送到消息隊列......但是隻能在調用者設置的時間間隔內進行。有點像鬧鐘。 – fiddlesticks

+0

如果你有兩組任務(A和B),你可以使用兩個SQS隊列。然後您的應用程序可以在設定的時間段內從相應的隊列中消耗。 (您可以使用第三個SQS隊列作爲消息目標隊列。) – jbird

相關問題