2011-06-20 121 views
5

現在,我們有一臺帶cronjob選項卡的單個服務器,每天發送電子郵件。我們想擴展那臺服務器。該應用程序是部署在亞馬遜雲中的centos服務器上的標準zend框架應用程序。通過多臺服務器擴展cronjob

我們已經負責負載平衡,內容管理和管理部署。然而,cronjob對我們來說仍然是一個問題,因爲我們需要授予某些工作只執行一次。

例如,每天的電子郵件cronjob只能由一臺服務器執行一次。我正在尋找最好的方法,只有一臺服務器只會執行一次。

我在想2種解決方案,但我想知道是否有其他人有同樣的問題。

  1. 使其中一臺服務器「主」,誰只發出每日電子郵件。這將是一個問題,如果服務器故障,並且我們通常不想擁有「特殊」服務器。這也意味着我們需要跟蹤哪個服務器是主服務器。
  2. 有一個要執行的計劃任務隊列。每個服務器打開該隊列並查看需要執行哪些任務。第一個「抓住」任務的服務器將執行任務並將其標記爲完成。我在查看亞馬遜簡單排隊服務作爲隊列的解決方案。

這兩種解決方案都有優點和缺點,我想知道是否有人想到可能幫助我們的其他人。

+1

這可能會更好地ServerFault服務? –

回答

5

當你需要進行擴展,cron作業,你是關閉使用任務管理器一樣Gearman

+1

您可以使用PHP與gearman。 – datasage

+0

謝謝,我看到了原生的php庫。看起來有趣。 – aporat

+0

+1爲Gearman,它很好地與PHP集成。我們使用它進行大量跨平臺通信,數據庫之間的ETL用於遷移數據,發送電子郵件,跟蹤用戶活動等等。只有我發現,儘管可以運行多個Gearman客戶端,但Gearman服務器核心進程本身並不會擴展,所以最終不得不運行多個服務器,可能調用不同的客戶端分類以訪問某些工作而不是其他人。 – iandouglas

0

我有同樣的問題。我做的事很簡單。

  1. 我創建了AWS上最便宜的EC2實例。
  2. 我只在此服務器上創建了cronjob(s)。
  3. cron作業只運行僅對我的端點/ api(即api.mydomain.com)發出簡單請求的作業。
  4. 在我的api上,我只是有一條路線來監視這些特殊請求,以便執行我想要的工作。所以基本上,我所做的一切,而不是使用cronjob運行任務,即時通過http請求運行任務。

我希望有道理!現在,你有多少臺服務器並不重要,它只會擴展!另外,你的cronjob服務器的唯一功能是運行死了的簡單作業來發送請求,僅此而已。