一、准备工作
1、整体流程图
基于事务消息分布式事物方案是 事务消息最终是分布式事务的最终一致性跟我之前写的分布式的seata的方案不太一样,比如a给b打钱,当a的钱扣除成功之后(扣除失败则本次失败),。 如果系统 B 的本地事务执行失败了咋办? 基于 mq 重试咯,mq 会自动不断重试直到成功,如果实在是不行,可以发送报警由人工来手工回滚和补偿。 这种方案的要点就是可以基于 mq 来进行不断重试,最终一定会执行成功的。 因为一般执行失败的原因是网络抖动或者数据库瞬间负载太高,都是暂时性问题。 通过这种方案,99.9%的情况都是可以保证数据最终一致性的,剩下的 0.1%出问题的时候,就人工修复数据呗。
2、安装rocketmq
这里使用docker安装rocketmq,先安装docker
- Centos系统
sudo yum install -y yum-utils device-mapper-persistent-data lvm2sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.reposudo yum install docker-ce -ysudo systemctl enable dockersudo systemctl start docker
在安装过程中,也许会遇到Requires: container-selinux >= 2.9 的异常; 可以打开Centos下载包中的最新container-selinux包的地址, 然后运行:
sudo yum install -y http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.68-1.el7.noarch.rpm
- Ubuntu系统
sudo apt-get updatesudo apt-get install apt-transport-https ca-certificates curl software-properties-commoncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -sudo apt-key fingerprint 0EBFCD88sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"sudo apt-get update sudo apt-get install docker-ce
- Mac系统 docs.docker.com/docker-for-…
- Windows docs.docker.com/docker-for-…
再安装docker-compose
pip install docker-compose -i https://mirrors.aliyun.com/pypi/simple/
如果pip不存在,可以尝试
sudo yum install python-pip sudo pip install --upgrade pip
部署rocketmq(这里以centos为例)
mkdir /usr/local/docker/rocketmqcd /usr/local/docker/rocketmqvi broker.conf
broker.conf内容如下
brokerClusterName=DefaultClusterbrokerName=broker-abrokerId=0# 修改为你宿主机的 IPbrokerIP1=192.168.30.131defaultTopicQueueNums=4autoCreateTopicEnable=trueautoCreateSubscriptionGroup=truelistenPort=10911deleteWhen=04fileReservedTime=120mapedFileSizeCommitLog=1073741824mapedFileSizeConsumeQueue=300000diskMaxUsedSpaceRatio=88maxMessageSize=65536brokerRole=ASYNC_MASTERflushDiskType=ASYNC_FLUSH
cd /usr/local/docker/rocketmqvi docker-compose.yml
docker-compose.yml 内容如下
version: '3.5'services: rmqnamesrv: image: foxiswho/rocketmq:server container_name: rmqnamesrv ports: - 9876:9876 volumes: - ./data/logs:/opt/logs - ./data/store:/opt/store networks: rmq: aliases: - rmqnamesrv rmqbroker: image: foxiswho/rocketmq:broker container_name: rmqbroker ports: - 10909:10909 - 10911:10911 volumes: - ./data/logs:/opt/logs - ./data/store:/opt/store - ./data/brokerconf/broker.conf:/etc/rocketmq/broker.conf environment: NAMESRV_ADDR: "rmqnamesrv:9876" JAVA_OPTS: " -Duser.home=/opt" JAVA_OPT_EXT: "-server -Xms128m -Xmx128m -Xmn128m" command: mqbroker -c /etc/rocketmq/broker.conf depends_on: - rmqnamesrv networks: rmq: aliases: - rmqbroker rmqconsole: image: styletang/rocketmq-console-ng container_name: rmqconsole ports: - 8080:8080 environment: JAVA_OPTS: "-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" depends_on: - rmqnamesrv networks: rmq: aliases: - rmqconsolenetworks: rmq: name: rmq driver: bridge
cd /usr/local/docker/rocketmqdocker-compose up -d
启动完成后docker ps -a 正常如下图
输入 ip:8080 可进入 rockermq 控制台
3、下载启动nacos
nacos-server-1.1.:github.com/alibaba/nac… 启动nacos访问:http://localhost:8848/nacos 用户名密码 nacos/nacos
4、 demo 工程代码:github.com/leo20131231…
5、建数据库
示例工程order订单 的数据库脚本:github.com/leo20131231…
示例工程storage 的数据库脚本:github.com/leo20131231…
三、启动项目
修改相应的数据库链接
请求 http://localhost:9091/order/placeOrder/commit
1、订单系统发送prepare消息
2、订单系统执行本地事物 1).如果本地事务执行失败,回滚消息,Broker端会删除半消息 2)如果本地事务执行成功,会确认发送消息 3)如果当本地事务执行一班系统挂掉了,系统会重新调用下面checkLocalTransaction方法
3、检查本地事务执行状态
4、库存系统消息成功,扣减库存
作者:leo2012
链接:https://juejin.im/post/6854573218851160071
来源:掘金