Feacar(Fast EAsy Comit and Rollback),這個東西是阿里今年新開源的一款高效能分散式事務框架,雖然市面上有很多了,比如tcc-transaction,ByteTCC
ByteTCC還有一個官網講解TCC的事務百特開源官網. 雖然框架有多個,但是阿里的引起的動靜更大,還是親自體驗一番。
概念
在業務拆分為多個模組的時候,每個模組都有自己的資料庫的時候,如何保證資料一致性呢?Fescar將一個大的分散式事務拆分為多個分支事務,每個分支事務即本地的事務。
它有三個元件:
- TC(Transaction Coodinator):事務協調器,維護全域性和分支事務的狀態,驅動全域性的提交或者回滾
- TM(Transaction Manager):定義全域性事務的範圍,開始,提交,回滾一個全域性的事務
- RM(Resource Mamager):管理分支事務的資源,與TC進行通訊,註冊分支的事務,告知TC分支事務的狀態,驅動分支事務的提交或回滾。
典型的Fescar分散式事務週期:
- TM讓TC來開啟一個全域性事務,TC生成一個XID來表示當前的全域性事務
- XID在微服務的呼叫鏈中進行傳播,所有服務得知當前事務的XID
- RM像TC註冊當前XID對應的事務。
- TM讓TC來提交或者回滾當前XID對應的全域性事務
- TC告訴所有XID對應的的分支事務來結束提交或者回滾。
預備軟體
- MySQL
- Zookeeper
- Fescar,這個協調者元件還是單獨執行的。
使用
-
下載Fescar的案例程式碼,github.com/fescar-grou…
這次演示,只需要使用案例程式碼的dubbo模組即可。
- 啟動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;
複製程式碼
- 在案例程式碼的jdbc.properties檔案中,配置好MySQL的連結地址與密碼。
- 在dubbo配置檔案中,指定服務註冊中心地址。依次配置accout, order,storage。還有business
- 記得啟動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
複製程式碼
-
按照順序,啟動DubboAccountServiceStarter,DubboOrderServiceStarter,DubboStorageServiceStarter,最後啟動DubboBusinessTester。
-
在業務程式碼中,專案故意丟擲了異常,可以分別執行丟擲異常與不丟擲異常的,來檢查分散式事務是否有生效。
- 最後檢查資料庫,符合預期,要麼每個服務的資料都有入庫,要麼都沒有入庫。
分析
看看Fescar的日誌,在成功和失敗的時候都有日誌。
在失敗的時候,就是告訴分支事務都進行回滾操作。最後斷開與服務的連結
在成功的時候,獲取到所有的分支事務狀態,然後進行全域性的提交。最後斷開與服務的連線
最後
就說到這了,主要覺得fescar執行在本地感覺有點怪,不過官網說它有不同的執行方式,期待後面有更全的文件用法吧。分散式事務一般降低服務的吞吐量,公司用的定時任務補償與查詢的方式比較多。