2014-07-24 46 views
3

想象一下,三個獨立的Spring Web應用程序在單獨的JVM和不同的機器上運行(不涉及應用程序服務器,只是簡單的servlet容器)的Java生態系統。其中兩個應用程序正在使用他們自己的使用JPA訪問的數據庫。現在,第三個應用程序(協調器)向外界提供服務,並且某些服務功能執行遠程操作,這需要其他兩個應用程序以事務方式參與,這意味着如果其中一個應用程序未能執行數據操作數據庫,另一個也應該回滾。問題是:如何使用Spring來實現?Spring Web應用程序中的分佈式事務

目前我們正在使用REST在應用程序之間進行通信。顯然這不能支持交易,即使there are efforts to make this happen

我發現能夠組織全球交易的JTA。 JTA涉及創建參與全局管理事務的XAResource實例。如果我理解正確,這些XAResource實例可以駐留在單獨的JVM上。資源的初始化,提交和回滾通過JMS通信發生,這意味着它需要消息代理在參與者之間傳輸消息。有各種JTA實現存在,我發現Atomikos似乎是最常用的。

現在,我不明白的是,如果我在每個應用程序端都有一個Spring應用程序,所有這些都會出現。我還沒有找到任何示例項目,它正在通過網絡進行JTA。另外我不承擔什麼是XAResources代表。如果我使用JPA,並且說我在一個存儲用戶餘額的應用程序中有一個Account對象,並且我必須從協調器中減少餘額,那麼我是否應該創建允許減少餘額的XAResource實現?或者XAResource是由JDBC驅動程序或Spring Data JPA等較低級別的東西實現的?在後一種情況下,我如何爲交易協調員提供高級別的CRUD操作。

回答

1

XAResource是一個較低級別的API。你可以自己寫給協調員,但我認爲這不是必須的。相反,利用協調器上的JMS + JTA和應用程序服務器上的JTA。

在正常情況下,你有這樣的:

  1. 協調器收到請求,並開始JTA事務
  2. 協調調用應用程序1通過JMS
    • 應用1接收JMS消息
    • 應用1使用JTA調用DB 1
  3. 協調器通過JMS調用應用程序2
    • 應用2接收JVM消息
    • 應用2使用JTA
    • 調用DB 2
  4. 協調員提交TX

注意,JTA用於所有的交易 - 這將是一個全球性的TX這是所有服務器共享的。如果這些步驟中的任何一個失敗了,那麼它們將被回滾。

春天應該能夠使這個透明,一旦你把它設置。只要確保你的DAO &服務調用是事務性的。 Atomikos需要進行配置,以便每臺服務器使用相同的JTA tx管理器。

+0

謝謝,這是有道理的。有沒有任何你知道的示例應用程序?另外我應該如何從協調員應用程序調用其他應用程序?我是否必須使用JMS正確傳播事務上下文,或者我可以使用其他方法(如Spring HTTP Invoker)? – NagyI

+0

對不起,我現在明白,我必須通過JMS調用其他應用程序。儘管如此,一個例子會讓事情變得更加清晰。 – NagyI

0

REST不支持事務,現在,通過Atomikos公司TCC實現從www.atomikos.com - 這是在實際執行中,你指的是說話的設計...

HTH

+0

是否有任何示例代碼可用?我只找到了這個文檔:http://www.atomikos.com/Documentation/TccForRest我不知道哪個Atomikos版本包含TCC實現。 – NagyI

0

這個答案是更詳細的職位概要:

How would you tune Distributed (XA) transaction for performance?

下圖描述了事務協調和transatcion參與者之間的交際流。 enter image description here

在您的特定情況下,您的交易協調員將是Atomikos或Bitornix或任何其他提供者。對於開發人員來說,流程結尾(XID)中的每個細節都是完全不可見的,並且僅由事務協調員執行。第一點開始,結束在應用範圍內。

現在基於你的問題。您不能在應用程序之間進行分佈式事務。您可以在支持它們的基礎架構之間進行分佈式事務。如果您希望在由網絡分隔的應用程序組件之間進行事務處理,則最好使用「事務補償」,這是完全不同的主題。

分佈式事務可以做什麼來自一個應用程序,一個服務,一個組件,無論是支持XA的多個數據庫還是資源,然後執行一些事務。

我看到後面的帖子,指出At​​omikos具有支持REST的XA的某種基礎架構。通常,諸如Try Cancel Conirm attern之類的交易補償的經典算法非常接近2階段提交協議。沒有看細節,我的猜測是他們實施了一些圍繞這一方面的東西。

+0

請不要在鏈接上回答其他Stack Exchange問​​題。相反,在這裏包括答案的重要部分,並*定製這個具體問題的答案。 – Mogsdad

+0

@Mogsdad好的,我會這樣做。 –

相關問題