實際中碰到的一個異構系統之間數據交換的處理方式設計

情況描述:

兩個不同的業務系統M系統與E系統,兩者之間的數據交換採用ESB平臺,從而可以保證ESB內部的數據傳遞流程可以具有一個全局的事務,一旦發生任何異常,都會回滾。

數據傳遞的方向爲從M系統傳遞至E系統。

前期約定的內容,ESB獲取M系統的數據,數據獲取方式爲從ESB與M系統約定的數據庫中間表中獲取(相當於M系統的前置機),調用E系統的WebService,將數據寫入E系統,並且將調用是否成功的結果寫回與M系統約定的中間表中(寫回M系統中間表的工作由ESB負責完成),調用E系統的WS之後,除了回寫與M系統的中間表,還會有一些其他的數據庫更新等操作。(監控與M系統的中間表的增量數據,使用數據庫觸發器,並在額外的表中,記錄增量數據的信息(例如:新增時間等信息),一切順利之後,把監控到的與M系統的中間表中的增量數據刪除掉。)

問題:

  1. 事務的問題可以交由ESB來處理,可以忽略。
  2. 調用WS如果數據未能寫入E系統,WS不會拋出異常,而是會返回一個未能寫入的代碼,並返回原因。
  3. 調用WS成功,並且成功寫入E系統,但是,在後續ESB處理其他事情的過程中發生異常,事務照樣回滾。而E系統的WS,沒有補償機制,不會對數據是否已經存在進行判斷,而且E系統的WS由於各種原因,調用時性能不佳

解決方案:

對於問題1。無需關注。

對於問題2。由於前期ESB與M系統約定,一旦發生ESB調用E系統的WS未能寫入的情況,M系統會重新生成新的數據,而不是對原有數據進行修改。ESB只需將調用E系統的WS的結果返回寫入中間表即可,不管任何一方發生異常,均由M系統重新生成數據,重新傳遞。這樣ESB只需監控新增的數據,並按順序執行相應操作即可。

對於問題3。就需要在調用E系統的WS之前,對E系統中是否存在相應數據進行判斷,如果存在,並且同時最近一次調用時返回的結果爲正常,則不再重複調用WS,而是直接執行後續操作;如果不存在或者調用時返回的結果不正常,甚至沒有返回結果,則重新從頭開始執行相應操作。

另外,如果沒有與M系統關於調用E系統WS未能寫入的情況的約定,則ESB需要根據E系統的WS的返回值進行判斷,如果不正常,則可以直接拋出一個異常,從而回滾整個事務(當然,也可以暫時將異常數據暫存至另外的數據庫表中或者其他什麼位置,防止此問題數據重複出現),保證流程下次可以再次取得此數值。當然,這樣也存在一個問題,就是回滾整個事務,與M系統約定的中間表中,就無法取到調用結果是否正常的信息,除非在ESB平臺中有一個地方可以查看異常信息及數據,並且有專人來處理此類事情,否則,表面看起來就是ESB停在某條數據那裏不動了,會對業務產生影響。

還有一種方案就是由於監控的增量數據都會記錄在一個表中,如果發生調用E系統的WS未能寫入數據的情況,則不允許ESB將監控到的增量數據刪除,並不是拋出異常回滾整個事務,也就能夠正常查看到產生錯誤的原因。

個人認爲最後的解決方案是一個比較不錯的思路,記錄一下以饗自己。

發佈了109 篇原創文章 · 獲贊 9 · 訪問量 101萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章