前言:关于分布式事务话题一直是颇有争议的话题,在这里通过自己对消息中间件实现分布式事务做一个简单的demo,同时也让自己能在实践中可以获取经验和对分布式事务自己的一些思考。
1.本地事务
传统的ssh,ssm,ssi这些java框架在配置好事务管理之后,我们的应用就能保证事务一致性;例如 在同一个数据库中A给B转账100元并发送100代金券,在这个过程中,不管是服务器挂掉还是转账失败抛出异常,最终都能保证A的钱要么转出去成功B收到100元和代金券,或者A和B都没有发生变化
2.分布式事务
余额表和代金券表分布在不同的节点的数据库,转账和发放代金券是不同的应用,他们通过rpc,httpclient,mq实现消息对接;这时候A给B转账成功,但是发放代金券失败,我们应该如何处理呢?
3.使用消息队列ActiveMq实现事务一致性
- 实现流程是用户注册后发放代金券,在本文中 用户注册是一个应用,发放代金券是另外一个应用,它们之间是通过activemq实现消息收发,也就是用户注册成功后推送用户信息到消息中间件,在代金券应用中实现消息监听发放代金券。所以这里分为2个步骤去进行,在我们日常企业开发中,分布式开发都是把每个业务抽取出来作为一个单独的项目,这样某个项目挂掉后不会影响其他业务的正常进行。
- 首先创建2个maven项目,分别叫account和voucher,在这里我用的是springmvc+jdbc作为项目骨架
- 在account中我新建了一个UserController.java作为注册的入口,写好注册的方法,注册的方法如下图,其中注意的是增加了一张消息表,关于为什么需要消息表下面会详细解答。
消息表主要用处是假如我们消息投递到 消息中间件后,消费者那边挂了,然后积压了一批待发送的代金券在那里,这时候我们肯定不能说不管了,需要的是在消费者重启后主动查询待发送表,如果状态是待发送的都通通发出去。
时间: 2024-10-13 12:41:17