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

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

相关文章
|
3月前
|
Linux 程序员 网络安全
初级程序员必备的十大技能之基础 Linux 命令(一)
教程来源 https://qcycj.cn/ 本文系统讲解程序员必备的Linux核心命令,涵盖文件操作、文本处理、权限管理、进程与网络工具等,结合原理、参数详解及实战案例,助你高效部署、排查与运维——无论用Windows还是macOS,Linux都是程序员不可或缺的“第二操作系统”。
|
2月前
|
人工智能 运维 安全
阿里云百炼官网两大入口详解 平台首页、后台控制台与API Key使用教程
阿里云百炼是面向企业与开发者打造的一站式大模型服务平台,整合通义千问系列、视觉模型、语音模型等多款优质大模型,同时提供模型体验、应用开发、智能体搭建、模型调优、批量推理等全链路能力,也是目前国内主流的大模型服务底座之一。想要使用百炼平台的各项能力,首先需要区分两大核心登录入口:平台介绍首页与管理控制台,两个入口定位不同、功能划分清晰,对应新手体验、开发者对接、企业运维等不同使用场景。
1066 2
|
2月前
|
运维 Java 测试技术
程序员必备的十大技能(进阶版)之性能调优与故障排查(四)
教程来源 https://aescc.cn/ 本节系统介绍Java应用性能分析与稳定性保障核心实践:涵盖Arthas诊断、火焰图性能剖析、全链路压测方法论及JMeter实战、混沌工程故障注入(ChaosBlade),并复盘Full GC与数据库死锁两大典型故障案例,助力高效定位与解决线上性能问题。
|
2月前
|
人工智能 Rust 监控
这 3 个开源小工具,帮你让 Coding Agent 少吃点 Token
今天我们就来分享 3 个有用的开源项目,专门帮你的 Coding Agent 整理“上下文”:让它少翻无关代码,少吞冗长日志,把 token 留给更关键的信息。
493 0
这 3 个开源小工具,帮你让 Coding Agent 少吃点 Token
|
2月前
|
存储 人工智能 运维
基于OpenClaw的阿里云JVS Claw技术详解 架构能力、部署流程与二次开发实操指南
在AI智能体逐步从纯对话交互转向自主任务执行的行业趋势下,具备自动化操作能力的AI执行助理成为个人办公、开发工作、团队协作的重要工具。阿里云JVS Claw是基于OpenClaw开源框架打造的新一代AI智能执行助理,区别于传统对话型AI,它可以作为独立数字员工,在隔离的运行环境中自主完成文档处理、代码编写、网页操作、日程管理等多样化任务。该产品支持云端、本地两种部署模式,搭配可视化运行界面、海量拓展技能与金融级安全隔离机制,兼顾易用性、安全性与拓展性。
347 0
|
2月前
|
人工智能 自然语言处理 算法
GEO实战:用RAG构建外贸知识库
AI搜索时代,外贸企业缺的不是内容,而是结构化、可检索、可验证的企业知识库。本文以RAG为框架,详解如何将分散的资质、案例、流程等转化为“知识原子”,支撑GEO(生成式引擎优化),实现AI精准理解、可信回答与商机转化。
280 0
|
2月前
|
人工智能 缓存 自然语言处理
Claude Code 原生终端仪表盘
Claude Code 内置 `statusline` 命令,支持自定义终端底部状态栏:实时显示模型、目录、Git 分支、Token 消耗、缓存命中率及上下文进度条。三种配置方式——自然语言指令、脚本手动设置或 ChatGPT 辅助设计,兼顾简洁性与信息密度,显著提升 AI 编程的上下文掌控感。(239字)
496 0
|
1月前
|
人工智能 自然语言处理 数据可视化
【新版】阿里云 百炼大模型平台 功能介绍及配置价格表
阿里云百炼大模型平台是一站式企业级大模型开发与应用构建平台,集成通义千问全系列及第三方主流大模型,提供模型调用、Prompt工程、RAG、智能体构建、模型微调、评估部署等全链路能力,依托阿里云强大算力与安全体系,为开发者与企业提供开箱即用、灵活高效的AI开发服务,大幅降低大模型应用落地门槛。平台支持多种部署方式与灵活计费模式,适配个人开发者、中小企业及大型企业的多样化AI需求,从简单文本生成到复杂智能体应用,均可快速实现。
449 4
|
2月前
|
Java Windows
JDK 8 安装与环境变量配置教程(jdk-8u121-windows-x64.exe 详细步骤)
本教程详解JDK 8u121 Windows 64位安装与配置:含管理员运行、路径选择、JAVA_HOME及Path环境变量设置,并通过java/javac -version命令快速验证,步骤清晰,适配Win10/Win11。
|
2月前
|
人工智能 弹性计算 API
【AI 尝鲜实验室】上新 | Odysseus:一个属于你自己的私人 AI 工作台
Odysseus 是 GitHub 75.8k Star 的开源自托管 AI 工作台(AGPL-3.0),集成聊天、Agent、深度研究、多模型对比等9大场景,共享统一AI大脑。本实验通过阿里云计算巢一键部署,配百炼API即可调用Qwen系列模型,适合重视数据主权的开发者与知识工作者。(239字)