我正在致力於產品數據導入系統,該系統從外部源下載產品數據,將其轉換爲適當的模式,並存儲結果 - 實質上是一個ETL系統。系統處理的消息的核心類型是「ImportProductCommand」,它指定要導入的產品和源。然而,導入命令很少單獨發送。典型的業務需求是從一個給定的來源導入整套產品。目前,這表示爲「ImportProductsCommand」消息,其可以指定要導入的多個產品。命令處理程序使用此消息,將其轉換爲單獨的「ImportProductCommand」消息並將它們發送到隊列進行處理。個別導入請求的使用者發佈「ProductImportedEvent」或「ProductImportFailedEvent」。當收到「ImportProductsCommand」消息時,該服務爲該消息分配一個GUID令牌,將消息放入隊列中並返回該令牌。然後將該令牌用作關聯ID,以便各個導入請求可以與批量導入請求相關聯。鑑於此基礎架構,可以確定與給定令牌關聯的事件數量,從而確定導入產品的數量或導入失敗的次數。缺少的是一個明確的事件,表明批量導入已完成。各個導入請求的處理程序不明確知道它是批量導入請求的一部分。這當然可以通過知道要導入多少產品並通過計算與特定關聯ID關聯的導入事件的數量來推斷。當前實現利用消息隊列系統來處理進程重新啓動和失敗,但對於批量導入請求不那麼明確。總的來說,系統需要回答的查詢是:使用消息隊列的任務處理狀態
- 是否完成了給定的批量導入?
- 給定批次導入剩餘多少個個人進口?
- 已完成多少個人進口?
- 有多少是錯誤的?
什麼是一些最佳實踐或建議的方法來支持這些查詢,並仍然利用消息隊列系統提供恢復能力?目前,將所有關聯在一起的是上面提到的標記,但是沒有明確的記錄來表示批量導入請求實體,如果存在,那麼單個導入請求處理器需要知道這樣的實體來更新狀態。
所有這些都是使用C#,NServiceBus實現的,並作爲IIS WCF應用程序託管。
這看起來像一個偉大的解決方案!我曾考慮過使用傳說,但認爲它們更適用於不同消息類型的場景。您的示例將以新的視角提出問題。 – eulerfx 2012-03-15 21:32:37
我沒有用傳奇的方式來跟蹤進口的狀態。但是,爲了報告目的,我還將整個導入作爲實體存儲之外的實體存儲,因爲默認的saga商店在完成時會刪除saga數據。 – eulerfx 2012-03-19 20:03:32
我記得Udi在一些談話中提到過,沒有必要爲了完成佐賀(這將它從商店中刪除),您可以將它留在商店中用於報告目的。 – 2012-03-20 15:32:12