2012-02-14 49 views
1

我正在工作的地方是試圖建立一些基本規則,我們現在正在進行的辯論是本地庫與Web服務的代碼重用。 Web服務似乎是大多數公司的流行選擇,這也是大多數開發人員傾向於採用的方式。如果您無法使用交易,您如何有效地在企業環境中使用Web服務?

我只是看不出如何有效地使用Web服務進行任何認真的工作。如果我無法使用交易,如何安全地執行多個服務呼叫?

比方說,我有一項cron工作,可以從我們的數據庫中抓住符合特定條件需要收到通知的客戶。他們會發送一封傳真,一封電子郵件,並且會創建一張票據以在內部跟蹤此問題。這是在for循環中針對每個客戶會發生的3種不同的服務呼叫。

如果沒有什麼地方發生了錯誤,它可能是,例如,一個傳真和電子郵件發送給客戶,但不是會創建一票。或者更糟糕的是,這個cron工作可能會包含一個錯誤,導致它每次都在同一時間失敗,並重復給同一個客戶發送電子郵件。如果圖書館都是本地的,那麼所有東西都可以被包裝在一個交易中,而這些都不會發生。但是在這個例子中我們使用了Web服務。

請注意,電子郵件和傳真方法實際上將數據插入到電子郵件隊列和傳真隊列中,然後使用cron作業處理該隊列和傳真隊列。因此,對「發送電子郵件」和「發送傳真」服務方法的調用可以安全回滾。

的選擇是把這個代碼整個塊在Web服務本身,所以Web服務本身將調用電子郵件,傳真和傳票生成的交易方式。但是,我們正在創建一個Web服務方法,只是爲了使用事務;除了這個cron腳本之外,沒有任何真正需要從任何地方調用此方法的正當理由。

您通常會如何處理這種方法?

回答

1

我將通過建立一個SAGA,在具有內部狀態,響應外部事件,並與外部系統進行交互的長時間運行的業務流程的抽象處理它。

我會這樣做,因爲你的問題陳述是不完整的:當你無法發送電子郵件,因爲服務器關閉會發生什麼?如果傳真系統不工作,但其他兩個不工作會怎麼樣?

當你不能調用一個,你應該重試?多長時間?如果你不能提高票價四個小時會發生什麼,你應該升級爲某人?如果得到迴應,那麼需要跟蹤票證狀態並在一段時間後升級?如果您無法執行任何通知操作,您是否應該在一段時間內向原提交者發送電子郵件?

使用的傳奇是,當你不能只是有一個交易的模型,因爲它可能潛在地跨越實時小時的行動完成之前 - 並保持數據庫鎖定,長期,哎喲。

轉向SOA意味着擺脫一些舊的假設。其中之一就是您應該編寫方法並調用它們,以便將系統的行爲封裝在更高級別並將其公開爲服務。

如果您嘗試構建一個像本地庫一樣的Web服務,您的生活將會非常糟糕。從您希望擁有數據的服務以及擁有與該數據相關的行爲並將其中的詳細信息封裝的角度來看待這一點。(從另一方面說,我懷疑從cron發送這些東西實際上是一個更大的業務流程的一部分,正確的,cron做的東西,併發送通知作爲結果。您的服務可能很想公開整個序列作爲一個傳奇而不是)

無論如何,重點是:你不要將事物封裝在一個服務中,因爲你想要一個事務,而且你不把事情放在一個事務中,只是爲了使它們成爲原子。這些是不同的問題,應該分開處理。

PS:如果您使用交易,如果發送電子郵件但未創建票證,請不要通過電子郵件發送兩次?無論如何,你實際上需要更精細的一套更新。

+0

我更新了有關電子郵件和傳真兩次的帖子。電子郵件和傳真方式實際上將數據插入到電子郵件和傳真隊列中,由他們自己的cron作業處理。 – ryeguy 2012-02-14 00:25:44

相關問題