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 是一个微服务框架,用于构建基于消息的架构。它帮助您基于 SpringBoot 创建生产就绪的单服务器 Spring 应用程序,并使用Spring Integration
.
Spring Cloud Stream 提供了消息中间件配置的统一抽象,提出了发布-订阅、消费者组、分区等概念。
Spring Cloud Stream 中有两个概念:Binder 和 Binding
例如,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 Alibaba RocketMQ Binder,您只需将其添加到您的 Spring Cloud Stream 应用程序中,使用以下 Maven 坐标:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-stream-binder-rocketmqartifactId>
dependency>
或者,您也可以使用 Spring Cloud Stream RocketMQ Starter:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-stream-rocketmqartifactId>
dependency>
这是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();
}
}
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 生产者,并且必须以spring.cloud.stream.rocketmq.bindings.
.
enable
启用消费者绑定。默认值:true
。
tags
消费者订阅标签表达式,标签拆分为||
.默认值:空。
sql
消费者订阅 sql 表达式。默认值:空。
broadcasting
控制消息模式,如果希望所有订阅者都接收消息,广播是一个不错的选择。默认值:false
。
orderly
同时或有序地接收消息。默认值:false
。
delayLevelWhenNextConsume
并发消费的消息消费重试策略:-1,不重试,直接放入DLQ0,broker控制重试频率>0,客户端控制重试频率默认值:0
。
suspendCurrentQueueTimeMillis
消息消费重试的时间间隔,用于有序消费。默认值:1000
。
以下属性仅适用于 RocketMQ 生产者,并且必须以spring.cloud.stream.rocketmq.bindings.
.
enable
启用生产者绑定。默认值:true
。
group
生产者组名称。默认值:空。
maxMessageSize
允许的最大消息大小(以字节为单位)。默认值:8249344
。
transactional
发送事务消息。默认值:false
。
sync
以同步方式发送消息。默认值:false
。
vipChannelEnabled
使用vip频道发送消息。默认值:true
。
sendMessageTimeout
发送消息超时的毫秒数。默认值:3000
。
compressMessageBodyThreshold
压缩消息体阈值,即默认压缩大于4k的消息体。默认值:4096
。
retryTimesWhenSendFailed
在同步模式下声明发送失败之前内部执行的最大重试次数。默认值:2
。
retryTimesWhenSendAsyncFailed
在异步模式下声明发送失败之前内部执行的最大重试次数。默认值:2
。
retryNextServer
指示是否在内部发送失败时重试另一个代理。默认值:false
。