【分布式事务系列】Saga模式-命令协同式

443 阅读2分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

命令协同式

把Saga的决策和执行顺序逻辑集中在一个Saga控制类中,它以命令/回复的方式与每项服务进行通信,告诉它们应该执行哪些操作。

命令协同式需要定义一个Saga协调器,负责告诉每一个参与者需要做什么,Saga协调器以命令或回复的方式与每项服务进行通信。

命令协同式实现步骤如下:

  • 订单服务创建一个订单,之后创建一个订单Saga协调器,启动订单服务。
  • Saga协调器向库存服务发送冻结库存命令,库存服务通过 order Saga Reply Queue回复执行结果。
  • Saga协调器向支付服务发送账户扣款命令,支付服务通过Order Saga Reply Queue回复执行结果。
  • Saga协调器向积分服务发送增加积分命令,积分服务回复执行结果。

注意点:

Saga协调器需要提前知道创建订单事务的所有流程(Saga通过基于JSON的状态机引擎实现的),在整个流程中任何一个环节执行失败,它都需要向每个参与者发送命令撤销之前的事务操作。

Seata安装

Seata是一个需要独立部署的中间件,除直接部署外,它还支持多种部署方式,比如Docker、Kubernetes等,

安装步骤:

  • 在Seata官网下载1.0.0版本的安装包

  • 进入${seata_home}\bin目录,根据系统类型执行相应的启动脚本,在Linux/Max下执行命令如下:

    sh seata-server.sh
    
  • seata-server.sh支持设置启动参数,完整的参数列表如下:

参数   全写    	作用   			  备注
-h     -host  指定在注册中心注册的IP 不指定时获取当前的IP地址,外部访问部署在云环境和容器中的										server,建议指定
-p     -port  指定server启动的端口号  默认是8091
-m -storeMode 事务日志存储方式        支付file和db,默认为file
-n -serverNode 用于指定seata-serverk节点的ID 如1,2,3...,默认为1
-e -seataEnv   指定seata-server的运行环境 如dev、test等,服务启动时会使用registry-dev.conf的配置