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

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

相关文章
|
2月前
|
Linux 程序员 网络安全
初级程序员必备的十大技能之基础 Linux 命令(一)
教程来源 https://qcycj.cn/ 本文系统讲解程序员必备的Linux核心命令,涵盖文件操作、文本处理、权限管理、进程与网络工具等,结合原理、参数详解及实战案例,助你高效部署、排查与运维——无论用Windows还是macOS,Linux都是程序员不可或缺的“第二操作系统”。
|
1月前
|
运维 Java 测试技术
程序员必备的十大技能(进阶版)之性能调优与故障排查(四)
教程来源 https://aescc.cn/ 本节系统介绍Java应用性能分析与稳定性保障核心实践:涵盖Arthas诊断、火焰图性能剖析、全链路压测方法论及JMeter实战、混沌工程故障注入(ChaosBlade),并复盘Full GC与数据库死锁两大典型故障案例,助力高效定位与解决线上性能问题。
|
1月前
|
人工智能 运维 安全
阿里云百炼官网两大入口详解 平台首页、后台控制台与API Key使用教程
阿里云百炼是面向企业与开发者打造的一站式大模型服务平台,整合通义千问系列、视觉模型、语音模型等多款优质大模型,同时提供模型体验、应用开发、智能体搭建、模型调优、批量推理等全链路能力,也是目前国内主流的大模型服务底座之一。想要使用百炼平台的各项能力,首先需要区分两大核心登录入口:平台介绍首页与管理控制台,两个入口定位不同、功能划分清晰,对应新手体验、开发者对接、企业运维等不同使用场景。
599 2
|
1月前
|
人工智能 Rust 监控
这 3 个开源小工具,帮你让 Coding Agent 少吃点 Token
今天我们就来分享 3 个有用的开源项目,专门帮你的 Coding Agent 整理“上下文”:让它少翻无关代码,少吞冗长日志,把 token 留给更关键的信息。
283 0
这 3 个开源小工具,帮你让 Coding Agent 少吃点 Token
|
1月前
|
人工智能 自然语言处理 算法
GEO实战:用RAG构建外贸知识库
AI搜索时代,外贸企业缺的不是内容,而是结构化、可检索、可验证的企业知识库。本文以RAG为框架,详解如何将分散的资质、案例、流程等转化为“知识原子”,支撑GEO(生成式引擎优化),实现AI精准理解、可信回答与商机转化。
191 0
|
1月前
|
人工智能 缓存 自然语言处理
Claude Code 原生终端仪表盘
Claude Code 内置 `statusline` 命令,支持自定义终端底部状态栏:实时显示模型、目录、Git 分支、Token 消耗、缓存命中率及上下文进度条。三种配置方式——自然语言指令、脚本手动设置或 ChatGPT 辅助设计,兼顾简洁性与信息密度,显著提升 AI 编程的上下文掌控感。(239字)
296 0
|
24天前
|
Java Windows
JDK 8 安装与环境变量配置教程(jdk-8u121-windows-x64.exe 详细步骤)
本教程详解JDK 8u121 Windows 64位安装与配置:含管理员运行、路径选择、JAVA_HOME及Path环境变量设置,并通过java/javac -version命令快速验证,步骤清晰,适配Win10/Win11。
|
25天前
|
人工智能 缓存 API
阿里云百炼 Token Plan 三大坐席对比:Credits资费额度、Token消耗与性价比分析
阿里云百炼TokenPlan含标准版(198元/月,2.5万Credits)、高级版(698元/月,10万Credits)和尊享版(1398元/月,25万Credits)。经测算,尊享版单Credits仅0.0056元,折合百万Tokens约1.12元,显著低于按量计费(2元/百万Tokens),性价比高,值得订阅。在阿里云百炼平台:https://t.aliyun.com/U/fPVHqY 免费领取千万Tokens
|
1月前
|
存储 人工智能 自然语言处理
Skills实战:从0到1封装一个“登录鉴权”Skill,拿来即用
本文直击AI Agent落地痛点——登录鉴权失效、状态丢失、提示词不可靠。提出以“Skill”替代传统提示词工程:将动态认证逻辑(如Token获取/刷新/存储)封装为可复用、带状态管理的代码模块,实现跨会话稳定调用。实战拆解Skill四要素,揭示其如何让AI“一次登录,全程无忧”。
|
1月前
|
监控 API Windows
WGCLOUD v3.6.8 正式更新
WGCLOUD v3.6.8发布:修复CPU/内存等指标偶现为0、大屏离线数据不显示等Bug;新增Windows系统服务列表及开放API;优化告警脚本执行与SNMP设备运行时间兼容性。升级方式详见官方图示。