一、准备工作
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 lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce -y
sudo systemctl enable docker
sudo 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 update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo 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/rocketmq
cd /usr/local/docker/rocketmq
vi broker.conf
broker.conf内容如下
brokerClusterName=DefaultCluster
brokerName=broker-abrokerId=0
# 修改为你宿主机的 IP
brokerIP1=192.168.30.131
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=10911
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
diskMaxUsedSpaceRatio=88
maxMessageSize=65536
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
cd /usr/local/docker/rocketmq
vi 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:
- rmqconsole
networks:
rmq:
name: rmq
driver: bridge
cd /usr/local/docker/rocketmq
docker-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
来源:掘金