从 0 到 1 落地 SpringBoot+RocketMQ:架构师亲授分布式通信最优解

2024/11/30 RocketMQ本机安装与SpringBoot整合 RocketMQ是由阿里捐赠给Apache的一款低延迟、高并发、高可用、高可靠的分布式消息中间件。经历 了淘宝双十一的洗礼。RocketMQ既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。官方文档:github中文主页: 阅读详情

在分布式系统架构设计中,消息队列是实现系统解耦、流量削峰、数据同步的核心组件。作为一名经手数十个分布式项目的架构师,我发现 RocketMQ 凭借其高吞吐、低延迟、高可用的特性,成为多数场景下的首选方案。本文将从架构设计视角,详解 SpringBoot 集成 RocketMQ 的最佳实践,涵盖架构选型、核心功能实现、性能优化及生产环境踩坑指南,帮你避开 90% 的集成陷阱。

一、架构选型:为什么 RocketMQ 是企业级首选?

消息队列选型时,我们通常对比 RocketMQ、Kafka 和 RabbitMQ 三款主流产品。从架构师视角看,RocketMQ 的优势体现在三个关键维度:

1. 企业级特性完备性

  • 事务消息:通过 "半消息 + 回查" 机制实现分布式事务最终一致性,这是 Kafka 需二次开发、RabbitMQ 插件支持不完善的核心差异点
  • 定时消息:支持任意精度延迟投递(如 3 秒 / 5 分钟),而 RabbitMQ 仅支持固定级别延迟,Kafka 需通过时间轮手动实现
  • 重试机制:内置消费失败重试策略,可设置重试次数和间隔,失败消息自动进入死信队列,大幅降低运维成本

2. 性能与可靠性的完美平衡

在 16 核 32G 服务器压测中,单节点 RocketMQ 的 TPS 可达 5 万 +,延迟 P99 控制在 10ms 以内,且支持两种复制模式:

  • 金融场景选同步复制,确保消息零丢失
  • 日志采集等非核心场景选异步复制,吞吐量提升 30%+

3. 与 Spring 生态无缝衔接

RocketMQ 提供完善的 SpringBoot Starter,支持注解驱动开发,配置简单且学习成本低。对比 Kafka 需要手动管理消费者组位移,RocketMQ 的封装更符合 Spring 开发者的使用习惯。

二、架构设计:SpringBoot 集成 RocketMQ 的分层模型

核心分层职责解析:

  1. 消息生产层:基于RocketMQTemplate封装消息发送逻辑,统一处理同步 / 异步 / 单向发送模式
  1. 消息消费层:通过@RocketMQMessageListener注解实现消费逻辑,支持负载均衡和广播两种模式
  1. 中间件层:RocketMQ 集群提供消息存储、路由发现和高可用保障
  1. 业务适配层:处理消息序列化、异常重试、幂等性保障等横切关注点

三、实战落地:SpringBoot 集成 RocketMQ 核心实现

1. 环境配置(避坑版)

pom.xml 依赖:

<dependency>
   
# 从0到1落地SpringBoot+RocketMQ:架构师亲授分布式通信最优解
在分布式系统架构设计中,消息队列是实现系统解耦、流量削峰、数据同步的核心组件。作为一名经手数十个分布式项目的架构师,我发现RocketMQ凭借其高吞吐、低延迟、高可用的特性,成为多数场景下的首选方案。本文将从架构设计视角,详解SpringBoot集成RocketMQ的最佳实践,涵盖架构选型、核心功能实现、性能优化和生产环境踩坑指南,帮你避开90%的集成陷阱。
## 一、架构选型:为什么RocketMQ是更优解?
消息队列选型时,我们通常会对比RocketMQ、Kafka和RabbitMQ三款主流产品。从架构设计维度看,RocketMQ的优势体现在三个关键层面:
### 1. 企业级特性完备性
- **事务消息**:通过"半消息+回查"机制原生支持分布式事务,无需像Kafka那样二次开发,也避免了RabbitMQ插件的兼容性问题
- **定时消息**:支持任意精度的延迟投递(如3秒/5分钟),而RabbitMQ仅支持固定级别的延迟(如10ms/10s),Kafka需通过时间轮手动实现
- **重试机制**:内置消费失败重试策略,可自定义重试次数和间隔,失败消息自动进入死信队列,大幅降低运维成本
### 2. 性能与可靠性的平衡艺术
在16核32G服务器的标准压测中:
- 单节点RocketMQ的TPS可达5万+,延迟P99稳定在10ms以内
- 支持同步/异步复制两种模式:
  - 金融场景选同步复制,确保消息零丢失
  - 日志采集等非核心场景选异步复制,吞吐量可提升30%
### 3. 与Spring生态的无缝衔接
RocketMQ提供完善的SpringBoot Starter,支持注解驱动开发:
- 对比Kafka需要手动管理消费者组位移,RocketMQ的封装更符合Spring开发者习惯
- 提供`RocketMQTemplate`模板类,简化消息发送逻辑
- 基于`@RocketMQMessageListener`注解快速实现消费逻辑
## 二、架构设计:SpringBoot集成RocketMQ的分层模型
```mermaid
graph TD
    A[接入层] -->|HTTP/ Dubbo| B[业务服务层]
    B --> C[消息生产层<br/>(RocketMQ Template)]
    C --> D[RocketMQ集群<br/>(NameServer+Broker)]
    D --> E[消息消费层<br/>(@RocketMQMessageListener)]
    E --> F[业务处理层]
    F --> G[数据存储层]
    B -->|同步调用| G

核心分层职责解析:

  1. 消息生产层:基于RocketMQTemplate封装同步 / 异步 / 单向发送逻辑,处理消息序列化和发送确认
  1. 消息消费层:通过@RocketMQMessageListener实现消费逻辑,支持负载均衡和广播两种模式
  1. 中间件层:RocketMQ 集群提供消息存储、路由发现和高可用保障,包含 NameServer 和 Broker 节点
  1. 业务适配层:处理消息幂等性、异常重试、日志追踪等横切关注点

三、实战落地:SpringBoot 集成 RocketMQ 核心实现

1. 环境配置(避坑版)

pom.xml 依赖:

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.2.3</version> <!-- 稳定版本,避免使用3.x experimental版 -->
</dependency>

application.yml 配置:

rocketmq:
  name-server: 192.168.1.101:9876;192.168.1.102:9876  # 多节点用分号分隔
  producer:
    group: order-producer-group  # 必须指定,用于消息追踪
    send-message-timeout: 3000   # 建议3-5秒,避免超时重试风暴
    retry-times-when-send-failed: 2  # 同步发送失败重试2次
    retry-times-when-send-async-failed: 0  # 异步发送不重试
  consumer:
    group: order-consumer-group  # 与生产者组分离,便于权限管控
    consume-from-where: CONSUME_FROM_LAST_OFFSET  # 首次启动从最新位置消费

2. 消息生产者实现(含最佳实践)

@Service
@Slf4j
public class OrderMessageProducer {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;
    /**
     * 发送同步消息(订单创建通知)
     * 适用场景:重要通知,需要确认消息是否发送成功
     */
    public void sendOrderCreatedMsg(Order order) {
        try {
            // 构建消息(指定JSON序列化)
            Message<Order> message = MessageBuilder
                    .withPayload(order)
                    .setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON_VALUE)
                    .build();
            
            // 发送到指定主题和标签(主题:标签)
            SendResult result = rocketMQTemplate.syncSend(
                "order-topic:created", 
                message
            );
            
            // 记录发送结果(用于问题排查)
            log.info("订单消息发送成功, msgId: {}, orderId: {}", 
                    result.getMsgId(), order.getId());
        } catch (Exception e) {
            // 发送失败处理(如保存到本地表,定时重试)
            log.error("订单消息发送失败, orderId: {}", order.getId(), e);
            throw new BusinessException("消息发送失败,请稍后重试");
        }
    }
    /**
     * 发送事务消息(订单支付确认)
     * 适用场景:跨服务事务,如支付成功后更新订单状态+通知物流
     */
    public void sendOrderPaymentTxMsg(OrderPayment payment) {
        // 事务消息需要传递本地事务参数
        rocketMQTemplate.sendMessageInTransaction(
            "order-topic:payment",
            MessageBuilder.withPayload(payment).build(),
            payment.getOrderId()  // 用于本地事务执行和回查
        );
    }
}

3. 事务消息监听器(金融级实现)

@RocketMQTransactionListener(txProducerGroup = "order-producer-group")
@Slf4j
public class OrderPaymentTransactionListener implements RocketMQLocalTransactionListener {
    @Autowired
    private OrderService orderService;
    
    @Autowired
    private TransactionLogService transactionLogService;  // 事务日志服务
    /**
     * 执行本地事务
     */
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        String orderId = (String) arg;
        String msgId = msg.getHeaders().get("rocketmq_MESSAGE_ID").toString();
        
        try {
            // 1. 记录事务日志(用于回查)
            transactionLogService.record(msgId, orderId, "EXECUTING");
            
            // 2. 执行本地事务逻辑
            orderService.confirmPayment(orderId);
            
            // 3. 更新事务状态
            transactionLogService.updateStatus(msgId, "COMMITTED");
            return RocketMQLocalTransactionState.COMMIT;  // 提交消息
            
        } catch (Exception e) {
            log.error("本地事务执行失败, orderId: {}", orderId, e);
            transactionLogService.updateStatus(msgId, "ROLLBACKED");
            return RocketMQLocalTransactionState.ROLLBACK;  // 回滚消息
        }
    }
    /**
     * 事务回查(解决本地事务执行结果未知的情况)
     */
    @Override
    public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
        String msgId = msg.getHeaders().get("rocketmq_MESSAGE_ID").toString();
        
        // 根据事务日志判断状态
        TransactionLog log = transactionLogService.getByMsgId(msgId);
        if (log == null) {
            return RocketMQLocalTransactionState.UNKNOWN;  // 继续回查
        }
        
        switch (log.getStatus()) {
            case "COMMITTED":
                return RocketMQLocalTransactionState.COMMIT;
            case "ROLLBACKED":
                return RocketMQLocalTransactionState.ROLLBACK;
            default:
                return RocketMQLocalTransactionState.UNKNOWN;
        }
    }
}

4. 消息消费者实现(高可用版)

@Service
@RocketMQMessageListener(
    topic = "order-topic",
    selectorExpression = "created || payment",  // 订阅多个标签
    consumerGroup = "order-consumer-group",
    messageModel = MessageModel.CLUSTERING,  // 负载均衡模式
    consumeThreadMax = 30,  // 消费线程池最大值
    maxReconsumeTimes = 3  // 最大重试次数,超过则进入死信队列
)
@Slf4j
public class OrderMessageConsumer implements RocketMQListener<MessageExt> {
    @Autowired
    private OrderNotifyService notifyService;
    @Autowired
    private MessageProcessedCache messageProcessedCache;  // 幂等缓存
    @Override
    public void onMessage(MessageExt message) {
        String msgId = message.getMsgId();
        String tag = message.getTags();
        String body = new String(message.getBody());
        
        // 1. 幂等性检查
        if (messageProcessedCache.exists(msgId)) {
            log.info("消息已处理, msgId: {}", msgId);
            return;
        }
        
        try {
            // 2. 业务处理
            if ("created".equals(tag)) {
                Order order = JSON.parseObject(body, Order.class);
                notifyService.notifyUser(order);  // 通知用户订单创建
            } else if ("payment".equals(tag)) {
                OrderPayment payment = JSON.parseObject(body, OrderPayment.class);
                notifyService.notifyMerchant(payment);  // 通知商家收款
            }
            
            // 3. 标记为已处理(设置24小时过期)
            messageProcessedCache.set(msgId, 24, TimeUnit.HOURS);
            log.info("消息处理成功, msgId: {}", msgId);
            
        } catch (Exception e) {
            log.error("消息处理失败, msgId: {}", msgId, e);
            // 抛出异常会触发重试(最多3次)
            throw new RuntimeException("消息处理失败", e);
        }
    }
}

四、架构师关注点:高可用与性能优化

1. 高可用设计(生产环境必看)

  • NameServer 集群:至少部署 3 个节点,客户端配置多个地址(分号分隔),避免单点故障
rocketmq:
  name-server: 192.168.1.101:9876;192.168.1.102:9876;192.168.1.103:9876
  • Broker 主从架构:每个 Broker 部署 1 主 2 从,主节点故障时从节点自动切换
  • 消息持久化:根据业务场景选择刷盘策略
  • 同步刷盘:flushDiskType = SYNC_FLUSH(金融场景)
  • 异步刷盘:flushDiskType = ASYNC_FLUSH(非核心场景)
  • 监控告警:集成 Prometheus+Grafana 监控
  • 核心指标:消息堆积量(>10 万触发告警)、消费延迟(>5 分钟触发告警)、Broker 磁盘使用率(>80% 触发告警)

2. 性能优化策略(实测有效)

  • 批量发送:非实时消息采用批量发送,减少网络 IO
// 批量发送示例(每次不超过1MB)
List<Message> messages = orders.stream()
    .map(order -> MessageBuilder.withPayload(order).build())
    .collect(Collectors.toList());
rocketMQTemplate.syncSendBatch("order-topic:batch", messages);
  • 消费线程池调优:根据业务复杂度调整
rocketmq:
  consumer:
    consume-thread-min: 20  # 初始线程数
    consume-thread-max: 50  # 最大线程数
  • 消息过滤:利用 Tag 和 SQL92 过滤减少无效消费
// SQL92过滤示例(只消费金额>100的订单)
@RocketMQMessageListener(
    topic = "order-topic",
    selectorType = SelectorType.SQL92,
    selectorExpression = "amount > 100",
    ...
)

3. 幂等性保障(分布式系统必备)

// 基于Redis的幂等处理实现
@Component
public class MessageProcessedCache {
    @Autowired
    private StringRedisTemplate redisTemplate;
    
    private static final String PREFIX = "msg:processed:";
    
    public boolean exists(String msgId) {
        return redisTemplate.hasKey(PREFIX + msgId);
    }
    
    public void set(String msgId, long timeout, TimeUnit unit) {
        redisTemplate.opsForValue().set(PREFIX + msgId, "1", timeout, unit);
    }
}

五、生产环境踩坑指南(血的教训)

1. 消息堆积问题

现象:消费速度跟不上生产速度,消息堆积量持续增加

排查步骤:

  1. 检查消费者日志,确认是否有频繁报错
  1. 监控消费线程池状态:consumeThreadMax是否过小
  1. 分析消息处理耗时:是否存在慢查询(如未索引的 SQL)

解决方案:

  • 临时扩容消费者节点(负载均衡模式下自动分担压力)
  • 拆分大消息为小消息(单条消息建议 < 10KB)
  • 非核心消息降级:通过@RocketMQMessageListener(enable = false)临时关闭

2. 事务消息丢失

现象:本地事务执行成功,但消息未提交

根因分析:

  • 事务监听器抛出未捕获异常,导致状态异常
  • 应用重启时,未完成的事务状态丢失

解决方案:

  • 事务逻辑必须捕获所有异常,明确返回 COMMIT/ROLLBACK
  • 关键业务必须记录事务日志,回查时基于日志判断状态
  • 配置transactionTimeout参数(默认 60 秒),避免长时间未回查

3. 重复消费导致业务异常

现象:同一消息被多次处理,导致数据不一致

解决措施:

  • 所有消费逻辑必须实现幂等(基于消息 ID 或业务唯一键)
  • 重要业务采用分布式锁(如 Redis 锁)保证并发安全
  • 合理设置maxReconsumeTimes,避免无效重试

六、总结:消息队列的架构价值

SpringBoot 集成 RocketMQ 的本质,是通过消息驱动架构实现系统解耦。作为架构师,我们需要关注的不仅是技术实现,更要理解其在分布式系统中的核心价值:

  1. 流量削峰:在秒杀等高峰期,通过消息队列缓冲请求,保护下游系统
  1. 异步通信:将非实时依赖转为异步消息,提升主流程响应速度(如订单创建后异步通知物流)
  1. 系统韧性:单个服务故障不会影响整个链路,提高系统容错能力
  1. 数据一致性:通过事务消息保证跨服务操作的最终一致性

最后给架构选型的建议:没有银弹,只有最合适。RocketMQ 适合中大型分布式系统,尤其是金融、电商等对可靠性要求高的场景;中小规模应用可考虑 RabbitMQ 的便捷性;日志等大数据场景 Kafka 更有优势。

如果你在 RocketMQ 落地过程中遇到过特殊场景或棘手问题,欢迎在评论区分享你的解决方案!

从零到一:Spring Boot 与 RocketMQ 的完美集成指南 了解消息的发送与消费流程、存储机制、可靠性保障、事务支持、以及顺序消息的处理等方面的知识,将有助于你更高效地使用和管理RocketMQ系统。而分区顺序消息则允许不同分区(队列)中的消息可以并行处理,但同一分区内的消息必须按顺序处理。RocketMQ的消息存储分为三个层次:首先是将消息内容存储在CommitLog文件中,然后将消息的位置信息存储在ConsumeQueue文件中,最后通过IndexFile文件提供快速查询功能。这减少了Consumer不必要的消息处理,提高了消费效率。 阅读详情

相关推荐

Springboot整合Rocketmq系列教程

本教程是基于Springboot2.6.3整合Rocketmq5.0,其中涉及了Rocketmq的安装,消息的发送及消费的代码实现。本文不会对rocketmq的一些概念、原理,及注意事项进行讲解,因为官网已经写的很清楚,又有中文版,详细访问https://rocketmq.apache.org/zh/docs/quickStart/01quickstart。

gzmyh的博客 9111

Springboot快速集成RocketMQ

零基础,Springboot快速集成RocketMQ

huangtenglong的博客 6714

【RocketMQ】整合SpringBoot

另一个区别是消费失败时的处理不同,有序消费模式返回ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT后,消费者会立马消费这条消息,而使用并发消费模式,返回ConsumeConcurrentlyStatus.RECONSUME_LATER后,要过好几秒甚至十几秒才会再次消费。顾名思义,有序消费模式是按照消息的顺序进行消费,但是除此之外,我发现和并发消费模式还有很大的区别的。并发消费模式则不会无限消费,而且消费失败后不会马上再消费。......

Small ink的博客 2638

【SpringBoot高级篇】SpringBoot集成RocketMQ消息队列

RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发,在阿里内部,RocketMQ承接了例如“双11”等高并发场景的消息流转,能够处理万亿级别的消息。

输入技术、输出想法 2万+

RocketMQ(一):Linux安装RocketMQ和常用命令

下载安装 版本:4.8.0 下载地址:https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.8.0/rocketmq-all-4.8.0-source-release.zip 下载成功后,上传到 /opt 目录,并解压

qq_28834355的博客 1602

钉钉Java面经及参考答案

TCP 三次握手建立连接的核心目标是双向确认双方发送、接收能力,同步通信序列号,协商初始窗口大小,防止历史过期连接报文干扰新连接。第一次握手,客户端主动向服务端发送 SYN 报文,携带客户端随机生成的初始序列号 ISN,客户端状态变更为 SYN_SENT,目的是告知服务端客户端具备发送数据的能力。第二次握手,服务端收到 SYN 报文后,回复 SYN+ACK 报文,其中 ACK 确认号为客户端 ISN+1,同时携带服务端自身随机初始序列号,服务端进入 SYN_RCVD 状态,代表服务端确认收到客户端报文,且自

大模型大数据攻城狮的专栏 238

Redis 知识体系(文档型 NoSQL)

本文深入解析Redis八大基础数据结构及其底层编码实现,涵盖String、List、Set、ZSet、Hash、Geo、Bitmap、HyperLogLog和Stream等核心结构。通过源码级分析,揭示了SDS、Ziplist、Dict等底层组件的设计原理,并详细探讨了Redis的高性能IO模型、持久化机制(RDB/AOF/混合模式)、内存管理策略及高可用架构(主从/哨兵/Cluster)。 重点剖析了Redis在工程实践中的典型问题与优化方案,包括缓存穿透/击穿/雪崩的解决方案、分布式锁的完整实现(含Re

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 800

STM32F103C8T6 驱动2位共阳数码管(基于 74HC595 和 PNP 三极管)

整体设计思路是通过 STM32F103C8T6 控制 74HC595 和 PNP 三极管,实现共阳数码管的显示功能。最初的电路设计中,三极管发射极接 5V 电源,这导致了数码管两位显示相同数字的问题。数码管能够稳定显示 0-99的数字。

qq_40289410的博客 2214

RocketMQ整合SpringBoot

SpringBoot整合RocketMQ pom.xml <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>${rocketmq.version}</version> </d

weixin_47638656的博客 1272

MPC模型预测控制实战:从理论到代码实现(Python示例)

本文详细介绍了MPC模型预测控制的实战应用,从理论到Python代码实现。通过构建系统模型、预测方程、优化问题及约束处理,展示了如何实现一个完整的MPC控制器。文章还提供了水箱液位控制的应用案例,帮助读者掌握MPC在工业控制中的实际应用。

weixin_42653691的博客 461

国内合规开通ChatGPT Plus实操指南:银行卡绑卡与支付全解析

ChatGPT Plus 是 OpenAI 官方推出的高级订阅服务,基于 GPT-4o 多模态大模型提供语音交互、图像理解与长上下文处理能力。其核心使用前提在于完成合规的国际支付绑定,而非网络接入方式。技术原理上,OpenAI 采用 Stripe 支付网关进行风控校验,重点匹配银行跨境权限、卡片类型(仅支持 Visa/Mastercard/Amex 信用卡)、BIN 号段及地理位置一致性。该机制决定了95%的绑卡失败源于银行端配置缺失或卡片不兼容,而非网络问题。实际应用中,PayPal 作为中间支付层可显著

chuannaoxuan4674的博客 2026

SpringBoot 集成 RocketMQ

RocketMQ 主要由 Producer、Broker、Consumer 三部分组成,其中 Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个 Topic 的消息,每个Topic 的消息也可以分片存储于不同的 Broker。消息中转角色,负责存储消息、转发消息。表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ 进行消息订阅的基本单位。

魂-淡 8277

Windows下构建ImGui.Net

工具 Visual Studio 2017 操作 下载项目 git clone https://github.com/mellinoe/ImGui.NET.git 编译 右键以下两个项目并调试: ImGui.NET.SampleProgram ImGui.NET.SampleProgram.XNA Error fix 中间遇到一些问题: SDK版本不对 去微软官网下载安装对应版本 由于设置了代理被远程服务器拒绝连接 关闭代理(也许在环境变量中) nuget源无对应资源,404 NOT FOUN

jojozym的博客 1489

rocketMq整合springboot与介绍

broker是消息的中转中心,负责消息的存储以及转发NameServer主要负责对于数据源的管理,包括了对于Topic和路由信息的管理.Producer消息的生产者,一般由业务系统来生产对应的业务消息。消费者进行数据的消费。Consumer 消息消费者,负责消费消息,一般是后台系统负责异步消费。Message 一条消息必须有一个主题(Topic),主题可以看做是你的信件要邮寄的地址Topic Topic(主题)可以看做消息的规类,它是消息的第一级类型。

Jelly 8510

达梦数据库集群部署(主备)

达梦数据库集群部署(主备)

m0_71845127的博客 1462

Spark数据倾斜问题+解决方案

1、数据倾斜 数据倾斜指的是,并行处理的数据集中,某一部分(如Spark或Kafka的一个Partition)的数据显著多于 其它部分,从而使得该部分的处理速度成为整个数据集处理的瓶颈 数据倾斜俩大直接致命后果 1)数据倾斜直接会导致一种情况:Out Of Memory 2)运行速度慢 主要是发生在Shuffle阶段。同样Key的数据条数太多了。导致了某个key(下图中的80亿条)所在的Task数 据量太大了。远远超过其他Task所处理的数据量 一个经验结论是:一般情况下,OOM的原因都是数据倾斜 2、如

诸葛搏毅 6772

Spring Boot集成RocketMq(一看就会)

Spring boot 整合RocketMq快速上手,一看就会

weixin_44039105的博客 1万+

国科大学习资料--数据挖掘(刘莹)--第三章习题及参考答案

国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 第 3 章分类与回归 3.1简述决策树分类的主要步骤。 答:决策树生成的过程如下: (1)对数据源进行数据预处理, 得到训练集和测试集; (2)对训练集进行训练; (3)对初始决策树进行树剪枝; (4)由所得到的决策树提取分类规则; (5)使用测试数据集进行预测,评估决策树模型; 3.2给定决策树,选项有:(1)将决策树转换成规则,然后对结果

无名何许人的博客 3094

SpringBoot集成RocketMQ

MQ(Message Queue)是一种跨进程的通信机制,用于传递消息。使用MQ之后可以实现异步解耦和流量消峰的功能。在微服务项目中是一个常用的组件。RocketMQ的使用需要先启动RocketMQ的服务,这样才可以在后端连接RocketMQ并使用RocketMQ传递消息。

Ahjbvj的博客 7272

【图像拼接(Image Stitching)】关于【图像拼接论文精读】专栏的相关说明,包含专栏使用方法、阅读顺序、创新思路、文章汇总、源码汇总、数据集汇总等。总之,【图像拼接论文相关】看这一篇就够了

为什么会有这篇文章?因为专栏简介里写不下太多东西,只能通过这篇文章和大家交流,算是一个专栏阅读指南吧。说点心里话本来吧,我只想用优快云来记录自己学习【图像拼接】领域论文的过程,对每篇文章有个细致的理解,方便自己反复查阅。设置为付费也是因为涉及论文和本人其他项目需要,防止查重和其他问题,所以价格最开始设置的是专栏付费价格里最高的。起初,确实没有人看,一切也都平淡地度过着。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 4万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

springboot整合rocketMq、rocketMq批量发送、消费、rocketMq手动发送和监听

RocketMQ 是一款高性能、高吞吐量、低延迟的消息中间件。由阿里出品,后来捐赠给开源组织Apache。一般用于流量削峰填谷、异步通信、系统之间异步解耦、顺序消息、定时消息、事务消息等场景。RocketMQ5.0还支持类使用kafka的流处理。

m0_46861007的博客 7909

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RocketMQ从部署到spring boot使用完整教程

RocketMQ从部署到spring boot使用完整教程

weixin_44111939的博客 3390

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

rocketMq-springBoot整合

Springboot整合RocketMQ springBoot 2.2.4 rocketMq 4.3.2 (服务端) rocketMq 4.4.0 (客户端) lombok 配置 pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</a

六月的雨 4123
上一篇: 数据分析实战项目——电商用户行为分析及可视化(基于SQL/Tableau 含代码)
下一篇: 深度对比:RocketMQ 凭什么成为阿里系首选消息队列?
程序员职业指南
博客等级 码龄4年 2139粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值