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

简介: 教程来源 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/

相关文章
|
17天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
6283 30
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
2天前
|
数据采集 人工智能 前端开发
让 Coding Agent 从黑盒到透明:阿里云 Agent 观测审计数据采集实践
AI Agent 规模化落地带来执行黑盒、行为难追溯、成本难度量三大难题。阿里云基于 OTel 标准,面向 Coding Agent、个人通用助理和框架型 Agent,推出 LoongSuite Pilot、插件及探针等无侵入采集方案,让 Agent 实现可看见、可分析、可审计、可治理。
582 135
|
12天前
|
存储 定位技术 数据库
CodeGraph 如何让 Claude Code减少 7 成工具调用?
CodeGraph 为 Coding Agent 提供本地代码知识图谱,把函数、类、调用链和框架路由提前整理成“项目地图”,减少盲目搜索和文件读取。它不是新 Agent,而是上下文基础设施,让 Agent 更快找到正确代码路径,平均减少 7 成工具调用。
1238 3
|
9天前
|
人工智能 安全 定位技术
CodeGraph深度解析 让Claude Code工具调用直降七成的核心原理与实操教程
如今以Claude Code为代表的AI编程智能体已经成为开发者日常编码、项目重构、漏洞修复的必备工具。但在长期使用过程中,几乎所有开发者都会遇到同一个明显痛点:AI虽然具备强大的代码生成与分析能力,却常常陷入盲目探索的循环中。
1088 1
|
19天前
|
人工智能 自然语言处理 供应链
|
9天前
|
人工智能 弹性计算 安全
阿里云618活动时间、活动入口、优惠活动详细解读
2026年阿里云618创新加速季已全面开启,作为年度力度最大的云产品促销活动,本次大促覆盖轻量应用服务器、ECS云服务器、GPU云服务器、数据库、AI算力、安全服务、CDN等全品类产品,推出5亿元算力补贴、新用户限时秒杀、普惠满减、企业专享、免费试用、云大使返佣等多重福利,个人开发者、中小企业、AI团队均可享受专属低价。本文将系统梳理2026年阿里云618活动的完整时间节点、官方参与入口、各类优惠细则、使用规则、热门产品推荐及实操代码,帮助用户精准参与、高效省钱,以最低成本完成上云部署。
871 5
|
8天前
|
人工智能 自然语言处理 安全
Vibe Coding 实战:别盲目跟风,先分清 vibe coding 适合什么场景
本文系统总结vibe coding实战经验:明确其适用场景(原型、小工具、标准化模块),剖析5步落地流程(场景判定→结构化提示词→目录初始化→分模块生成→自动化校验),指出四大常见误区,并推荐适配工具Trae。强调“场景匹配+规则前置”是提效关键,避免盲目套用。
723 1