我想在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集合是否值得,因此文檔大小在作業集合中變化不大?
大量的處理(完成,失敗,取消)與未處理的作業相比,最終是否會增加作業作業集合所需的工作集內存?即使使用正確的索引,未處理的作業執行的訪問時間是否會減慢?
我可以在模式設計中做些什麼和權衡?
我同意在Mongo中強調嵌入文檔。在我的情況下,不會嵌入* payload *字段增加每個文檔在** jobs **集合中的存儲量,從而減少讀取時間? – abargnesi
嵌入您的案例不會顯着減少閱讀時間(您可以閱讀所需字段的子集),但毫無疑問會減少查詢次數。 – g1zmo
嵌入將增加文檔大小。但我猜測,變化不是很大,不是嗎? (不是1MB到5MB) 如果您不想經常查詢處理的數據,工作集不會增加。否則它是工作集的一部分。 提示,如果你想保存一些數據,你可以利用_id ObjectId作爲提交時間。 – Marc