オープンソース分散トランザクションミドルウェアSeataガイド

入門


Seataアリババオープンソース分散トランザクションミドルウェア、高性能マイクロサービスアーキテクチャの使いやすさと分散トランザクション溶液。


初心

  • ビジネス、非侵襲性:技術アーキテクチャに基づいてトランザクションサービスの分散マイクロ問題の減少は、ビジネスへの侵入をもたらします

  • 高パフォーマンス:分散トランザクションソリューションを減らすには、パフォーマンスコストをもたらします


分散トランザクションの定義

分散トランザクションは、グローバル・トランザクション、枝のグループで構成トランザクション、分岐総務通常はローカルトランザクションです。


640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1



デザイン


Seataは2つの実装、ATおよびTCCがあり、トランザクションを配布しました。


AT

モデルは進化XAトランザクションに基づいているAT、コアビジネスは、非侵襲的で、改善提出後、データベースのサポートを必要とする二段です。


640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1

基本コンポーネント:

  • トランザクションコーディネータ(TC) トランザクションコーディネータ、実行中のグローバル・トランザクションを維持するには、調整およびコミットまたはロールバックされたグローバル・トランザクションを駆動する責任があります。

  • マネージャーのトランザクション(TM) ボーダーコントロールグローバル情勢は、グローバル・トランザクションを開くための責任があり、最終的にコミットまたはグローバルロールバックするグローバルな解像度を起動します。

  • リソース・マネージャ(RM) 制御総務支店、支店は、登録、ステータスレポートを担当し、命令の業務コーディネーターを受け取り、コミットやロールバック・ドライブ・ブランチ(ローカル)トランザクション。


プロセスフロー:

  1. TM TCは、新しいグローバル・トランザクションを開始するために必要。TCは、XIDのグローバルトランザクションを生成します。

  2. チェーン・サービスを呼び出すことで、XIDマイクロ伝播。

  3. RMは、グローバル・トランザクションのTCの適切なブランチにローカルトランザクションXIDとして登録されます。

  4. グローバル・トランザクションに対応するTMクレームTCはXIDをコミットまたはロールバックします。

  5. TCのトランザクションがXIDのブランチにコミットやロールバックを完了するために、それぞれのグローバル・トランザクションのすべての支店を駆動します。


640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


TCC

各インタフェースはSeataは、準備、コミット、ロールバックが必要です。


与 AT 模式一样,在运行时,该切面会拦截所有对 TCC 接口的调用。每调用一次 Try 接口,切面会先向 TC 注册一个分支事务,然后才去执行原来的 RPC 调用。当请求链路调用完成后,TC 通过分支事务的资源 ID 回调到正确的参与者去执行对应 TCC 资源的 Confirm 或 Cancel 方法。


  1. 初步操作 Try:完成所有业务检查,预留必须的业务资源。

  2. 确认操作 Confirm:真正执行的业务逻辑,不做任何业务检查,只使用 Try 阶段预留的业务资源。因此,只要 Try 操作成功,Confirm 必须能成功。另外,Confirm 操作需满足幂等性,保证一笔分布式事务能且只能成功一次。

  3. 取消操作 Cancel:释放 Try 阶段预留的业务资源。同样的,Cancel 操作也需要满足幂等性。


Seata Server安装


1.下载最新版本的 Seata Sever

https://github.com/seata/seata/releases


2. 解压并启动 Seata server


unzip seata-server-xxx.zip
cd distribution
sh ./bin/seata-server.sh 8091 file



示例

场景:

把数据库zeroa中proxy表的一条数据转移到数据库zerob中proxy表里面。


模块:

zero-discovery-server:注册中心

zero-gateway-server:服务网关

zero-consumer:服务消费者

zero-provider-a:服务提供者A

zero-provider-b:服务提供者B


架构及版本:

Spring-cloud:Finchley.BUILD-SNAPSHOT

spring-cloud-starter-netflix-eureka-server:2.0.4.BUILD-SNAPSHOT

spring-cloud-starter-netflix-eureka-client:2.0.4.BUILD-SNAPSHOT

spring-cloud-starter-gateway:2.0.4.BUILD-SNAPSHOT

春・クラウド・スタータopenfeign:2.0.0.RELEASE

春ブート:2.0.0.RELEASE

春・ブート・スターター・データ-JPA:2.0.0.RELEASE

春・クラウドアリババ - seata:0.9.1.BUILD-SNAPSHOT

seata-すべて:0.6.1

MySQLのコネクタ-javaの:8.0.11

ドルイドスプリング・ブート・スターター:1.1.18


mysqlの:5.7

seata-サーバ0.6.1


実装:

ゼロゲートウェイサーバ

  • 設定application.yml

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1



ゼロ・プロバイダ:

  • 設定application.yml

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


  • File.conf

メインの構成アプリケーションの名前とアドレスseataサーバー

vgroup_mapping。$ {} spring.application.name -fescarサービス・グループ= "デフォルト"

default.grouplist = "127.0.0.1:8091"


640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


  • Registry.conf

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


  • 書かれたエンティティ

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


  • 書かれたリポジトリ

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


  • サービスを書きます

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


  • コードのコントローラーを書きます

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


  • 情報源

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


ゼロ・プロバイダー-B

ゼロ・プロバイダー・プロジェクトでの設定は、対応するビジネス・ロジックを記述します。

ビジネスに対処する上で追加、例外がスローされます。

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1



ゼロ消費者

ゼロ・プロバイダー・プロジェクトでの設定は、対応するビジネス・ロジックを記述します。


  • feignClient

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


  • feignclient

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


  • サービス

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


  • コントローラ

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


テスト

Seata Serverを起動

MySQLを起動し、初期化(各バンクをundo_logテーブルを作成します)


DROP SCHEMA IF EXISTS zeroa;

CREATE SCHEMA zeroa;

USE zeroa;



CREATE TABLE `undo_log` (

  `id` bigint(20NOT NULL AUTO_INCREMENT,

  `branch_id` bigint(20NOT NULL,

  `xid` varchar(100NOT NULL,

  `context` varchar(128NOT NULL,

  `rollback_info` longblob NOT NULL,

  `log_status` int(11NOT NULL,

  `log_created` datetime NOT NULL,

  `log_modified` datetime NOT NULL,

  `ext` varchar(100DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)

ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;



DROP SCHEMA IF EXISTS zerob;

CREATE SCHEMA zerob;

USE zerob;



CREATE TABLE `undo_log` (

  `id` bigint(20NOT NULL AUTO_INCREMENT,

  `branch_id` bigint(20NOT NULL,

  `xid` varchar(100NOT NULL,

  `context` varchar(128NOT NULL,

  `rollback_info` longblob NOT NULL,

  `log_status` int(11NOT NULL,

  `log_created` datetime NOT NULL,

  `log_modified` datetime NOT NULL,

  `ext` varchar(100DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)

ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


スタート

ゼロの発見 - サーバー

ゼロゲートウェイサーバ

ゼロ・プロバイダー-A

ゼロ・プロバイダー-B

ゼロ消費者


データを追加します

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


取引の通常の実行

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1


あなたは、2つの表に(データを追加するために、ライブラリB、データid = 2を削除するには、データベース)のデータを表示することができます。


トランザクションのロールバックを実行します

640?wx_fmt = PNG&wxfrom = 5&wx_lazy = 1&wx_co = 1

データベースのデータ(変更なし)を確認してください。


おすすめ

転載: blog.51cto.com/11976981/2423730