软件开发进阶技能之分布式与高并发(二)

简介: 教程来源 https://oplhc.cn/ 消息队列(MQ)是分布式系统核心中间件,以异步通信实现服务解耦、流量削峰与最终一致性。支持可靠投递、幂等消费与死信处理,广泛应用于秒杀、日志收集等高并发场景。

第五部分:消息队列 —— 异步削峰的解耦神器

消息队列(MQ)是分布式系统不可或缺的中间件,它通过异步通信实现应用解耦、流量削峰和最终一致性。

5.1 典型使用场景
异步处理:用户注册成功后发送邮件和短信,可放入队列,主流程快速返回。

应用解耦:订单系统发布“订单创建”事件,库存、积分等系统订阅处理,互不影响。

流量削峰:秒杀系统中,先将请求入队,后端 worker 按能力处理,避免 DB 被瞬时流量打死。

日志收集:各服务将日志发送到 MQ,再统一由 logstash 消费写入 ES。

5.2 主流 MQ 对比
image.png
5.3 可靠消息传递的关键概念
生产端确认:publisher confirm (RabbitMQ) / acks (Kafka) 确保消息成功到达 broker。

消费端确认:处理完消息后手动 ack,确保不丢失;若未 ack,消息可重新消费。

消息持久化:写入磁盘,broker 重启不丢失。

死信队列(DLQ):处理无法被正常消费的消息,便于排查和重试。

5.4 使用 RocketMQ 实现削峰(Java 示例)
生产者:秒杀请求入队

@PostMapping("/seckill")
public String seckill(Long userId, Long productId) {
    // 简单校验库存(可用 Redis 预减)
    String orderId = UUID.randomUUID().toString();
    // 发送延迟消息(例如 10 秒后处理支付超时)
    Message msg = new Message("SEC_KILL_TOPIC", "order", (userId+":"+productId).getBytes());
    // 同步发送或异步
    SendResult result = producer.send(msg);
    return "排队中";
}

消费者:处理订单创建

@RocketMQMessageListener(topic = "SEC_KILL_TOPIC", consumerGroup = "order_consumer")
public class OrderConsumer implements RocketMQListener<String> {
    @Override
    public void onMessage(String message) {
        // 校验库存、创建订单、扣减数据库库存
        // 注意幂等性(防止重复消费)
    }
}

5.5 消息幂等性
由于 MQ 可能重发消息,消费者必须实现幂等(同一个消息被消费多次结果一样)。实现方式:

数据库唯一键约束:订单号作为唯一索引,重复插入会失败。

Redis 记录已处理的消息 ID:SETNX msgId 1 成功则处理,失败则跳过。

业务状态机:处理前检查状态(如订单已经是“已处理”状态则不再处理)。

第六部分:分布式事务 —— 跨数据的一致性难题

当业务涉及多个独立的数据源(如数据库、Redis、MQ)时,传统的数据库本地事务无法保证全局一致性。分布式事务方案在性能与一致性之间做出取舍。

6.1 两阶段提交(2PC)与三阶段提交(3PC)
2PC:协调者询问所有参与者是否准备好(Prepare),若全部同意则提交(Commit),否则回滚。缺点是同步阻塞、单点故障、数据不一致风险(Prepare 后协调者崩溃)。

3PC:引入超时机制和预提交阶段,减少了阻塞范围,但仍较复杂,实际应用较少。

典型实现:XA 协议(MySQL、Oracle 支持),性能较差,不适合高并发。

6.2 TCC(Try-Confirm-Cancel)
TCC 是一种补偿型事务,将业务操作拆分为三个阶段:

Try:预留资源(如冻结库存、预减余额)。

Confirm:确认执行(实际扣减、完成业务)。

Cancel:取消(释放预留资源)。

优点:性能较高,由业务层控制粒度。缺点:侵入性强,需要编写三个接口,且要处理幂等和悬挂问题。

示例:转账服务(A 转给 B 100 元)

// Try 阶段:冻结 A 的 100 元,增加 B 的预收资金
void tryTransfer(String from, String to, int amount);

// Confirm:实际扣减 A 的冻结资金,将 B 的预收转为可用余额
void confirmTransfer(String from, String to, int amount);

// Cancel:解冻 A 的资金,回退 B 的预收
void cancelTransfer(String from, String to, int amount);

实现时需要保证 Confirm/Cancel 的幂等性。

6.3 本地消息表 + MQ(最终一致性)
这是最常用的最终一致性方案。以订单创建和扣减库存为例:

订单服务在本地事务中:插入订单记录,同时插入一条消息记录(状态为“待发送”)。

异步任务轮询消息表,将消息发送到 MQ。

库存服务消费 MQ 消息,扣减库存。

库存处理成功后,通过回调接口通知订单服务更新消息状态为“已处理”。

若库存服务失败,可重试或转入人工处理。

优点:不依赖分布式事务,性能好。缺点:需要维护消息表,且至少需要保证 MQ 至少一次投递。

6.4 Seata 框架
Seata 是阿里开源的分布式事务解决方案,提供了 AT(自动补偿)、TCC、Saga 等模式。AT 模式基于数据源代理,自动生成回滚 SQL,无业务侵入。

# Spring Boot 中使用 Seata AT 模式
@GlobalTransactional
public void purchase(Long userId, Long productId, int count) {
    orderService.createOrder(userId, productId, count);   // 本地事务
    stockService.deductStock(productId, count);           // 远程调用
    accountService.debitBalance(userId, count * price);   // 远程调用
}

Seata 记录 Undo Log,若任一步骤失败,自动反向补偿。
来源:
https://hllft.cn/

相关文章
|
20小时前
|
缓存 负载均衡 NoSQL
软件开发进阶技能之分布式与高并发(一)
教程来源 https://tmywi.cn/ 本文系统讲解分布式与高并发核心技能:从CAP/BASE理论、负载均衡、多级缓存(穿透/击穿/雪崩应对)、消息队列、分布式事务/锁,到微服务治理与限流熔断,涵盖原理、实战代码与真实场景,助你构建高可用、可扩展的现代系统。
|
20小时前
|
SQL 监控 关系型数据库
软件开发进阶技能之数据库进阶(五)
教程来源 https://zlpow.cn/ 本节详解数据库高可用核心方案:主从复制(异步/半同步原理、搭建与延迟治理)、自动故障转移(MHA/Orchestrator)及读写分离实践,并涵盖监控指标、慢查询分析与配置调优,助力系统稳定扛住高并发。
|
10天前
软件开发新手入门五大核心技能之计算机基础常识(二)
教程来源 http://htnus.cn/ 本章详解计算机底层语言——二进制:从物理实现优势出发,讲解二进制与十进制互转、原反补码原理(含-128特例)、IEEE 754浮点数标准(解释0.1+0.2≠0.3),以及ASCII到Unicode/UTF-8的字符编码演进与乱码修复。
|
10天前
|
算法 IDE 搜索推荐
软件开发新手入门五大核心技能之基础编程能力(五)
教程来源 http://fndvx.cn/ 本章涵盖算法思维与调试能力:详解冒泡、快排、归并等经典排序及线性、二分查找算法;介绍打印调试、断点调试、断言验证等实用技巧;剖析空指针、索引越界等常见错误及解决方案;最后通过学生成绩管理系统实战,综合运用面向对象编程与数据处理能力。
|
10天前
|
消息中间件 存储 资源调度
软件开发新手入门五大核心技能之计算机基础常识(四)
教程来源 http://uklgy.cn/ 本章介绍操作系统核心机制:进程/线程模型、IPC通信方式;并发控制中的竞态条件、锁与死锁;虚拟内存与分页机制;文件系统结构及权限管理。辅以Java、Python、C语言实例,深入浅出解析资源调度与内存管理原理。
|
19小时前
|
存储 监控 安全
K-EP280 单组分高温环氧结构胶技术白皮书:从材料设计到极端工况应用
K-EP280是单组分高温环氧结构胶,Tg达208℃,长期耐温280℃(3000h强度保持率≥80%),瞬时耐温600℃;无需底涂即可实现锌/镁合金等难粘基材的内聚破坏级粘接;具备优异电绝缘、耐化学介质及老化性能,适配自动化点胶,专为新能源汽车、IGBT模块及航空航天等极端工况设计。(239字)
57 1
|
19小时前
|
人工智能 运维 安全
阿里云百炼官网两大入口详解 平台首页、后台控制台与API Key使用教程
阿里云百炼是面向企业与开发者打造的一站式大模型服务平台,整合通义千问系列、视觉模型、语音模型等多款优质大模型,同时提供模型体验、应用开发、智能体搭建、模型调优、批量推理等全链路能力,也是目前国内主流的大模型服务底座之一。想要使用百炼平台的各项能力,首先需要区分两大核心登录入口:平台介绍首页与管理控制台,两个入口定位不同、功能划分清晰,对应新手体验、开发者对接、企业运维等不同使用场景。
64 2
|
19小时前
|
人工智能 Rust 监控
这 3 个开源小工具,帮你让 Coding Agent 少吃点 Token
今天我们就来分享 3 个有用的开源项目,专门帮你的 Coding Agent 整理“上下文”:让它少翻无关代码,少吞冗长日志,把 token 留给更关键的信息。
这 3 个开源小工具,帮你让 Coding Agent 少吃点 Token
|
10天前
|
Web App开发 人工智能 IDE
小白速通 Codex App:带录播回放
**文末有录播地址** 早上 9 点,你同时有三件事要干:改一个页面、修一个小 bug、整理一份项目说明。 以前这三件事排在一起,你大概率会先挑一个做,剩下两个往后拖。用 AI 编程以后,情况变了。你可以让不同任务并行跑,自己回来只看结果、看 diff、看哪里需要确认。 这也是我为什么要重点讲 Codex App。 Codex 入口很多,CLI、IDE、Cloud/Web、Mobile 都
小白速通 Codex App:带录播回放
|
8天前
|
机器学习/深度学习 数据采集 人工智能
田间杂草检测数据集分享(适用于YOLO系列深度学习分类检测任务)
本数据集含4000张真实农田图像(小麦/玉米/水稻田),YOLO格式标注杂草目标,覆盖多天气、光照与视角,适用于YOLO系列等目标检测模型训练,助力智能除草与精准农业研究。(239字)
194 16