1

我有一個製片人的消費機制,我不得不存儲生產的產品在數據庫,這是一個必要條件。另外我有幾個生產者和幾個消費者,生產者和消費者線程將訪問幾個數據庫表中的記錄; ProcessID列將決定哪個線程正在訪問哪條記錄。生產者 - 消費者和數據庫隊列

線程將通過Windows服務工作。

ProcessID的創建有三個原因。

  • 1-如果線程不正常終止,將使用processID來避免重新啓動處理。

  • 2-線程通過數據庫鎖定同步,並希望我將只有行鎖定,並且很可能在短時間內有很少的阻塞線程,因爲每個線程都將訪問幾條標記有ProcessID的記錄。

  • 3-我想跟蹤哪個線程上的時間做了什麼,因爲我錯誤記錄到數據庫中。請注意,消費者會將項目發送到Web服務。

如果我用內存數組中爲隊列,我懷疑,這將增強性能,它具有以下缺點: -

  • 當消費者去排隊的項,它將不得不使用其processID更新其在數據庫中的記錄。

  • 生產者將項目插入到數據庫中,並使用Output stp參數得到它的ID,然後它將把它的ID放入隊列中,避免從數據庫重新讀取它,這是唯一的好處 - 內存隊列,避免重新讀取數據庫中的項目。 請注意,一旦將記錄插入到數據庫中,除消費者外,沒有任何內容會更新它。

  • 的另一個問題是,我認爲運營商可以停止從數據庫中刪除它,如果我在內存隊列中,我會失去這個未來的消費有一定的項目。

  • 隊列類將有鎖定私有對象上,訪問隊列的方法應該是同步的。我覺得我重複了一個線程將被餓死的可能性。我覺得我重複了一個線程被阻塞等待的時間。

兩個問題

1 - 我懷念在這個設計中的東西嗎?你認爲它會起作用嗎?

2 - 它是一個好主意,不使用內存隊列?

回答

0

也許我錯過了一些東西,但是我仍然會將一箇中央內存隊列作爲一種服務來使用,它還會處理正確的進程檢索策略,並更新具有狀態的產品行。我不認爲這是一個巨大的開發開銷。

你自己明確表示會有線程短時間被阻塞的情況。如果您可能需要增加線程數量,這樣的隊列將會得到回報。

至於這一點,你可以雙擊移交給消費者前檢查:

的另一個問題是,我認爲運營商可以停止從數據庫中刪除它消耗 某一個項目,如果我用在內存 排隊,我將失去這個未來。

而且,當然,這是一個更清晰的設計..當生產者和消費者只關注生產和消費項目時,你將遵循單一責任原則。

至於:

1 - 難道我錯過這個設計的東西嗎?你認爲它會起作用嗎?

..我沒有看到它不應該工作的原因。所以你必須根據整個畫面做出最終決定。