3、Spring Cloud Stream + RocketMQ 高级消息特性完全指南

SpringCloud Stream 4.x 使用教程 阅读详情

📜 Spring Cloud Stream + RocketMQ 高级消息特性完全指南

支持事务消息、顺序消息、定时/延时消息
基于 Spring Cloud Stream 4.x + Spring Boot 3.x + RocketMQ Binder
100% 函数式编程模型 | 无 @StreamListener


一、核心前提:Spring Cloud Stream 的定位

✅ Spring Cloud Stream 的职责:

职责说明
✅ 统一抽象提供 Supplier、Function、Consumer 接口,屏蔽 Kafka/RabbitMQ/RocketMQ 等差异
✅ 自动绑定自动创建 Topic/Queue、配置消费者组、序列化、反序列化
✅ 集成监控集成 Actuator、Micrometer、日志、错误处理
✅ 弹性机制自动重试、DLQ、并发控制、分区感知

❌ Spring Cloud Stream 不负责:

不负责说明
❌ 消息协议细节如事务消息的两阶段提交、顺序消息的队列绑定、延时消息的 TimeWheel 实现
❌ Broker 特有功能RocketMQ 的 MessageQueue、Tag、DelayLevel、TransactionListener 等底层概念
❌ 事务协调器事务消息需要 RocketMQ Broker + 客户端本地事务状态回查机制

✅ 结论:
Spring Cloud Stream 是“消息通道的抽象层”,而 RocketMQ Binder 是“该抽象层与 RocketMQ 协议的适配器”。
高级特性(事务、顺序、延时)由 RocketMQ Binder 实现,但需你显式配置或使用扩展 API。


二、RocketMQ Binder 的能力边界(官方支持情况)

特性Spring Cloud Stream 是否原生支持?说明
✅ 普通消息✔️ 完全支持使用 Supplier / StreamBridge 发送,自动序列化
✅ 顺序消息⚠️ 部分支持需手动指定 MessageQueueSelector,需自定义 Message Header
✅ 延时/定时消息⚠️ 部分支持需通过 RocketMQMessageHeaders 设置 DELAY_TIME_LEVEL
✅ 事务消息❌ 不直接支持Spring Cloud Stream 无内置事务管理器,需结合 @Transactional + RocketMQTemplate 手动实现
✅ 批量消息✔️ 支持(通过 StreamBridge 批量发送)可循环调用 send(),或使用 List<Message>
✅ 消息过滤(Tag)✔️ 支持通过 RocketMQMessageHeaders.TAGS 设置
✅ 消息 Key✔️ 支持通过 RocketMQMessageHeaders.KEYS 设置
✅ 消息 ID / Trace✔️ 自动注入RocketMQ Binder 自动设置 MessageId、BornHost、StoreHost

🔍 重要:RocketMQ Binder 的实现基于 spring-cloud-starter-stream-rocketmq,其底层封装了 Apache RocketMQ Client(DefaultMQProducer),但不暴露所有高级 API。


三、如何实现 RocketMQ 高级消息类型?—— 实战方案

我们将使用以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
    <version>4.1.0</version> <!-- 适配 Spring Boot 3.x -->
</dependency>

💡 注意:spring-cloud-starter-stream-rocketmq 从 4.0+ 开始支持 RocketMQ 5.x,推荐使用 RocketMQ 5.1+。


✅ 场景一:发送普通消息(基础,已掌握)

1. 定义 POJO

// Order.java
package com.example.rocketmq.model;

import lombok.Data;

@Data
public class Order {
    private String orderId;
    private String productName;
    private Long price;
}

2. 使用 StreamBridge 手动发送

@RestController
public class OrderController {

    @Autowired
    private StreamBridge streamBridge;

    @PostMapping("/order")
    public ResponseEntity<String> createOrder(@RequestBody Order order) {
        boolean sent = streamBridge.send("orders-out-0", order);
        return ResponseEntity.ok(sent ? "订单已发送" : "发送失败");
    }
}

3. 配置绑定

spring:
  cloud:
    stream:
      bindings:
        orders-out-0:
          destination: orders-topic
          content-type: application/json
      rocketmq:
        binder:
          name-server: 127.0.0.1:9876
          producer:
            group: order-producer-group

✅ 此为标准普通消息,RocketMQ Binder 自动处理。


✅ 场景二:发送延时消息 / 定时消息(RocketMQ 特有)

🚀 RocketMQ 延时消息机制:

  • RocketMQ 支持 18 个延时等级(默认):1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
  • 通过设置 DELAY_TIME_LEVEL 头部实现,不是时间戳!

✅ 实现方式:使用 RocketMQMessageHeaders

import org.springframework.cloud.stream.binder.rocketmq.headers.RocketMQMessageHeaders;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;

@PostMapping("/order-delay")
public ResponseEntity<String> createDelayedOrder(@RequestBody Order order) {
    // 设置延时等级:30秒(对应第4级,从1开始)
    Map<String, Object> headers = Map.of(
        RocketMQMessageHeaders.DELAY_TIME_LEVEL, 4  // 30秒
    );

    Message<Order> message = MessageBuilder
        .withPayload(order)
        .copyHeaders(headers)
        .build();

    boolean sent = streamBridge.send("orders-out-0", message);

    return ResponseEntity.ok("订单已发送,延时30秒消费");
}

✅ 配置文件(无需额外配置)

spring:
  cloud:
    stream:
      bindings:
        orders-out-0:
          destination: orders-topic
          content-type: application/json
      rocketmq:
        binder:
          name-server: 127.0.0.1:9876
          producer:
            group: order-producer-group

✅ 消费端验证(普通 Consumer)

@Bean
public Consumer<Order> orderConsumer() {
    return order -> {
        System.out.println("✅ 收到延时订单: " + order);
        // 30秒后才打印,证明延时生效
    };
}

✅ 关键点:

  • 延时等级是 预设值,不能自定义毫秒数(如 12345ms)。
  • 若设置无效等级(如 20),RocketMQ 会忽略,转为普通消息。
  • 推荐使用常量封装:
public class RocketMQDelayLevels {
    public static final int LEVEL_1S = 1;
    public static final int LEVEL_5S = 2;
    public static final int LEVEL_10S = 3;
    public static final int LEVEL_30S = 4;
    public static final int LEVEL_1M = 5;
    public static final int LEVEL_2M = 6;
    public static final int LEVEL_3M = 7;
    public static final int LEVEL_10M = 15;
    public static final int LEVEL_1H = 17;
}

✅ 场景三:发送顺序消息(Message Ordering)

🚀 RocketMQ 顺序消息原理:

  • 同一个 MessageQueue 内的消息按顺序消费。
  • 通过 MessageQueueSelector 将消息路由到固定队列。
  • 必须指定 ShardingKey(如订单ID),确保同一订单的所有消息发往同一队列。

✅ 实现方式:自定义 Message Header + StreamBridge

RocketMQ Binder 不直接提供 MessageQueueSelector 接口,但可通过 自定义 Header + Binder 扩展 实现。

✅ 步骤 1:使用 RocketMQMessageHeaders.SHARDING_KEY
@PostMapping("/order-ordered")
public ResponseEntity<String> createOrderedOrder(@RequestBody Order order) {
    // ✅ 关键:设置 sharding key,确保同一订单的所有消息发往同一队列
    Map<String, Object> headers = Map.of(
        RocketMQMessageHeaders.SHARDING_KEY, order.orderId() // 用 orderId 作为分区键
    );

    Message<Order> message = MessageBuilder
        .withPayload(order)
        .copyHeaders(headers)
        .build();

    boolean sent = streamBridge.send("orders-out-0", message);

    return ResponseEntity.ok("顺序订单已发送,订单ID: " + order.orderId());
}
✅ 步骤 2:验证顺序性(消费者端)
@Bean
public Consumer<Order> orderConsumer() {
    return order -> {
        // 模拟耗时处理,观察是否乱序
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        System.out.println("✅ 消费顺序订单: " + order.orderId() + " @ " + LocalDateTime.now());
    };
}
✅ 步骤 3:测试
  • 同时发送 5 个订单:ORD-1, ORD-2, ORD-1, ORD-1, ORD-2
  • 你会看到:
    ✅ 消费顺序订单: ORD-1 @ 10:00:01
    ✅ 消费顺序订单: ORD-1 @ 10:00:02
    ✅ 消费顺序订单: ORD-1 @ 10:00:03
    ✅ 消费顺序订单: ORD-2 @ 10:00:04
    ✅ 消费顺序订单: ORD-2 @ 10:00:05
    

✅ 同一订单的多条消息按发送顺序被消费,不同订单之间可并行 —— 实现了分区顺序性。

⚠️ 注意:

  • RocketMQ 顺序消息仅保证单个 MessageQueue 内有序,不是全局有序。
  • SHARDING_KEY 必须是业务主键(如订单ID、用户ID、账户ID)。
  • 如果你用 UUID 作为 SHARDING_KEY,则每条消息都发往不同队列 → 无顺序!

✅ 场景四:发送事务消息(最复杂,需手动实现)

❗ Spring Cloud Stream 不原生支持事务消息!

RocketMQ 事务消息依赖:

  1. TransactionListener 接口(实现本地事务执行与状态回查)
  2. DefaultMQProducer 的 sendMessageInTransaction() 方法
  3. 本地事务状态(COMMIT / ROLLBACK)
  4. Broker 回查机制

而 Spring Cloud Stream 的 StreamBridge 和 Supplier 都基于 DefaultMQProducer.send(),无法调用事务发送 API。

✅ 解决方案:混合使用 RocketMQ 原生 API

✅ 最佳实践:在 Spring Boot 事务中,用原生 RocketMQ Client 发送事务消息,用 Stream 处理消费

架构设计:

[REST API] → [Service 层] → [事务内调用 RocketMQTemplate] → 发送事务消息
                            ↓
                        [RocketMQ Broker]
                            ↓
                [Stream Consumer] → 处理消息 → 更新库存/积分

✅ 步骤 1:添加 RocketMQ 原生依赖

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.3.0</version> <!-- 适配 RocketMQ 5.x -->
</dependency>

✅ 步骤 2:配置 RocketMQ Producer(application.yml)

rocketmq:
  name-server: 127.0.0.1:9876
  producer:
    group: order-trans-producer-group
    send-message-timeout: 3000

✅ 步骤 3:实现事务消息发送服务

@Service
public class OrderTransactionService {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    @Autowired
    private OrderService orderService; // 你的本地业务服务

    @Transactional
    public void createOrderWithTransaction(Order order) {
        // 1️⃣ 先保存订单到数据库(本地事务)
        orderService.save(order); // ✅ 本地事务

        // 2️⃣ 发送事务消息(RocketMQ 事务消息)
        String topic = "orders-topic";
        String tags = "create";

        SendResult sendResult = rocketMQTemplate.sendMessageInTransaction(
            topic + ":" + tags,
            MessageBuilder.withPayload(order).build(),
            order // 传入业务参数(用于回查时获取订单)
        );

        if (SendResult.Status.SEND_OK == sendResult.getSendStatus()) {
            System.out.println("✅ 事务消息已发送,等待回查");
        } else {
            throw new RuntimeException("事务消息发送失败");
        }
    }
}

✅ 步骤 4:实现 TransactionListener(核心!)

@Component
@RocketMQTransactionListener(
    txProducerGroup = "order-trans-producer-group", // 必须与 producer.group 一致
    consumerGroup = "order-trans-consumer-group"     // 消费组用于回查
)
public class OrderTransactionListener implements RocketMQLocalTransactionListener {

    @Autowired
    private OrderService orderService;

    // ✅ 执行本地事务(在发送消息后调用)
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        Order order = (Order) msg.getPayload();

        // ✅ 业务逻辑:检查是否成功写入数据库
        // 注意:此时数据库事务已提交,但 RocketMQ 还未确认
        boolean success = orderService.exists(order.orderId());

        if (success) {
            System.out.println("✅ 本地事务成功,提交消息");
            return RocketMQLocalTransactionState.COMMIT;
        } else {
            System.out.println("❌ 本地事务失败,回滚消息");
            return RocketMQLocalTransactionState.ROLLBACK;
        }
    }

    // ✅ Broker 回查本地事务状态(定时调用)
    @Override
    public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
        Order order = (Order) msg.getPayload();
        boolean exists = orderService.exists(order.orderId());

        if (exists) {
            System.out.println("🔍 回查订单: " + order.orderId() + " → 提交");
            return RocketMQLocalTransactionState.COMMIT;
        } else {
            System.out.println("🔍 回查订单: " + order.orderId() + " → 回滚");
            return RocketMQLocalTransactionState.ROLLBACK;
        }
    }
}

✅ 步骤 5:Controller 调用

@RestController
public class OrderController {

    @Autowired
    private OrderTransactionService orderTransactionService;

    @PostMapping("/order/transaction")
    public ResponseEntity<String> createOrder(@RequestBody Order order) {
        try {
            orderTransactionService.createOrderWithTransaction(order);
            return ResponseEntity.ok("事务订单创建中...");
        } catch (Exception e) {
            return ResponseEntity.status(500).body("创建失败: " + e.getMessage());
        }
    }
}

✅ 步骤 6:消费端(仍用 Stream,与事务无关)

@Bean
public Consumer<Order> orderConsumer() {
    return order -> {
        System.out.println("✅ 消费事务消息: " + order);
        // 更新库存、积分、通知等
    };
}

✅ 关键架构图:

[REST] → [Service] → [save DB] → [sendTransactionMsg] → [Broker]
                                     ↓
                        [TransactionListener.execute] → COMMIT/ROLLBACK
                                     ↓
                      [Broker 定时回查 checkLocalTransaction]
                                     ↓
                          [Broker 发送消息到 Topic]
                                     ↓
                        [Stream Consumer] → 处理业务

✅ 优点:

  • 事务一致性由 RocketMQ 保证
  • 消费端仍使用统一的 Stream 函数式模型,不耦合
  • 业务代码清晰,事务边界明确

❌ 缺点:

  • 需引入 rocketmq-spring-boot-starter
  • 代码分散(事务发送在 Service,消费在 Stream)
  • 需要理解 RocketMQ 事务机制

✅ 场景五:发送带 Tag 的消息(消息过滤)

RocketMQ 支持通过 Tag 过滤消息(Consumer 可只订阅特定 Tag)。

@PostMapping("/order-with-tag")
public ResponseEntity<String> createOrderWithTag(@RequestBody Order order) {
    Map<String, Object> headers = Map.of(
        RocketMQMessageHeaders.TAGS, "create"  // 消息标签
    );

    Message<Order> message = MessageBuilder
        .withPayload(order)
        .copyHeaders(headers)
        .build();

    streamBridge.send("orders-out-0", message);
    return ResponseEntity.ok("已发送,Tag=create");
}

消费端只消费特定 Tag 的消息:

spring:
  cloud:
    stream:
      bindings:
        orderConsumer-in-0:
          destination: orders-topic
          group: order-consumer-group
          consumer:
            # ✅ RocketMQ 特有:只消费指定 Tag 的消息
            tags: create

✅ 注意:tags 是 RocketMQ Binder 的扩展属性,不是标准 Stream 属性。


四、RocketMQ Binder 扩展属性速查表(Header / 配置)

功能Header 名类型说明
延时等级RocketMQMessageHeaders.DELAY_TIME_LEVELInteger1~18,对应延时等级
顺序键RocketMQMessageHeaders.SHARDING_KEYString用于路由到固定 MessageQueue
消息标签RocketMQMessageHeaders.TAGSString消息过滤标签
消息 KeyRocketMQMessageHeaders.KEYSString查询消息用,可多个用 # 分隔
消息优先级RocketMQMessageHeaders.PRIORITYInteger0~9,数字越大优先级越高
消息延迟RocketMQMessageHeaders.DELAY_SECONDSLong❌ 无效!RocketMQ 不支持秒级延时,只支持等级
消息体类型MessageHeaders.CONTENT_TYPEStringapplication/json

✅ 在配置中使用 consumer.tags 控制消费端过滤。


五、完整配置示例(application.yml)

spring:
  cloud:
    stream:
      bindings:
        orders-out-0:
          destination: orders-topic
          content-type: application/json
        orderConsumer-in-0:
          destination: orders-topic
          group: order-consumer-group
          consumer:
            tags: create  # 只消费 Tag=create 的消息

      rocketmq:
        binder:
          name-server: 127.0.0.1:9876
          producer:
            group: order-producer-group
            send-message-timeout: 5000
            retry-times-when-send-failed: 2
          consumer:
            group: order-consumer-group
            consume-message-batch-max-size: 10
            pull-batch-size: 32
            pull-timeout-millis: 10000

# RocketMQ 原生配置(用于事务消息)
rocketmq:
  name-server: 127.0.0.1:9876
  producer:
    group: order-trans-producer-group
    send-message-timeout: 3000

六、总结:Spring Cloud Stream + RocketMQ 高级消息能力全景图

特性是否支持实现方式推荐度
✅ 普通消息✔️ 原生StreamBridge.send()⭐⭐⭐⭐⭐
✅ 延时消息✔️ 支持RocketMQMessageHeaders.DELAY_TIME_LEVEL⭐⭐⭐⭐☆
✅ 顺序消息✔️ 支持RocketMQMessageHeaders.SHARDING_KEY⭐⭐⭐⭐☆
✅ 事务消息❌ 不原生混合使用 RocketMQTemplate + TransactionListener⭐⭐⭐☆☆(复杂但必须)
✅ 消息 Tag 过滤✔️ 支持RocketMQMessageHeaders.TAGS + consumer.tags⭐⭐⭐⭐⭐
✅ 消息 Key✔️ 支持RocketMQMessageHeaders.KEYS⭐⭐⭐⭐☆
✅ 批量发送✔️ 支持循环调用 send()⭐⭐⭐⭐☆
✅ 消费者并发✔️ 支持consumer.concurrency⭐⭐⭐⭐⭐

七、最佳实践与建议

建议说明
✅ 事务消息优先使用 rocketmq-spring-boot-starter + TransactionListener,不要试图用 Stream 实现
✅ 顺序消息用 SHARDING_KEY,必须用业务主键(订单ID、用户ID)
✅ 延时消息用 DELAY_TIME_LEVEL,避免用 ScheduledExecutorService 模拟
✅ 消息过滤用 TAGS,比 SQL 过滤更高效
✅ 监控启用 Actuator,查看 stream.inbound.*.messages、rocketmq.producer.send.latency
✅ 测试用 spring-cloud-stream-test-support + TestChannelBinder 测试普通消息,事务消息需集成测试
✅ 生产建议事务消息只用于强一致性核心场景(如支付、库存),普通消息用 Stream 即可

八、推荐项目结构

src/main/java/com/example/rocketmq/
├── OrderServiceApplication.java
├── config/
│   └── RocketMQConfig.java
├── model/
│   ├── Order.java
├── controller/
│   ├── OrderController.java         # 普通/延时/顺序消息
│   └── OrderTransactionController.java # 事务消息入口
├── service/
│   ├── OrderService.java
│   └── OrderTransactionService.java # 事务消息发送
├── listener/
│   └── OrderTransactionListener.java # 事务回查
├── binding/
│   └── OrderBindings.java           # 可选:函数式绑定
└── RocketMQDelayLevels.java         # 常量类

九、官方资源

资源链接
Spring Cloud Stream RocketMQ Binderhttps://github.com/spring-cloud/spring-cloud-stream-binder-rocketmq
RocketMQ 官方文档(事务消息)https://rocketmq.apache.org/docs/transaction-message/
RocketMQ 延时消息说明https://rocketmq.apache.org/docs/4.9.4/02example/06delay-message/
Spring Boot + RocketMQ Starterhttps://github.com/apache/rocketmq-spring

✅ 最终结论

Spring Cloud Stream 是“消息通道的抽象”,不是“消息协议的完整实现”。
RocketMQ 的高级特性(事务、顺序、延时)由其原生客户端提供,Spring Cloud Stream Binder 仅提供“透传 Header”的能力。
你应:

  • ✅ 用 StreamBridge 发送普通/延时/顺序消息
  • ✅ 用 RocketMQTemplate + TransactionListener 实现事务消息
  • ✅ 用 Stream 统一消费所有消息,保持架构一致性
【微服务学习】spring-cloud-starter-stream 4.x 版本的使用(rocketmq 版) spring cloud stream 4.x 阅读详情

相关推荐

RocketMQ 与 Spring Cloud Stream整合(顺序消息)

RocketMQ 提供了两种顺序级别: 普通顺序消息:Producer 将相关联的消息发送到相同的消息队列。 完全严格顺序:在【普通顺序消息】的基础上,Consumer 严格顺序消费。 官方文档是这么描述的: 消息有序,指的是一类消息消费时,能按照发送的顺序来消费。例如:一个订单产生了三条消息分别是订单创建、订单付款、订单完成。消费时要按照这个顺序消费才能有意义,但是同时订单之间是可以并行消费的。RocketMQ 可以严格的保证消息有序。 顺序消息分为全局顺序消息与分区顺序消息,全局顺序是指某个

BUG指挥课堂 4080

SpringCloud之Stream消息驱动RocketMQ讲解

是一个用来为微服务应用构建消息驱动能力的框架。它可以基于来创建独立的、可用于生产的Spring应用程序。为一些供应商的消息中间件产品提供了个性化的自动化配置实现,并引入了发布-订阅、消费组、分区这三个核心概念。简单的说,本质上就是整合了和,实现了一套轻量级的消息驱动的微服务框架。/*** 这两个通道可能定义在两个不同的通道里面,这里为了方便放在同一个项目中演示*/ // 收(订阅频道/消息消费者) @Input(INPUT) SubscribableChannel input();

上善若泪 4953

Spring Cloud Stream应用与自定义RocketMQ Binder:编程模型

前言: 本文作者张天,节选自笔者与其合著的《Spring Cloud微服务架构进阶》,即将在八月出版问世。本文将其中Spring Cloud Stream应用与自定义Rocketmq Binder的内容抽取出来,主要介绍Spring Cloud Stream的相关概念,并概述相关的编程模型。 概述 Spring Cloud Stream 简介 Spring Cloud Stream 是一...

aoho求索 2725

RocketMQ & Spring Cloud Stream

一、RocketMQ简介 1. 概述 消息队列作为高并发系统的核心组件之一,能够帮助业务系统解构提升开发效率和系统稳定性。主要具有以下优势: 削峰填谷: 主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题 系统解耦: 解决不同重要程度、不同能力级别系统之间依赖导致一死全死 提升性能: 当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统 蓄流压测: 线上有些链路不好压测,可以通过堆积一定量消息再放开来压测 2. RocketMQ Apache Alibaba RocketMQ

banmingi的博客 2867

Spring Cloud Stream应用与自定义RocketMQ原理解析

概述Spring Cloud Stream 简介Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。它可以基于Spring Boot 来创建独立的,可用于生产的Spring 应用程序。他通过使用Spring Integration来连接消息代理中间件以实现消息事件驱动。Spring Cloud Stream 为一些供应商的消息中间件产品提供了个性化的自动化配置实现...

qq_41534566的博客 4119

Alibaba Spring Cloud 二十三 RocketMQ 死信队列

触发条件当消费者多次(默认为 16 次)消费某条消息都返回或抛出异常,Broker 便会将该消息放入死信队列中,以防止这条消息一直阻塞在重试队列里。队列命名。例如,消费者组名为,则该组对应的死信队列 Topic 就是。特性进入死信队列的消息不会被再次自动投递,需要运维或开发者手动处理(例如在控制台查看并人工干预,或编写代码对进行消费、补偿等)。常见处理方式补偿:手动拉取死信消息,分析原因并尝试修复,再将消息重新投递或写到新 Topic 进行二次消费。记录/报警。

空 1580

【实战】Spring Cloud Stream3.0 整合RocketMq

使用Spring Cloud Stream来进行整合RocketMq。如果我们有在一个项目中需要引入多个MQ的需求,用Spring Cloud Stream简直不要太好。当然,我们是直接使用Spring Cloud Stream3.0,不再像之前低版本那样需要引入通道类进行指定,3.0版本可用直接字配置文件进行粘接绑定信道。

勤于笔记,成于点滴。 3575

Alibaba Spring Cloud 二十 RocketMQ顺序消息

适用场景对同一业务实体下的操作存在严格的先后顺序要求(例如订单创建 -> 支付 -> 发货 -> 收货)。消费量不是极其巨大,或者可以通过合理规划 Queue 数量来获得平衡的并发度。总结RocketMQ 顺序消息通过“同一业务键路由到同一个 Queue顺序消费 (MessageListenerOrderly)”来实现分区级别的消息有序。在实际应用中,需要根据吞吐量顺序性要求消费并行度等因素进行权衡。典型做法是以订单ID用户ID商品ID。

空 967

芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门

RocketMQ是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。能够保证严格的消息顺序提供丰富的消息拉取模式高效的订阅者水平扩展能力实时的消息订阅机制亿级消息堆积能力。

shaozheng0503的博客 1447

Spring Cloud Stream整合RocketMQ

Spring Cloud Stream是一个框架,用于构建与共享消息系统连接的高度可扩展的事件驱动微服务。该框架提供了一个灵活的编程模型,该模型基于已经建立和熟悉的Spring习惯用法和最佳实践,包括对持久pub/sub语义、消费者组和有状态分区的支持。:负责提供与外部消息传递系统集成的组件。:外部消息系统和最终用户提供的应用程序代码(生产者/消费者)之间的桥梁。Message:生产者和消费者用来与目标绑定器(以及通过外部消息系统的其他应用程序)进行通信的规范数据结构。

冲出仁川,走出马德里,故事还会再继续 2936

Spring Cloud(11)——基于RocketMQ的Stream实现

基于RocketMQ的Stream实现 Spring Cloud Stream是一个消息收发的框架,它提供了一套标准,应用程序只需要按照它的标准进行消息的收发,而不用关注具体的实现机制。具体的实现可以基于不同的消息中间件进行不同的实现,比如Kafka的实现、RabbitMQ的实现、RocketMQ的实现等。官方已经提供了Kafka和RabbitMQ的实现,RocketMQ的实现由Alibaba负责...

Elim的博客 1万+

Spring Cloud Stream之rocketmq

文档网址:参考:Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。它可以基于 Spring Boot 来创建独立的、可用于生产的 Spring 应用程序。Spring Cloud Stream 为一些供应商的消息中间件产品提供了个性化的自动化配置实现,并引入了发布-订阅、消费组、分区这三个核心概念。简单的说,Spring Cloud Stream本质上就是整合了Spring Boot和Spring Integration,实现了一套轻量级的消息驱动的微服务框架。

u011353623的博客 2417

一张微服务地图的十年演进:Spring Cloud 核心、扩展与工具组件的定位、原理与选型

本文把 Spring Cloud 当作一张微服务地图来读:先说明它是由 Commons 抽象层、实现层和 Boot 装配层构成的发行版,再沿一次请求梳理注册发现、负载均衡、声明式调用、容错限流、网关、配置、追踪与总线七类核心组件的原理与换代,并扩展到云平台、服务网格、消息流、批处理、安全与周边生态。仿真实测:默认参数下实例宕机平均 242 秒才被感知,优雅下线降到 47 秒;一个慢实例让轮询的 P99 达 49 秒,P2C 仅 203 毫秒。最后给出退场替代表、技术栈组合、升级路线和决策树。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 169万+

Spring Cloud Stream + RocketMq实现事务性消息

本文先介绍原理,再编码实践,通过Spring Cloud Stream框架,结合使用rocketmq来实现事务性消息。

简单,坚持 4235

小土堆学习笔记1:Dataset类代码实践

上一页中反复提到“类”,这究竟是什么东西?按我的理解(肯定不准确也不正式),class类就是某一个东西的共性,而且是等待被确认的共性。比如每台手机都有它自己的品牌、框架、价格等等属性,class类正是这些尚不确定的属性;而一旦确认了这些属性,就能够确认这到底是一台什么型号什么状态的手机,在确认了全部属性后就知道,这是一台Apple 16 Pro Max。抽象的不确定的共性就是类,具体的确定的个性就是示例。这个共性可以被用于多个编程目的,只不过某一个具体的编程行为还有它自己的独特性。

qq_40525602的博客 1625

从宏观到街道:如何利用七普数据为WorldPop人口栅格做“本地化”校准?

本文探讨了如何利用第七次全国人口普查(七普)数据对WorldPop人口栅格进行本地化校准,以提高街道级别的人口分布精度。通过分析数据偏差、选择适当的技术路线和工具(如Arcgis和栅格计算器),文章详细介绍了从宏观到街道的校准实践,帮助规划公共卫生资源和优化城市基础设施。

janckywong963的专栏 510

Spring Cloud Stream 入门与 RocketMQ 集成实践

是 Spring Cloud 生态系统中的一个子项目,专注于为构建基于消息驱动的微服务提供统一的编程模型。它通过抽象底层的消息中间件(如 Kafka、RabbitMQ、RocketMQ 等),帮助开发者更轻松地使用这些中间件,并专注于业务逻辑的实现,而不必担心具体的底层实现细节。通过 Spring Cloud Stream 与 RocketMQ 的集成,开发者可以简化消息驱动微服务的开发流程。

islautao的博客 1312

samba源码编译安装(版本4.13.0)

这里写目录标题前言编译安装samba下载三个包安装依赖共需要安装samba、gnutls、nettle1、进入解压后的samba目录执行:2、进入解压后的gnutls目录执行3、进入解压后的nettle目录执行3.1 卸载已存在nettle3.2 编译3.3 make3.4 安装4、进入gnutls继续编译4.1 编译4.2 make4.3 安装5、再次进入解压后的samba目录5.1 执行./configure5.2 make5.3 samba安装启动samba 前言 一般来说,安装samba最快的方式应

灵葱的博客 1万+

Spring cloud stream 其他特性总结使用

背景 上一篇博文Spring cloud Stream 入门讲述了spring cloud stream 的背景,组成,以及基于rocketMq 搭建简单的demo 。完成消息的发送和消费。但是在实际工作过程中,我们要用到的远远不局限于简单的demo . 比如自定义接口、事务消息、消息的筛选,异常处理,消息的分区等;下面一一来列举出这些基于spring cloud stream 该如何实现呢? 自定义接口 在上一篇博文demo中,我们发送消息使用的是Source.class 中的output 方法.

qq_34125349的博客 496

自举电容的工作原理-3句话总结

1、一道面试题 照例,先抛出来一道面试题:“Buck电路的SW引脚通常会放置一颗小电容,这颗电容有什么用?”。这个问题问得比较细,非常考验被面试者的硬件基本功。 2、似懂非懂的答案 有小伙伴可能不太清楚这颗电容的作用,回答不上来。也有小伙伴脱口而出:自举电容,用来做升压的。但后面好像说不出来具体逻辑。 没具体了解过,答不上来,也没啥可惜的。但是了解过一点,但又似懂非懂的这种,给出的答案只是轻轻点水或者千篇一律,那无疑是错过了一个加分项。 3、异步Buck的自举环路组成 既然是针对Buck电路讲自举电容,前面

ltqdxl的博客 3万+

【KingSCADA】如何建立硬件系统及相关变量

本篇主要讲解如何定义设备,如何定义变量。KingSCADA3.8的采集系统是指负责和现场设备进行通讯,并采集现场数据和控制现场数据的模块,称之为采集器,也叫IOServer应用,它是一组独立的应用程序,可以脱离KingSCADA3.8软件,它依赖于KingSCADA3.8驱动产品,通过驱动与IO设备进行通讯。采集系统由通讯链路,设备,数据块组成。链路:链路是指计算机通过什么方式(接口)与设备进行连接,链路类别:串口,以太网,GPRS,Modem,通信卡,采集卡,无链路。

做有价值的事,积累有价值的笔记! 1万+

Spring Cloud Stream应用RocketMQ

Spring Cloud Stream应用RocketMQ 文章目录Spring Cloud Stream应用RocketMQSpring Cloud Stream?Spring Cloud Stream 重要概念:Spring Cloud Stream与RocketMQ应用:Spring Cloud Alibaba RocketMQ Binder 实现MessageSource 支持配置选项RocketMQ Binder PropertiesRocketMQ Consumer PropertiesRock

liuerchong的博客 4951

UE5实现物体高亮描边效果(含UE相关源码浅析)

UE5实现物体高亮描边效果

专注GIS开发 7334

Spring Cloud Stream与RocketMQ深度整合:构建异步化微服务架构

在新的函数式编程模型下,我们通过定义Supplier和Function来实现消息的发送和接收。@Beanlog.info("收到订单消息:订单号={}, 状态={}, 类型={}",// 具体的业务处理逻辑// 订单处理实现。

zuiyuelong的博客 1123

【电容/电感】电路板会“滋滋”的响,我们称它为啸叫

一、啸叫的起源 大部分硬件工程师应该都遇到过,PCBA上电后出现“滋滋滋”的叫声,其声响或大或小,或时有时无,或深沉或刺耳,或变化无常者皆有。该现象我们称为“啸叫”,一般分为电感啸叫和电容啸叫。

云轩阁 6万+

[Dify] 多步对话流程的实现技巧:构建连贯自然的多轮交互系统

摘要:本文探讨了AI系统中实现多轮对话的核心技术与应用方法。文章首先分析了多步对话的典型场景(如机票预订、财务报告生成)及其价值,提出了Dify平台实现该功能的三大机制:变量系统、条件控制和状态管理。随后详细介绍了顺序型、条件型和确认型三种基本对话模式,并通过"会议预约助手"案例展示了实际应用流程。文章还提供了提示词设计、变量引用等实用建议,并强调多轮对话成功的关键在于清晰的结构设计而非单纯依赖模型能力,最终实现自然流畅的人机交互体验。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1342
上一篇: 2、Spring Cloud Stream 函数式模型中 Supplier 是如何“主动推送”消息的?
下一篇: 4、Spring Cloud Stream 是对消息行为的抽象
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值