一、准备工作

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
来源:掘金