2014-09-02 39 views
0

比方說,我們有一個HTTP網關站服務 滷麪HTTP網關和MSMQ健康狀況

  • 與HTTP網關入站服務服務器節點
  • 我認爲情況

    • 客戶端節點,在MSMQ本身停止從客戶端節點上的某種原因。在目前的實現中,Rebus HTTP網關將捕獲異常。

      你覺得這個想法不僅僅是捕獲,MessageQueueException異常也可以發送到服務器節點並放在錯誤隊列中? (錯誤隊列的名稱可以從頭文件中獲取)

      因此,如果沒有額外的基礎架構服務器就會知道客戶端有問題,所以有人可能會作出反應。

      UPDATE:

      我猜的答案描述的問題將得到提升。我應該更深入地解釋我的情況:)對不起。這裏是:

      我打算修改HTTP網關的方式,InboundService將能夠同時執行 - 發送和接收消息。因此,出站服務將是唯一啓動連接的人(定期例如每5分鐘一次),以便從服務器獲取新消息並將其消息發送到服務器。這是因爲客戶端節點不被視爲服務器,而是作爲NAT後面的衆多客戶端之一。

      事實上,服務器本身對客戶端的健康沒有興趣,但我雖然不是在客戶端創建單獨的警報服務,而是使用 HTTP網關 HTTP網關代碼,但它可以完成這項工作, HTTP網關的雙方運行。

      如果客戶端根本無法訪問服務器,該怎麼辦?

      由於MSMQ會死我想過使用過程中的獨立的持久性隊列對象一樣,http://ayende.com/blog/4540/building-a-managed-persistent-transactional-queue (只是一個示例實現,我不知道它有什麼樣的許可證) 對總的例外客戶端直到服務器可達。

      客戶端多久會通知發生了錯誤的服務器?

      我不知道那一部分 - 我想一次每5分鐘,但萬一是什麼樣子就沒有安排的時間,就像在當前的實現(雖然它可能與消息同步的預定時間(真)循環)?也許它可能只是由配置設置?

      我想了解關於錯誤處理一致的策略,通常包括普通的舊NLOG登錄

      由於客戶端節點將在NAT標準的監測技術背後的互聯網將無法正常工作。我想過使用隊列作爲NLog傳輸,但是由於MSMQ會死機,所以無法工作。

      我也想過使用HTTP作爲NLog傳輸,但在服務器端它需要隊列(不是真的,但我想將它存儲在隊列中),所以我們回到了sbus和HTTP網關......那種的NLog傳輸實際上是HTTP網關的克隆。

      UPDATE2: HTTP作爲NLOG運輸(由運輸我的意思是目標),還需要客戶端隊列就像我在描述「如果客戶無法到達服務器呢?」部分。這將是嵌入到NLog中的HTTP網關的克隆。瘋狂:)

      所有的事情是,客戶端是不可靠的,所以我想擁有服務器端的客戶端的所有信息,並在那裏登錄。

      UPDATE3

      替代解決方案可以創建單獨的服務,然而這將是HTTP網關(例如OutboundAlertService)的一部分。然後三個目標將會實現:

      • 共享發送循環代碼
      • 無需額外的服務器基礎設施
      • 上OutboundService沒有負面影響
      (無添加過程中的隊列它的複雜性)

      它不需要OutboundService的異常,而是它會自己檢查MSMQ。


      另一種替代解決方案是簡單地使用非MSMQ隊列作爲NLog目標,但這是醜陋的矯枉過正。

    回答

    2

    關於你的情況,我最初的想法是,它不應該是服務器的問題,客戶端有問題,所以我可能不會在客戶端發生故障時向服務器發送消息。

    正如我所看到的那樣,這種方法會帶來多種問題/障礙/挑戰,例如,如果客戶端根本無法訪問服務器怎麼辦?客戶多久會通知發生錯誤的服務器?

    當然,我不知道你的設置的細節,所以很難給出具體的建議,但總的來說,我喜歡有一個一致的策略來處理錯誤,通常涉及舊的NLog日誌記錄和配置WARN和ERROR級別去Windows事件日誌。

    這允許設置各種工具(例如Service Center Operations Manager或類似服務)來監視所有機器的事件日誌,以便在出錯時引發錯誤標誌。

    我希望我說的東西,你可以用:)

    UPDATE

    想着它多一些之後,我想我開始明白你的問題,我認爲我如果客戶端讓另一端的HTTP偵聽程序知道它有問題,那麼另一端的HTTP偵聽程序可能會(可能?)將該日誌記錄爲錯誤。

    另一種選擇是另一端的HTTP偵聽器可能有一個事件,ReceivedClientError或其他東西,可以附加到,然後在給定的情況下做任何正確的事情。

    就你而言,你可能會在錯誤隊列中放置一條消息。我只是避免把任何東西放在錯誤隊列中作爲一個通用的解決方案,因爲我認爲它混淆了錯誤隊列的目的 - 錯誤隊列中的「東西」不是一個消息,因此它不會是可重試的等等。

    +0

    我更新了問題。在此先感謝您的幫助。 – user1121956 2014-09-02 09:59:11

    +0

    感謝您的更新。我也想過了,直到週末,我會嘗試總結這篇文章中的信息和其他想法,以GitHub問題的形式,以及以叉子的形式祝福之後:) – user1121956 2014-09-04 11:47:40

    +0

    非常棒!感謝你的堅持:) – mookid8000 2014-09-04 13:15:46

    相關問題