簡體   English   中英

使用MSMQ隊列來分離消息生產者和消費者?

[英]Use MSMQ queue to decouple message producer and consumer?

對於將報告發布到SOAP服務的一些Windows服務(c#),我將不勝感激。

它從數據庫中獲取一組有限的報告(Oracle AQ表中的報告),將它們聚合到一條消息中,並將此消息轉發給WCF SOAP服務。 如果已成功通過SOAP傳輸報告,則會將其標記為“已發送”。 否則,它們將再次添加到AQ表(通過db作業)。

所以我提出了以下設計。 什么是最好的方式去? 隊列在可擴展性,穩健性,解耦方面是否會改進設計? 在這種情況下使用排隊是一個好主意嗎?

建議設計A:具有1到N個線程的服務。 每個線程同步處理報告(獲取報告,聚合,翻譯,通過SOAP發送)

建議設計B:Windows服務:

  • 1個MSMQ消息隊列
  • 1到N生產者線程:(通過MSMQ獲取報告,聚合,排隊消息)
  • 1到N消費者線程:(通過SOAP出列,翻譯,翻譯)

擬議設計C:

  • 具有生產者線程的Windows服務(通過WCF NetMsmqBinding客戶端獲取報告,聚合,將消息排入私有MSMQ隊列)
  • IIS / WAS托管啟用了MSMQ的服務(通過SOAP偵聽MSMQ隊列,出列,轉換,重寫)

您選擇MSMQ有特殊原因嗎? 如果您使用建議的設計B,則可以使用BlockingCollection

我沒有看到MSMQ在這種情況下提供了特別的優勢,除非你想要多個進程或者你希望將它傳播到多台計算機上。

但你真的需要多線程嗎? 這里的限制因素似乎是數據庫訪問時間或與WCF服務的通信。 除非WCF服務必須先進行一些主要處理才能成功調用作業。

所以你確定你不能只有:

while there are unsent jobs in the database
    get job
    send job to WCF
    if job sent successfully
        mark job as sent
end while

顯然,我對你的情況的了解僅限於你在問題中發布的內容,所以我可能錯過了一些重要的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM