2017-02-26 82 views
0

我們有一個運行環回的Node.js應用程序,其主要目的是處理從客戶端接收到的訂單。目前整個訂單流程在單個http請求期間進行處理,包括付款,插入數據庫和發送確認電子郵件等。如何避免同一隊列作業在Heroku上的多個dynos上進行縮放時多次處理

我們發現此方法雖然在此刻工作,但缺乏可擴展性 - 應用程序將需要處理,可能每分鐘處理數千個訂單。另外,我們的訂單流程目前正在將數據寫入我們自己的數據庫,但是我們現在正在考慮第三方集成(直到系統),我們無法控制速度或可用性。

此外,我們目前也有潛在的競爭條件;我們必須爲每個訂單分配一個「短代碼」以方便客戶參考 - 這些代碼需要旋轉,所以如果起始數字爲1,最大數量爲100,則必須爲第101個訂單指定數字1.此刻我們正在查看以前的訂單,並將以前的訂單增加1或將其重新設置爲開始 - 顯然由於流量較低,此時此時處於良好狀態 - 但是,隨着我們擴大規模,可能會導致多個訂單分配相同參考編號。

因此,我們想實現一個隊列來管理所有這些。我們的應用程序目前部署在Heroku上,我們已經使用工作進程來處理我們的應用程序需要的每月數量。在閱讀了關於實現隊列的一些Heroku文章(https://devcenter.heroku.com/articles/asynchronous-web-worker-model-using-rabbitmq-in-node,https://devcenter.heroku.com/articles/background-jobs-queueing)之後,我們不清楚如何在多個工作者dynos上確保處理這些排隊項目的順序,並且相同作業的處理不會超過一次由多個dynos。處理的順序並不重要,但是重複性的缺乏是非​​常重要的,就像兩個命令同時處理一樣,我們就會面臨上述競爭條件的風險。

所以基本上我的問題是這樣的;我們如何避免在Heroku上跨越多個dynos進行縮放時不止一次處理相同的隊列作業?

回答

2

您需要的是RabbitMQ提供的,Heroku的CloudAMQP插件使用的消息代理。

你不需要擔心多個工人的競爭狀況。存儲在隊列中的作業將被存儲,直到消費者檢索爲止。當工作人員從隊列中消耗工作時,其他工作人員將無法使用它。 RabbitMQ管理消息隊列範例的所有這些方面。

的幾個環節爲您的項目有用:

+0

見http://stackoverflow.com/questions/35946177/node-js-message-queue- on-heroku/36029289#36029289關於如何在Heroku上設置與node.js的指示。 –

+0

此答案不解決OP所要求的「完全一次」交付。 – idbehold

+0

@idbehold該隊列確保「準確一次」交付。湯姆,三位數碼的旋轉對於十進制編碼是有問題的。您一次只能有999個理論上的未平倉訂單。稍好一點的選項是使用不同的基本編碼。例如,如果您使用base58編碼(http://stackoverflow.com/a/18949941/673882),則只需使用三個字符即可將該數字增加到超過195,000個組合。如果您的意思是這些參考號碼是永久存儲的以引用內部訂單號,那麼該解決方案就不會起作用。 –

相關問題