Feacar分散式事務框架簡單使用

Real_man發表於2019-03-16

Feacar(Fast EAsy Comit and Rollback),這個東西是阿里今年新開源的一款高效能分散式事務框架,雖然市面上有很多了,比如tcc-transactionByteTCC

ByteTCC還有一個官網講解TCC的事務百特開源官網. 雖然框架有多個,但是阿里的引起的動靜更大,還是親自體驗一番。

概念

在業務拆分為多個模組的時候,每個模組都有自己的資料庫的時候,如何保證資料一致性呢?Fescar將一個大的分散式事務拆分為多個分支事務,每個分支事務即本地的事務。

image-20190316133349106

它有三個元件:

  • TC(Transaction Coodinator):事務協調器,維護全域性和分支事務的狀態,驅動全域性的提交或者回滾
  • TM(Transaction Manager):定義全域性事務的範圍,開始,提交,回滾一個全域性的事務
  • RM(Resource Mamager):管理分支事務的資源,與TC進行通訊,註冊分支的事務,告知TC分支事務的狀態,驅動分支事務的提交或回滾。

image-20190316134356269

典型的Fescar分散式事務週期:

  1. TM讓TC來開啟一個全域性事務,TC生成一個XID來表示當前的全域性事務
  2. XID在微服務的呼叫鏈中進行傳播,所有服務得知當前事務的XID
  3. RM像TC註冊當前XID對應的事務。
  4. TM讓TC來提交或者回滾當前XID對應的全域性事務
  5. TC告訴所有XID對應的的分支事務來結束提交或者回滾。

預備軟體

  • MySQL
  • Zookeeper
  • Fescar,這個協調者元件還是單獨執行的。

使用

  1. 下載Fescar的案例程式碼,github.com/fescar-grou…

    這次演示,只需要使用案例程式碼的dubbo模組即可。

image-20190316134800405

  1. 啟動MySQL,建立表,建立語句在專案中也有。
CREATE DATABASE fescar_demo;

DROP TABLE IF EXISTS `storage_tbl`;
CREATE TABLE `storage_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `commodity_code` varchar(255) DEFAULT NULL,
  `count` int(11) DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY (`commodity_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `order_tbl`;
CREATE TABLE `order_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) DEFAULT NULL,
  `commodity_code` varchar(255) DEFAULT NULL,
  `count` int(11) DEFAULT 0,
  `money` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `account_tbl`;
CREATE TABLE `account_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) DEFAULT NULL,
  `money` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
複製程式碼
  1. 在案例程式碼的jdbc.properties檔案中,配置好MySQL的連結地址與密碼。

image-20190316135405763

  1. 在dubbo配置檔案中,指定服務註冊中心地址。依次配置accout, order,storage。還有business

image-20190316135510035

  1. 記得啟動zookeeper,單機版的直接執行就好,關於ZooKeeper的使用參考Zookeeper入門,另外啟動fescar,啟動fescar的時候記得要提前建立好目錄,否則會報目錄不存在異常。
# 啟動ZooKeeper
/bin/zkServer.sh start

# 啟動fescar
mkdir /Users/aihe/tmp/fescar
./bin/fescar-server.sh 8091 /Users/aihe/tmp/fescar
複製程式碼
  1. 按照順序,啟動DubboAccountServiceStarter,DubboOrderServiceStarter,DubboStorageServiceStarter,最後啟動DubboBusinessTester。

  2. 在業務程式碼中,專案故意丟擲了異常,可以分別執行丟擲異常與不丟擲異常的,來檢查分散式事務是否有生效。

image-20190316140052899

image-20190316140153767

  1. 最後檢查資料庫,符合預期,要麼每個服務的資料都有入庫,要麼都沒有入庫。

分析

看看Fescar的日誌,在成功和失敗的時候都有日誌。

在失敗的時候,就是告訴分支事務都進行回滾操作。最後斷開與服務的連結

image-20190316140816242

在成功的時候,獲取到所有的分支事務狀態,然後進行全域性的提交。最後斷開與服務的連線

image-20190316141006032

最後

就說到這了,主要覺得fescar執行在本地感覺有點怪,不過官網說它有不同的執行方式,期待後面有更全的文件用法吧。分散式事務一般降低服務的吞吐量,公司用的定時任務補償與查詢的方式比較多。

參考

相關文章