9.Spring Cloud Ailibaba RocketMQ(分布式消息系统)

文章介绍了SpringCloudAlibabaRocketMQ作为分布式消息系统的基础,讲解了SpringCloudStream框架,包括Binder和Binding的概念,以及RocketMQ的特点。文中还展示了如何使用SpringCloudAlibabaRocketMQBinder进行消息发送和接收,并详细列举了RocketMQBinder的相关配置选项。
摘要由CSDN通过智能技术生成

目录


Spring Cloud Alibaba专栏目录(点击进入…)



Spring Cloud Ailibaba RocketMQ(分布式消息系统)

Spring Cloud Stream介绍

Spring Cloud Stream是一个用于构建基于消息的微服务应用框架。它基于Spring Boot来创建具有生产级别的单机Spring应用,并且使用Spring Integration与Broker进行连接。

Spring Cloud Stream提供了消息中间件配置的统一抽象,推出了publish-subscribe、consumer groups、partition这些统一的概念。

Spring Cloud Stream内部有两个概念:Binder和Binding

(1)Binder

跟外部消息中间件集成的组件,用来创建Binding,各消息中间件都有自己的Binder实现

比如:
Kafka的实现KafkaMessageChannelBinder,RabbitMQ的实现RabbitMessageChannelBinder,RocketMQ的实现RocketMQMessageChannelBinder。

(2)Binding

包括Input Binding和Output Binding

Binding在消息中间件与应用程序提供的Provider和Consumer之间提供了一个桥梁,实现了开发者只需使用应用程序的Provider或Consumer生产或消费数据即可,屏蔽了开发者与底层消息中间件的接触。


RocketMQ介绍

RocketMQ是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。
官网:http://rocketmq.apache.org/

特点:
(1)能够保证严格的消息顺序
(2)提供丰富的消息拉取模式
(3)高效的订阅者水平扩展能力
(4)实时的消息订阅机制
(5)亿级消息堆积能力


简单消息发送、接收

使用Spring Cloud Stream完成一段简单的消息发送和消息接收代码:
Spring Cloud Stream底层基于这段代码去做了各种抽象。下面代码所有的消息类都是spring-messaging模块里提供的。屏蔽具体消息中间件的底层实现,如果想用更换消息中间件,在配置文件里配置相关消息中间件信息以及修改binder依赖即可。

MessageChannel messageChannel = new DirectChannel();

// 消息订阅
((SubscribableChannel) messageChannel).subscribe(new MessageHandler() {
    @Override
    public void handleMessage(Message<?> message) throws MessagingException {
        System.out.println("receive msg: " + message.getPayload());
    }
});

// 消息发送
messageChannel.send(MessageBuilder.withPayload("simple msg").build());

如何使用Spring Cloud Alibaba RocketMQ Binder

如果要在项目中引入RocketMQ Binder,需要引入如下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实现架构:
在这里插入图片描述

RocketMQ Binder实现依赖于RocketMQ-Spring框架
RocketMQ-Spring框架是RocketMQ与Spring Boot的整合,RocketMQ Spring主要提供了3个特性:
(1)使用RocketMQTemplate用来统一发送消息,包括同步、异步发送消息和事务消息
(2)@RocketMQTransactionListener注解用来处理事务消息的监听和回查
(3)@RocketMQMessageListener注解用来消费消息

RocketMQ Binder的核心类RocketMQMessageChannelBinder实现了Spring Cloud Stream规范,内部构建会RocketMQInboundChannelAdapter和RocketMQMessageHandler。

RocketMQMessageHandler会基于Binding配置构造RocketMQTemplate,RocketMQTemplate内部会把spring-messaging模块内org.springframework.messaging.Message消息类转换成 RocketMQ的消息类org.apache.rocketmq.common.message.Message,然后发送出去。

RocketMQInboundChannelAdapter基于Binding配置构造 RocketMQListenerBindingContainer
,RocketMQListenerBindingContainer内部会启动RocketMQ Consumer接收消息

注意:在使用RocketMQ Binder的同时也可以配置“rocketmq.**”用于触发RocketMQ Spring相关的AutoConfiguration

目前Binder支持在Header中设置相关的key来进行RocketMQ Message消息的特性设置。

比如:TAGS、DELAY、TRANSACTIONAL_ARG、KEYS、WAIT_STORE_MSG_OK、FLAG。表示RocketMQ消息对应的标签。

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);

MessageSource支持

SCS RocketMQ Binder支持MessageSource,可以进行消息的拉取。

SCS(顺序控制系统)

按照规定的顺序依次完成各种操作的控制系统。顺序控制是一种按时间顺序或逻辑顺序进行控制的开环控制方式,其特点是按照预先规定的顺序进行检查、判断、控制的过程。

@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();
    }

}

配置选项

(1)RocketMQ Binder

前缀:spring.cloud.stream.rocketmq.binder

配置项默认值描述
name-server127.0.0.1:9876RocketMQ NameServer地址(老版本使用namesrv-addr配置项)
access-keynull阿里云账号AccessKey
secret-keynull阿里云账号SecretKey
enable-msg-tracetrue是否为Producer和Consumer开启消息轨迹功能
customized-trace-topicRMQ_SYS_TRACE_TOPIC消息轨迹开启后存储的topic名称

(2)RocketMQ Consumer(消费者)

下面配置以“spring.cloud.stream.rocketmq.bindings.<channelName>.consumer.”为前缀的RocketMQ Consumer相关的配置。

配置项默认值描述
enabletrue是否启用Consumer
tagsemptyConsumer基于TAGS订阅,多个tag以||分割
sqlemptyConsumer基于SQL订阅
broadcastingfalseConsumer是否是广播消费模式。如果想让所有的订阅者都能接收到消息,可以使用广播模式
orderlyfalseConsumer是否同步消费消息模式
delayLevelWhenNextConsume0异步消费消息模式下消费失败重试策略:
①-1:不重复,直接放入死信队列
②0:broker控制重试策略
③>0:client控制重试策略
suspendCurrentQueueTimeMillis1000同步消费消息模式下消费失败后再次消费的时间间隔

(3)RocketMQ Provider(生产者)

下面配置以“spring.cloud.stream.rocketmq.bindings.<channelName>.producer.”为前缀的RocketMQ Producer相关的配置。

配置项默认值描述
enabletrue是否启用Producer
groupemptyProducer分组名称
maxMessageSize8249344消息发送的最大字节数
transactionalfalse是否发送事务消息
syncfalse是否使用同步得方式发送消息
vipChannelEnabledtrue是否在Vip Channel上发送消息
sendMessageTimeout3000发送消息的超时时间(毫秒)
compressMessageBodyThreshold4096消息体压缩阀值(当消息体超过4k的时候会被压缩)
retryTimesWhenSendFailed2在同步发送消息的模式下,消息发送失败的重试次数
retryTimesWhenSendAsyncFailed2在异步发送消息的模式下,消息发送失败的重试次数
retryNextServerfalse消息发送失败的情况下是否重试其它的broker
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未禾

您的支持是我最宝贵的财富!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值