1. 概览
Spring 的 @Async 注解,想必大家都非常熟悉,只需在方法上增加 @Aysnc ,便可以将其转化为异步操作,任务在后台线程池中运行。
由于数据存储于内存,服务重启存在任务丢失问题,所以,只适用于要求不太严谨的业务,对于要求严格的场景,只能另选方案。
1.1. 背景
在日常开发过程中,像记录日志这种非核心业务,才允许使用 Spring 的 Async 进行异步化,其他场景需要使用更加完备的 MQ 方案。
MQ 方案
面对这种场景,免不了一顿编码、一通测试,咱们的时间就这样没有了。对于这种纯纯的技术需求,封装框架是投入产出比最高的事。
1.2. 目标
期望框架能够提供:
-
不需要 Coding,直接将一个方法转变为 MQ 的异步处理;
-
支持 顺序消息 特性,以处理对顺序有依赖的场景;
-
发送,消费可以分离,能够在不同的集群中完成,以更好的支持资源隔离;
2. 快速入门
框架基于 RocketMQ 进行构建,请自行完成 RocketMQ 的搭建。
2.1. 引入 RocketMQ
我们使用 rocketmq starter 完成基本配置。
首先,在 pom 中增加 rocketmq starter 依赖,具体如下:
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
其次,在 application.yml 中添加 rocketmq 配置,具体如下:
rocketmq:
name-server: http://127.0.0.1:9876
producer:
group: async-demo
其中,name-server 根据具体情况进行配置。
配置完成,可以在项目中:
-
注入 RocketMQTemplate 进行消息发送;
-
使用 @RocketMQMessageListener 标记处理方法,进行消息消费;
2.2. 添加 lego-starter 依赖
为了方便与 spring-boot 项目集成,lego 提供 lego-starter,以完成快速接入。
在 pom 中增加 starter,具体如下:
<dependency>
<groupId>com.geekhalo.lego</groupId>
<artifactId>lego-starter</artifactId>
<version>0.1.4-async_based_rocketmq-SNAPSHOT</version>
</dependency>
其中,自动配置机制将完成:
-
为 @AsyncBasedRocketMQ 注解方法,增加消息拦截,并启动 并行消费者 进行消息消费;
-
为 @AsyncForOrderedBasedRocketMQ 注解方法,增加消息拦截,并启动 顺序消费者进行消息消费;
2.3. 并行消息异步处理
我们只需在方法上添加 @AsyncBasedRocketMQ 注解,完成基础配置,该方法便具有异步处理能力。具体如下:
@AsyncBasedRocketMQ(topic = "${async.test.normal.topic}",
tag = "asyncTest1",