Spring Cloud 阿里RocketMQ Binder

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使用KafkaMessageChannelBinderRabbitMQ使用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.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 Alibaba RocketMQ Binder 工作原理

这是Spring Cloud Stream RocketMQ Binder的实现架构:

Spring Cloud 阿里RocketMQ Binder_第1张图片

图 5. SCS RocketMQ 绑定器

RocketMQ Binder 的实现依赖于RocketMQ-Spring框架。

RocketMQ Spring 框架是 RocketMQ 和 Spring Boot 的集成。它提供了三个主要功能:

  1. RocketMQTemplate:发送消息,包括同步消息、异步消息和事务消息。
  2. @RocketMQTransactionListener:收听并检查交易消息。
  3. @RocketMQMessageListener: 消费消息。

RocketMQMessageChannelBinder是一个标准的实施粘结剂,将建立RocketMQInboundChannelAdapterRocketMQMessageHandler内部。

RocketMQMessageHandlerRocketMQTemplate根据 Binding 配置进行构建。RocketMQTemplate内部将module的org.springframework.messaging.Message消息类转换为spring-messagingRocketMQ消息类org.apache.rocketmq.common .message.Message,然后发送出去。

RocketMQInboundChannelAdapter也会RocketMQListenerBindingContainer根据 Binding 配置进行构造,并RocketMQListenerBindingContainer启动 RocketMQConsumer接收消息。

目前 Binder 支持设置相关的 key inHeader来设置 RocketMQ 消息的属性。

例如 , , , , ,TAGS表示DELAYRocketMQTRANSACTIONAL_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..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..producer..

  • enable

    启用生产者绑定。默认值:true

  • group

    生产者组名称。默认值:空。

  • maxMessageSize

    允许的最大消息大小(以字节为单位)。默认值:8249344

  • transactional

    发送事务消息。默认值:false

  • sync

    以同步方式发送消息。默认值:false

  • vipChannelEnabled

    使用vip频道发送消息。默认值:true

  • sendMessageTimeout

    发送消息超时的毫秒数。默认值:3000

  • compressMessageBodyThreshold

    压缩消息体阈值,即默认压缩大于4k的消息体。默认值:4096

  • retryTimesWhenSendFailed

    在同步模式下声明发送失败之前内部执行的最大重试次数。默认值:2

  • retryTimesWhenSendAsyncFailed

    在异步模式下声明发送失败之前内部执行的最大重试次数。默认值:2

  • retryNextServer

    指示是否在内部发送失败时重试另一个代理。默认值:false

你可能感兴趣的:(spring,cloud,spring,cloud,java,后端)