Spring Cloud 阿里RocketMQ Binder
RocketMQ 简介
RocketMQ是一个开源的分布式消息系统。它基于高可用分布式集群技术,提供低延迟、高稳定性的消息发布和订阅服务。RocketMQ广泛应用于各种行业,如异步通信解耦、企业服务、金融结算、电信、电子商务、物流、营销、社交媒体、即时通讯、移动应用、手机游戏、视频、物联网、车联网。
它具有以下特点:
- 消息发送和消费的严格顺序
- 丰富的消息拉取模式
- 消费者的横向可扩展性
- 实时消息订阅
- 亿级消息积累能力
RocketMQ 用法
- 下载 RocketMQ
下载RocketMQ 最新的二进制文件,并解压。
解压后的目录如下:
apache-rocketmq
├── LICENSE
├── NOTICE
├── README.md
├── benchmark
├── bin
├── conf
└── lib
- 启动名称服务器
nohup sh bin/mqnamesrv &
tail -f ~/logs/rocketmqlogs/namesrv.log
- 启动代理
nohup sh bin/mqbroker -n localhost:9876 &
tail -f ~/logs/rocketmqlogs/broker.log
- 发送和接收消息
发送信息:
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
消息发送成功时输出:SendResult [sendStatus=SEND_OK, msgId= …
接收消息:
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
消息接收成功时输出:ConsumeMessageThread_%d Receive New Messages: [MessageExt…
- 禁用服务器
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
Spring Cloud Stream介绍
Spring Cloud Stream 是一个微服务框架,用于构建基于消息的架构。它帮助您基于 SpringBoot 创建生产就绪的单服务器 Spring 应用程序,并使用Spring Integration
.
Spring Cloud Stream 提供了消息中间件配置的统一抽象,提出了发布-订阅、消费者组、分区等概念。
Spring Cloud Stream 中有两个概念:Binder 和 Binding
- Binder:用于与外部消息中间件集成的组件,用于创建绑定。不同的消息中间件产品有自己的 binder 实现。
例如,Kafka
使用KafkaMessageChannelBinder
、RabbitMQ
使用RabbitMessageChannelBinder
、同时RocketMQ
使用RocketMQMessageChannelBinder
。
- 绑定:包括输入绑定和输出绑定。
绑定充当消息中间件与应用程序的提供者和消费者之间的桥梁。开发者只需要使用 Provider 或 Consumer 来生产或消费数据,无需担心与消息中间件的交互。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8TRz75Zb-1644989375734)(https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/images/SCSt-overview.png)]
图 4. Spring Cloud Stream
现在让我们使用 Spring Cloud Stream 编写一个简单的发送和接收消息的代码:
MessageChannel messageChannel = new DirectChannel();
// Message subscription
((SubscribableChannel) messageChannel).subscribe(new MessageHandler() {
@Override
public void handleMessage(Message<? > message) throws MessagingException {
System.out.println("receive msg: " + message.getPayload());
}
});
// Message sending
messageChannel.send(MessageBuilder.withPayload("simple msg").build());
此代码中的所有消息类型均由spring-messaging
模块提供。它屏蔽了消息中间件的底层实现。如果要更改消息中间件,只需要在配置文件中配置相关消息中间件信息,修改binder依赖即可。
Spring Cloud Stream 的下层也在前面代码的基础上实现了各种代码抽象。
如何使用 Spring Cloud 阿里 RocketMQ Binder
要使用 Spring Cloud Alibaba RocketMQ Binder,您只需将其添加到您的 Spring Cloud Stream 应用程序中,使用以下 Maven 坐标:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rocketmq</artifactId>
</dependency>
或者,您也可以使用 Spring Cloud Stream RocketMQ Starter:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
</dependency>
Spring Cloud Alibaba RocketMQ Binder 工作原理
这是Spring Cloud Stream RocketMQ Binder的实现架构:
图 5. SCS RocketMQ 绑定器
RocketMQ Binder 的实现依赖于RocketMQ-Spring框架。
RocketMQ Spring 框架是 RocketMQ 和 Spring Boot 的集成。它提供了三个主要功能:
RocketMQTemplate
:发送消息,包括同步消息、异步消息和事务消息。@RocketMQTransactionListener
:收听并检查交易消息。@RocketMQMessageListener
: 消费消息。
RocketMQMessageChannelBinder
是一个标准的实施粘结剂,将建立RocketMQInboundChannelAdapter
和RocketMQMessageHandler
内部。
RocketMQMessageHandler
将RocketMQTemplate
根据 Binding 配置进行构建。RocketMQTemplate
内部将module的org.springframework.messaging.Message
消息类转换为spring-messaging
RocketMQ消息类org.apache.rocketmq.common .message.Message
,然后发送出去。
RocketMQInboundChannelAdapter
也会RocketMQListenerBindingContainer
根据 Binding 配置进行构造,并RocketMQListenerBindingContainer
启动 RocketMQConsumer
接收消息。
目前 Binder 支持设置相关的 key inHeader
来设置 RocketMQ 消息的属性。
例如 , , , , ,TAGS
表示DELAY
RocketMQTRANSACTIONAL_ARG
消息KEYS
对应的标签。WAIT_STORE_MSG_OK``FLAG
MessageBuilder builder = MessageBuilder.withPayload(msg)
.setHeader(RocketMQHeaders.TAGS, "binder")
.setHeader(RocketMQHeaders.KEYS, "my-key")
.setHeader(MessageConst.PROPERTY_DELAY_TIME_LEVEL, "1");
Message message = builder.build();
output().send(message);
支持消息源
SCS RocketMQ Binder 支持MessageSource
,可以通过拉取方式接收消息:
@SpringBootApplication
@EnableBinding(MQApplication.PolledProcessor.class)
public class MQApplication {
private final Logger logger =
LoggerFactory.getLogger(MQApplication.class);
public static void main(String[] args) {
SpringApplication.run(MQApplication.class, args);
}
@Bean
public ApplicationRunner runner(PollableMessageSource source,
MessageChannel dest) {
return args -> {
while (true) {
boolean result = source.poll(m -> {
String payload = (String) m.getPayload();
logger.info("Received: " + payload);
dest.send(MessageBuilder.withPayload(payload.toUpperCase())
.copyHeaders(m.getHeaders())
.build());
}, new ParameterizedTypeReference<String>() { });
if (result) {
logger.info("Processed a message");
}
else {
logger.info("Nothing to do");
}
Thread.sleep(5_000);
}
};
}
public static interface PolledProcessor {
@Input
PollableMessageSource source();
@Output
MessageChannel dest();
}
}
配置选项
RocketMQ Binder 属性
-
spring.cloud.stream.rocketmq.binder.name-server
RocketMQ Server的名称服务器(旧版本使用namesrv-addr配置项)。默认值:
127.0.0.1:9876
。 -
spring.cloud.stream.rocketmq.binder.access-key
阿里云账号的AccessKey。默认值:空。
-
spring.cloud.stream.rocketmq.binder.secret-key
阿里云账号的 SecretKey。默认值:空。
-
spring.cloud.stream.rocketmq.binder.enable-msg-trace
为所有生产者和消费者启用消息跟踪功能。默认值:
true
。 -
spring.cloud.stream.rocketmq.binder.customized-trace-topic
消息跟踪的跟踪主题。默认值:
RMQ_SYS_TRACE_TOPIC
。
RocketMQ 消费者属性
以下属性仅适用于 RocketMQ 生产者,并且必须以spring.cloud.stream.rocketmq.bindings.<channelName>.consumer.
.
-
enable
启用消费者绑定。默认值:
true
。 -
tags
消费者订阅标签表达式,标签拆分为
||
.默认值:空。 -
sql
消费者订阅 sql 表达式。默认值:空。
-
broadcasting
控制消息模式,如果希望所有订阅者都接收消息,广播是一个不错的选择。默认值:
false
。 -
orderly
同时或有序地接收消息。默认值:
false
。 -
delayLevelWhenNextConsume
并发消费的消息消费重试策略:-1,不重试,直接放入DLQ0,broker控制重试频率>0,客户端控制重试频率默认值:
0
。 -
suspendCurrentQueueTimeMillis
消息消费重试的时间间隔,用于有序消费。默认值:
1000
。
RocketMQ 提供者属性
以下属性仅适用于 RocketMQ 生产者,并且必须以spring.cloud.stream.rocketmq.bindings.<channelName>.producer.
.
-
enable
启用生产者绑定。默认值:
true
。 -
group
生产者组名称。默认值:空。
-
maxMessageSize
允许的最大消息大小(以字节为单位)。默认值:
8249344
。 -
transactional
发送事务消息。默认值:
false
。 -
sync
以同步方式发送消息。默认值:
false
。 -
vipChannelEnabled
使用vip频道发送消息。默认值:
true
。 -
sendMessageTimeout
发送消息超时的毫秒数。默认值:
3000
。 -
compressMessageBodyThreshold
压缩消息体阈值,即默认压缩大于4k的消息体。默认值:
4096
。 -
retryTimesWhenSendFailed
在同步模式下声明发送失败之前内部执行的最大重试次数。默认值:
2
。 -
retryTimesWhenSendAsyncFailed
在异步模式下声明发送失败之前内部执行的最大重试次数。默认值:
2
。 -
retryNextServer
指示是否在内部发送失败时重试另一个代理。默认值:
false
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY