Skip to content

RingoTangs/spring-boot-rabbitmq-delivery

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RabbitMQ实现消息可靠性投递和重复消费

1. 环境准备

1.1. MySQL

当前项目MySQL版本为5. 7,为了方便搭建环境,采用 Docker 安装。

docker run --name mysql -d -p 3306:3306 \
-v yourPath:/var/lib/mysql \
-v yourPath:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=yourPassword \
mysql:5.7

数据库表请看项目中的 order_log.sql

1.2. RabbitMQ

RabbitMQ的 Docker 镜像为 3-management,带有 Web 界面的控制台。

默认端口 5672,web控制台端口 15672。

docker run -d \
--name rabbimtmq -p 5672:5672 \
-p 15672:15672 \
rabbitmq:3-management

1.3. Redis

Redis用来解决消息重复消费的问题,默认端口6379。

docker run -p 6397:6379 --name redis \
-d redis:6.0.5 redis-server /etc/redis/redis.conf

1.4. 开发环境

  • JDK 1.8
  • Maven 3.5
  • IntelliJ IDEA (注意:务必使用 IDEA 开发,同时保证安装 lombok 插件)

2. 项目介绍

2.1. 基本介绍

该项目中包含两个子项目order-entityorder-producer

  • order-entity:封装了实体类,导入一些工具包。
  • order-producer:主要业务逻辑,Controller、Service、定时任务等,并且依赖 order-entity
  • order-consumer:消费端,使用Redis避免消息的重复消费。

2.2. order-producer

  • config:该包下是 RabbitMQ 的配置,包括声明交换机、队列、绑定关系和消息的转换。
  • constant:该包定义常量,用于方便描述消息的投递状态。
  • controller:定义了一个接口 /order,在浏览器/postman 中调用该接口可创建订单。
  • mapper:定义了操作数据库的方法。
  • producer:消息投递和消息确认模板。
  • service:具体业务逻辑。
  • task:定时任务。

2.3. 业务流程

可靠性投递流程

  • step1:订单和日志记录全部入库(消息日志入库的初始投递状态为0,表示正在投递)。
  • step2:向 Broker 投递消息。
  • step3:发送端监听 Broker 的确认。
  • step4:如果发送端监听确认消息为ACK,表示Broker成功收到消息,将日志记录中的消息投递状态更改为1(1代表消息投递成功)。
  • step5、step6:定时任务抓取超时消息(status = 0,并且投递时间大于1分钟即为超时消息),如果重投次数 >= 3就标记为投递失败(投递状态更改为2),反之重新投递。

3. 如何使用?

# 下载项目到本地
git clone https://github.com/RingoTangs/spring-boot-rabbitmq-delivery.git

# 使用Maven打开该项目下载依赖

# 配置application.yaml中的环境

# 先启动生产端, 再启动消费端, 访问 /order接口,观察 MySQL 和 RabbitMQ消息记录即可!

About

RabbitMQ消息可靠性投递解决办法

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages