2014-10-02 66 views
0

我正在設計一個應用程序,需要處理一個作業隊列,可以由任何工作服務器處理。作業存儲在數據庫中,並且類型不同。我對下面列出的設計有個想法:隊列,作業和調度程序 - 現有模式或庫?

每項工作都實現了IJob,並且子類型包含運行作業所需的所有屬性。工作人員將從數據庫中提取列表中的下一個作業,並開始處理它,並定期將進度記錄回數據庫。

工作需要添加到這個隊列的週期性基本上,這可能是每5秒,10秒,30秒,1分鐘,5分鐘,10分鐘,1小時...... 1年,2年(你得到的圖片) 。所以我需要某種形式的Cron工作來觸發這些事件。例如,可以每小時下載一個作業並從某個郵箱處理電子郵件附件。

我的理想解決方案是允許員工在沒有衝突的情況下複製和工作的模式,同時也不用擔心填充這些工作的「主工」。

我目前的設計涉及到一個單獨的數據庫表來跟蹤哪些「定期」作業已經完成,並且每個工作人員每秒都在該表上執行原子更新。如果定期工作需要創建並且尚未完成,則工作人員將創建它。每個工作程序將由一個Windows任務觸發,每秒設置爲運行一次。

我相信這應該都可以,但是我認爲這是一個很普遍的要求,必須有已知的圖案或工具,我不想重新發明輪子。

所以問題:

  • 我是不是重新發明輪子?
  • 我使用的模式是否合理,還是可以改進?
  • 是否有任何第三方庫爲.NET做到這一點?

當前堆棧是在具有MongoDB後端的Windows服務器(AWS EC2)上運行的.NET/C#。

回答

1

Quartz.NET似乎符合您的大部分標準爲'T'。包括所謂的東西,從字面上看,IJob;)。

結合使用模擬隊列的RabbitMQ或自定義數據庫表,您現在可以定期處理排隊的輸入作業。這就是說,如果你希望這是分佈式(即有多個服務器運行這些工作),你需要在Quartus.NET發行版中有一個SQL數據庫。似乎有MongoDB適配器可用,但我從來沒有使用過。

+0

石英是完美的。非常快速和易於使用,它使用MongoDb JobStore運行沒有問題。爲我節省了無數個小時!謝謝 – 2014-10-02 23:38:39

+0

你非常歡迎。 – 2014-10-06 15:51:30