2013-05-13 76 views
1

我正在嘗試使用MSMQ實現作業隊列,以節省一些時間在SQL中實現它。閱讀後,我意識到MSMQ可能不會提供我所追求的。如果我的計劃使用MSMQ或建議替代方案是否符合實際情況,您可否請指教我?MSMQ作爲工作隊列

我有一些進程從隊列中提取作業(我可能需要在將來向外擴展),一旦作業被選中,處理會隨之而來,在此期間作業被狀態鎖定到其他進程(如果需要的話)被退回(狀態再次改變)到隊列以供進一步處理,但實際上該作業仍然在隊列中直到完成。

MSMQ不允許我在處理郵件時將郵件保留在隊列中,例如我可以偷看或閱讀郵件。閱讀將隊列中的消息帶出隊列,並且不允許更改消息(狀態)。

謝謝

+0

如何使用交易?如果事務失敗,MSMQ將返回消息。 – 2017-07-20 03:31:23

回答

1

使用MSMQ作爲數據存儲可能是壞的,因爲它不是爲存儲設計的。除非隊列是事務性的,否則這些消息甚至不會寫入磁盤。

由於您陳述的原因,當然不支持更新隊列項目。

如果你不想要一個完整的關係數據庫,你可以使用某種存儲器緩存,比如memcached,或者像raven這樣便宜的對象數據庫。

0

看看RabbitMQ或許多其他消息隊列。大多數開箱即用提供此功能。

例如。 RabbitMQ調用您所描述的工作隊列。多個消費者可以從同一個隊列中拉出,而不是拉同一個項目。此外,如果您使用確認且處理失敗,則不會將該項目從隊列中刪除。

.NET的例子: https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html

編輯:使用MSMQ自己後,它可能會很好地工作,你在做什麼,只要我可以告訴。關鍵是要使用事務和多個隊列。例如,每個狀態應該有自己的隊列。將消息從一個隊列「移動」到另一個隊列是相當安全的,因爲它發生在一個事務中。消息的這種移動實質上是你的狀態改變。

我們還使用消息擴展字節數組來存儲消息元數據,如狀態。這樣,我們不必在將其移動到另一個隊列時更改實際的消息。

MSMQ和隊列通常需要與大多數程序員所使用的模式不同的一組模式。記住這一點。

也許,如果您可以提供更多關於爲什麼需要查看當前正在處理的消息的信息,那麼可以通過MSMQ來處理這種情況。您可以隨時添加數據庫以進行其他跟蹤。