持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
简介
RocketMQ 是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式的特点。它是一个采用 Java 语言开发的分布式的消息系统,由阿里巴巴团队开发。
特性
- 支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型
- 支持顺序消息:消息在Broker中是采用队列的FIFO模式存储的,也就是发送是顺序的,只要保证消费的顺序性即可。
- 支持定时消息和延迟消息:Broker中由定时消息的机制,消息发送到Broker中,不会立即被Consumer消费,会等到一定的时间才被消费。延迟消息也是一样,延迟一定时间之后才会被Consumer消费。
- 亿级消息的堆积能力,单个队列中的百万级消息的累积容量。
- 支持分布式事务消息:这里是采用半消息确认和消息回查机制来保证分布式事务消息的,下面会详细描述。
- 分布式高可用的部署架构,Broker服务器支持多Master多Slave的同步双写以及Master多Slave的异步复制模式,其中同步双写可保证消息不丢失。
基本架构
如图所示,RocketMQ包含四个核心组成
- NameServer :基于高可用设计产生的,用于服务发现和路由。正式应用时通常采用集群部署。
- Broker:实现队列机制,负责消息存储和转发。正式应用时也采用集群部署。
- Producer:消息生产者,生成消息并发送到RocketMQ中,生产者通常是我们自己实现的应用程序。
- Consumer:消息消费者,从RocketMQ中接收消息并进行业务处理。这部分也通常是我们自己实现的。
安装RocketMQ
下载RocketMQ
下载地址:www.apache.org/dyn/closer.…
解压RocketMQ
cd /usr/local
tag -zxvf rocketmq-all-4.9.2-bin-release.zip
mv rocketmq-all-4.9.2-bin-release rocketmq
修改启动参数
分别修改runserver.sh和runbroker.sh参数,将启动的内存调整为2G
启动NameServer
cd /usr/local/rocketmq/bin
sh runserver.sh &
启动BrokerServer
cd /usr/local/rocketmq/bin
sh runbroker.sh &
测试
分别启动生产者和消费者,发送测试消息,如果能收到消息则表示rocket启动成功
集成步骤
pom.xml添加相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-common</artifactId>
<version>4.8.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
MQ生产者配置
rocketmq:
name-server: 127.0.0.1:9876
# 生产者配置
producer:
isOnOff: on
# 发送同一类消息的设置为同一个group,保证唯一
group: test-rocketmq-group
groupName: test-rocketmq-group
# 服务地址
namesrvAddr: 127.0.0.1:9876
# 消息最大长度 默认1024*4(4M)
maxMessageSize: 2098
# 发送消息超时时间,默认3000
sendMsgTimeout: 3000
# 发送消息失败重试次数,默认2
retryTimesWhenSendFailed: 3
编写消息生产者
@Component
public class MqProduce
{
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private RocketMQTemplate rocketMQTemplate;
/**
* 发送异步消息
* @param topic
* @param msg
*/
public void sendAsyncMessage(String topic,Object msg)
{
rocketMQTemplate.asyncSend("testtopic", MessageBuilder.withPayload(msg).build(),new SendCallback()
{
@Override
public void onSuccess(SendResult result)
{
logger.info("发送消息成功");
}
@Override
public void onException(Throwable e)
{
logger.error("发送消息失败",e);
}
});
}
/**
* 发送同步消息
* @param topic
* @param msg
*/
public void sendMessage(String topic,Object msg)
{
rocketMQTemplate.convertAndSend(topic, msg);
}
}
消息消费者
@Component
@RocketMQMessageListener(consumerGroup="test-rocketmq-group",topic="testtopic")
public class MqConsumer implements RocketMQListener<Object>
{
private Logger logger =LoggerFactory.getLogger(getClass());
public void onMessage(Object o)
{
String msg=JSON.toJSONString(o);
logger.info("send msg content:{}", msg);
}
}
说明:Spring Boot已经提供了丰富的Api接口 consumerGroup:客户组需要与生产者配置的一致 topic: 消息的主题
示例代码
@RestController
public class MqController
{
@Autowired
private MqProduce mqProduce;
private String topic="testtopic";
@RequestMapping("/sendMsg")
public String sendMsg()
{
User user =new User();
user.setUserName("jswh");
user.setUserId("jswh");
mqProduce.sendAsyncMessage(topic, user);
return "success";
}
}
测试
启动应用程序,访问http://localhost:9090/sendMsg 结果如下:
总结
本文讲解Spring Boot集成RocketMQ发送基本的消息,关于RocketMQ的高可用事务消息、顺序消息等高级特性功能将在后续的文章中进行讲解,如有相关问题,请随时反馈。