【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性

这篇具有很好参考价值的文章主要介绍了【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

org.springframework.boot

spring-boot-starter-amqp

mysql

mysql-connector-java

runtime

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-jdbc

com.alibaba

fastjson

1.2.17

3.2.1.2配置文件内容:

server:

port: 8080

spring:

datasource:

driver-class-name: com.mysql.cj.jdbc.Driver

url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true

username: root

password: root123

rabbitmq:

host: localhost

port: 5672

username: admin

password: admin123

virtual-host: /

#必须配置这个,生产者才会确认回调

publisher-confirm-type: correlated

publisher-returns: true

#重要,手动开启消费者ACK,控制消息在MQ中的删除、重发

listener:

simple:

acknowledge-mode: MANUAL

3.2.2 订单中心代码

import com.alibaba.fastjson.JSONObject;

import lombok.extern.slf4j.Slf4j;

import org.springframework.amqp.rabbit.connection.CorrelationData;

import org.springframework.amqp.rabbit.core.RabbitTemplate;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

import java.beans.Transient;

/**

* @Author Lee

* @Description 订单中心

* @Date 2020/1/30 16:57

* @Version 1.0

*/

@Slf4j

@Service

public class OrderService {

@Autowired

private JdbcTemplate jdbcTemplate;

@Autowired

private RabbitTemplate rabbitTemplate;

@PostConstruct

public void setup(){

//消息发送完成后,则回调此方法,ack代表此方法是否发送成功

rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback(){

@Override

public void confirm(CorrelationData correlationData, boolean ack, String cause) {

//ack为true,代表MQ已经准确收到消息

if(!ack){

return;

}

try{

String sql = “update tb_msgstatus set status = 1 where msgid = ?”;

int count = jdbcTemplate.update(sql,correlationData.getId());

if(count != 1){

log.warn(“本地消息表状态修改失败”);

}

}catch (Exception e){

log.warn(“本息消息表状态修改异常”,e);

}

}

});

}

/**

* 创建订单信息

* @param order 订单信息

* @throws Exception

*/

public void createOrder(JSONObject order) throws Exception {

//保存订单信息

saveOrder(order);

//发送MQ消息,直接发送时不可靠,可能会失败(发送后根据回执修改状态表,定时任务扫表读取失败数据重新发送)

sendMsg(order);

}

/**

* 发送订单信息至MQ

* @param order 订单信息

*/

private void sendMsg(JSONObject order) {

//发送消息到MQ,CorrelationData作用:当收到消息回执时会带上这个参数

rabbitTemplate.convertAndSend(“orderExchange”,“”,order.toJSONString(),new CorrelationData((String) order.get(“orderid”)));

}

/**

* 保存订单信息

* @param order 订单信息

* @throws Exception

*/

@Transient

private void saveOrder(JSONObject order) throws Exception {

String sql = “insert into tb_order (orderid,userid,goodsid,ordertime) values (? , ? , ? , now())”;

//保存订单信息

int count = jdbcTemplate.update(sql,order.get(“orderid”),order.get(“userid”),order.get(“goodsid”));

if(count != 1){

throw new Exception(“订单创建失败”);

}

//保存消息发送状态

saveLocalMsg(order);

}

/**

* 记录消息发送状态

* @param order 订单信息

* @throws Exception

*/

private void saveLocalMsg(JSONObject order) throws Exception {

String sql = “insert into tb_msgstatus (msgid,msg,status,sendtime) values (? , ? , 0 , now())”;

//记录消息发送状态

int count = jdbcTemplate.update(sql,order.get(“orderid”),order.toJSONString());

if(count != 1){

throw new Exception(“记录消息发送状态失败”);

}

}

}

3.3 订单中心测试

3.3.1 测试代码

@Autowired

private OrderService orderService;

@Test

public void orderServiceTest() throws Exception {

//生成订单信息

JSONObject orderinfo = new JSONObject();

orderinfo.put(“orderid”,UUID.randomUUID().toString());

orderinfo.put(“userid”,UUID.randomUUID().toString());

orderinfo.put(“goodsid”,UUID.randomUUID().toString());

orderService.createOrder(orderinfo);

}

3.3.2 测试验证结果

orderQueue消息队列中已经接收到数据

【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性,程序员,分布式,rabbitmq 【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性,程序员,分布式,rabbitmq

订单表里的数据

【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性,程序员,分布式,rabbitmq

状态表数据:

【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性,程序员,分布式,rabbitmq

4、运单中心


4.1 运单中心分析

【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性,程序员,分布式,rabbitmq

消费者收到消息进行处理,处理成功则发送ACK消息通知MQ清除该条记录,否则通知MQ重发或者等待MQ自动重发。本地维护一个处理次数,如果多次处理仍然失败,则将该消息丢弃或者加入到死信队列(DLQ)中。死信队列中的数据可以人工干预。推荐Java精选公众号,回复Java面试,获取面试资料。

4.2 编写代码

import com.alibaba.fastjson.JSONObject;

import com.rabbitmq.client.Channel;

import lombok.extern.slf4j.Slf4j;

import org.springframework.amqp.rabbit.annotation.RabbitListener;

import org.springframework.amqp.support.AmqpHeaders;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.messaging.handler.annotation.Header;

import org.springframework.stereotype.Service;

import java.beans.Transient;

import java.io.IOException;

/**

* @Author Lee

* @Description 运单系统

* @Date 2020/1/30 21:58

* @Version 1.0

*/

@Slf4j

@Service

public class DispatchService {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性,程序员,分布式,rabbitmq

【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性,程序员,分布式,rabbitmq

【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性,程序员,分布式,rabbitmq

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性,程序员,分布式,rabbitmq

最后

一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。

这不,马上就要到招聘季了,很多朋友又开始准备“金三银四”的春招啦,那我想这份“java高分面试指南”应该起到不小的作用,所以今天想给大家分享一下。

【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性,程序员,分布式,rabbitmq

请注意:关于这份“java高分面试指南”,每一个方向专题(25个)的题目这里几乎都会列举,在不看答案的情况下,大家可以自行测试一下水平 且由于篇幅原因,这边无法展示所有完整的答案解析
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
va反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。

这不,马上就要到招聘季了,很多朋友又开始准备“金三银四”的春招啦,那我想这份“java高分面试指南”应该起到不小的作用,所以今天想给大家分享一下。

[外链图片转存中…(img-yNUCgxDi-1712701157677)]

请注意:关于这份“java高分面试指南”,每一个方向专题(25个)的题目这里几乎都会列举,在不看答案的情况下,大家可以自行测试一下水平 且由于篇幅原因,这边无法展示所有完整的答案解析
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!文章来源地址https://www.toymoban.com/news/detail-850924.html

到了这里,关于【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于RocketMQ实现分布式事务

    在一个微服务架构的项目中,一个业务操作可能涉及到多个服务,这些服务往往是独立部署,构成一个个独立的系统。这种分布式的系统架构往往面临着分布式事务的问题。为了保证系统数据的一致性,我们需要确保这些服务中的操作要么全部成功,要么全部失败。通过使用

    2024年03月12日
    浏览(62)
  • 分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)

    什么是分布式 一个系统各组件分别部署在不同服务器。彼此通过网络通信和协调的系统。 也可以指多个不同组件分布在网络上互相协作,比如说电商网站 也可以一个组件的多个副本组成集群,互相协作如同一个组件,比如数据存储服务中为了数据不丢失而采取的多个服务备

    2024年04月11日
    浏览(36)
  • 分布式系统概念和设计——(事务与并发控制)

    事务与并发控制 简介 事务的目标是在多个事务访问对象以及服务器面临崩溃的情况下,保证所有由服务器管理的对象始终维持在一个一致的状态上 事务是由客户定义的针对服务器对象的一组操作,组成为一个不可分割的单元,由服务器执行 服务器必须保证整个事务被执行,

    2024年02月07日
    浏览(31)
  • RocketMQ分布式事务 -> 最终一致性实现

    · 分布式事务的问题常在业务与面试中被提及, 近日摸鱼看到这篇文章, 阐述的非常通俗易懂, 固持久化下来我博客中, 也以便于我二刷 转载源 : 基于RocketMQ分布式事务 - 完整示例 本文代码不只是简单的demo,考虑到一些异常情况、幂等性消费和死信队列等情况,尽量向可靠业务

    2024年02月15日
    浏览(38)
  • SpringCloudAlibaba集成RocketMQ实现分布式事务事例(一)

    业务需求 用户请求订单微服务 order-service 接口删除订单(退货),删除订单时需要调用 account-service的方法给账户增加余额,一个典型的分布式事务问题。 代码实现 事务消息有三种状态: TransactionStatus.CommitTransaction:提交事务消息,消费者可以消费此消息 TransactionStatus.Roll

    2024年02月13日
    浏览(91)
  • Spring Boot实现分布式事务的协调和管理

    在现代的分布式系统中,往往存在多个服务协同完成一个业务操作的情况。而在这种情况下,如何保证所有服务的数据一致性成为了一个重要的问题。Spring Boot作为一个流行的Java开发框架,提供了多种方法来实现分布式事务的协调和管理。本文将介绍一些常用的方式和技术来

    2024年02月08日
    浏览(31)
  • JAVA微服务分布式事务的几种实现方式

    一致性(Consistency) :在分布式系统中所有的数据备份,在同一时刻都保持一致状态,如无法保证状态一致,直接返回错误; 可用性(Availability):在集群中一部分节点故障,也能保证客户端访问系统并得到正确响应,允许一定时间内数据状态不一致; 分区容错性(Partiti

    2024年02月12日
    浏览(38)
  • springboot dubbo seata nacos集成 分布式事务seata实现

    官网:http://seata.io/zh-cn/docs/overview/what-is-seata.html Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 官网;https://cn.dubbo.apache.org/zh-cn/overview/what/

    2024年02月13日
    浏览(35)
  • 实现声明式锁,支持分布式锁自定义锁、SpEL和结合事务

    目录 2.实现 2.1 定义注解 2.2 定义锁接口 2.3 锁的实现 2.3.1 什么是SPI 2.3.2 通过SPI实现锁的多个实现类 2.3.3 通过SPI自定义实现锁 3.定义切面 3.1 切面实现 3.2 SpEL表达式获取动态key 3.3 锁与事务的结合 4.测试 4.1 ReentrantLock测试 4.2 RedissonClient测试 4.3 自定义锁测试 5.尾声 5.1 todo list

    2023年04月19日
    浏览(99)
  • 分布式:一文吃透分布式事务和seata事务

    什么是事务 事务是并发控制的单位,是用户定义的一个操作序列。 事务特性 原子性(Atomicity): 事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。 一致性(Consistency): 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性

    2024年02月07日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包