2009-10-05 68 views
2

我正在設計一個系統,允許用戶從一個系統獲取數據併發送到其他系統。其中一個目標系統具有複雜的SOA(Web服務),另一個是接受平面文件輸入的大型機。我應該使用消息而不是數據庫嗎

我創建了一個包含PublishEvent表和PublishEventType表的數據庫。還有一些標準化的表格是特定於正在發佈的事件的類型。

我還有一個「接口」表,它是標準化數據表的一個扁平版本。最終用戶有一個將數據放入接口表的進程。我不確定確切的過程 - 我認爲這是某種報告應用程序,他們可以將結果導出到SQL表。然後,我使用SSIS包從接口表中取出數據並將其放入規範化數據結構中,並在PublishEvent表中創建新行。我使用平坦表,因爲當我第一次向他們展示關係表時,他們似乎很困惑。

我有一個windows服務,監視PublishEvent表中的新行。 Windows服務通過插件進行擴展(使用MEF框架)。調用哪個插件取決於PublishEvent行中的PublishEventTypeID字段的值。

PublishEventTypeID 1調用從一組表中讀取數據並調用SOA Web服務的插件。 PublishEventTypeID 2調用從另一組表中讀取數據的插件,並創建要發送到大型機的平面文件。

這似乎是我正在實施「數據庫作爲IPC」的反模式。我應該改變我的設計以使用基於消息傳遞的系統嗎?將數據放入平面表然後放入規範化表中的過程是多餘的?

編輯:這是正在開發的.NET 3.5中

回答

0

一些關鍵項目要記住的是:

  1. 排順序的一致性 - 您的數據模型依賴所產生的數據的順序?如果是這樣,您的計劃是否確保以相同的順序創建原始數據的酒吧和子活動?

  2. 你有任何一方的身份專欄?它們是一個問題,因爲它們的值根據插入數據的順序而不斷變化。如果標識列是唯一的主鍵(代理鍵),則其值的更改可能會導致數據無法使用。

  3. 你如何證明你沒有失去記錄?這是解決方案中最棘手的部分,特別是如果您有數百萬行。

至於架構,你可能想看看XMPP協議 - 啪客戶端(如JAVA)和eJabberD的服務器。

-1

如果您使用.Net,請查看nServiceBus,Mass Transit或RhinoServiceBus。

1

一個MOM可能是更好的解決方案,但你也必須考慮在考慮到以下幾點:

  1. 你在的地方已經有一個基於消息的系統,爲您的 客戶的架構的一部分?如果沒有,可能會引入它是一個過度殺傷性的 。
  2. 您有使用消息系統的經驗嗎?作爲一個Jason正確提到的Plank,您必須考慮具體的 模式,例如必須確保按照時間順序排列的 消息,管理死信通道等(有關更多信息,請參見this book)。
  3. 您提到了一個主機系統,它顯然限制了與接口連接的選項。誰會照顧 將「消息」(基於數據庫或MOM)轉換爲大型機可以消化的 的圖層?假設是你,那麼訪問數據庫(也許你有 已經在過去處理過這個問題)會更容易(對你)來做到這一點,或者根據使用數據庫或MOM的不同,努力將會是 ?

總結一下:如果你對數據庫路由更有信心,也許最好這樣做,即使 - 正如你正確地建議你自己,這有點「反模式」。

相關問題