2010-11-23 73 views
1

我正在尋找替代設計或解決此問題的方法,我遇到過MSMQ消息。現在我正在使用NServiceBus(而不是問題)爲我的服務體系結構。它工作得很好,我非常喜歡它。但是,在處理正常工作負載消息之前,我想在啓動時初始化服務時遇到一些問題。讓我解釋我的情況。NServiceBus設計幫助(使用消息初始化服務實例)

比方說,我有2個服務,數據訪問(DA)和處理引擎(PE)。

的PE執行兩個任務:

  1. 負載從DA一些配置信息。
  2. 處理傳入的客戶端請求。

問題是由於配置。服務啓動後,我無法保證收到的第一條消息是配置消息。我知道你可以在啓動時清除隊列中的所有消息,但我不想這樣做,因爲我需要處理所有消息。其次,即使我清除隊列中的所有消息,仍然不能保證配置將首先加載,事實上,由於該服務正在處理的消息量很大,所以不太可能成爲第一個收到的消息。

我給你們的問題是你過去爲了解決這些類型的問題而採用基於消息的體系結構。我在這裏創造了重大罪惡,並且認爲這些信息將以某種順序到達,這不可能離真相更遠。

回答

1

您可以使用兩個不同的隊列。一個用於工作量。第二個是配置(或元數據)。其他選擇是使用優先權。您可以在配置消息上設置更高的優先級,以便先讀取它們。

這就是說,我根本不理解你的架構。 DA服務如何知道PE已重新啓動。它需要知道爲了發送配置消息。

+0

是的,我研究了優先事項,事實上,這正是我需要的,但NServiceBus要求所有隊列是交易性的,但交易隊列不能優先......幸運的是我的權利? 我認爲最好的解決方案是像你說的那樣使用兩個隊列。一個用於初始化,另一個用於處理。我試着先實施這個解決方案,然後停下來,因爲我發現了優先事項。 – Brian 2010-11-24 15:30:09

+0

要回答第二個問題,當PE服務啓動時,它會向DA發送一條消息,請求配置文件。 – Brian 2010-11-24 15:31:23

+0

謝謝Igal,我用2個隊列結束了。我使用一個進行初始化,然後在初始化完成後切換到主要的一個。似乎正在工作就像我需要它。 – Brian 2010-11-24 22:14:45

1

您應該真的考慮在需要它的每個服務中加載配置。至於變通方法,您可以向另一個端點發送請求消息以進行配置,然後繼續調用Bus.HandleCurrentMessageLater(),直到獲得相關回復。這將不是最佳的,因爲在配置發生之前,非配置消息將在隊列中建立起來。

+0

是的,我也這麼認爲。但就像你所說的那樣,非配置信息會很快建立起來。當我啓動服務時,可能會有幾千條消息在隊列中。我要做的最簡單的事情是在本地加載配置,而不是通過外部服務,但是我試圖避免所有服務中的數據庫連接字符串,因此很難管理。 – Brian 2010-11-24 15:26:08

1

每一個服務都應該對他自己的數據負責。 所以你的處理引擎應該知道它需要知道的正確配置選項才能正常工作。 似乎你正在混合一些東西,並有一個服務使用2個窗口服務,其中一個服務依賴於另一個服務。

通常你的處理引擎會有一個直接的數據庫訪問它的操作。如果在另一個服務中配置了配置設置,則處理引擎將存儲該配置選項並提供更新該配置選項的接口。所以如果你的處理引擎在線,你的客戶端請求可以被處理,無論你的數據庫訪問過程是否有效。如果數據庫訪問進程聯機並檢測到配置更改,它會通知所有相關進程配置更改。

我會建議重新考慮你的架構。

0

你看過經銷商嗎? 也看看ICustomConfigurationSource你可以用它來檢索端點配置時,Windows服務啓動(在它開始處理消息之前)