2012-11-17 122 views
3

我想在Mongo中實現一個工作隊列。整個軟件系統都是基於Mongo的,所以它看起來很自然,很可能很適合。作業隊列的正確mongo模式設計是什麼?

作業集合將每個作業狀態存儲爲文檔。我想這是基於我的查詢需求的不受限制的集合。該工作文件如下所示:

{ 
    "_id" : ObjectId("50a6742ee4b0a9a1c2cb4fd4"), 
    "type" : "archive_job", 
    "state" : 2, 
    "priority" : 1, 
    "timing" : { 
     "submitted": ISODate(...), 
     "running": ISODate(...), 
     "completed": ISODate(...), 
     "failed": null, 
     "cancelled": null 
    }, 
    payload: { 
     ...job-specific JSON... 
    } 
} 

典型的訪問爲工作模式收集將是:

  • 發現未處理的作業執行基於類型,狀態優先,可能還有一個範圍查詢timing.submitted大於previo我們閱讀時間
  • 找到所有處理(已完成,失敗取消)工作
  • 找到所有未處理(已提交,正在運行的)工作
  • 通過_id找到具體的工作,並檢索其有效載荷(當狀態運行

大部分查詢將查找需要執行的未處理作業。將有效載荷移動到作業_payload集合是否值得,因此文檔大小在作業集合中變化不大?

大量的處理(完成,失敗,取消)與未處理的作業相比,最終是否會增加作業作業集合所需的工作集內存?即使使用正確的索引,未處理的作業執行的訪問時間是否會減慢?

我可以在模式設計中做些什麼和權衡?

回答

0

將有效載荷移動到jobs_payload集合中是否值得,因此文檔大小在作業集合中的變化不會很大?

通常嵌入是在mongodb中的正確方法,在你的情況下它看起來很好。

大量的處理(完成,失敗,取消)與未處理的作業相比,是否會最終增加作業集合所需的工作集內存? 即使使用正確的索引,未處理的作業執行的訪問時間是否會較慢?

雖然數據庫適合內存放緩不會被注意到。

您的架構看起來不錯。作爲一個例子,你可以看看celery(它有一個mongodb後端)架構。

+0

我同意在Mongo中強調嵌入文檔。在我的情況下,不會嵌入* payload *字段增加每個文檔在** jobs **集合中的存儲量,從而減少讀取時間? – abargnesi

+0

嵌入您的案例不會顯着減少閱讀時間(您可以閱讀所需字段的子集),但毫無疑問會減少查詢次數。 – g1zmo

+0

嵌入將增加文檔大小。但我猜測,變化不是很大,不是嗎? (不是1MB到5MB) 如果您不想經常查詢處理的數據,工作集不會增加。否則它是工作集的一部分。 提示,如果你想保存一些數據,你可以利用_id ObjectId作爲提交時間。 – Marc