• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
isuning
博客园    首页    新随笔    联系   管理    订阅  订阅
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使用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的实现架构:

TB1v8rcbUY1gK0jSZFCXXcwqXXa 1236 773

图 5. SCS RocketMQ 绑定器

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

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

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

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

RocketMQMessageHandler将RocketMQTemplate根据 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.<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。

posted on 2022-05-01 22:17  吕布辕门  阅读(325)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3