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

简介: 教程来源 本节详解分布式系统核心机制:第七部分聚焦分布式锁,对比Redis(含Redisson)、ZooKeeper、数据库三种实现,强调安全性与可靠性;第八部分阐述微服务治理,涵盖注册发现、配置中心、负载均衡及Sentinel熔断降级限流,助力构建高可用分布式架构。

第七部分:分布式锁 —— 共享资源的安全访问

在分布式环境中,多个进程(或线程)需要互斥地访问共享资源(如库存扣减、定时任务执行),就需要分布式锁。

7.1 基于 Redis 的分布式锁
Redis 的 SET NX EX 命令可以实现简单的锁。

基础版本:

String lockKey = "lock:product:1001";
String requestId = UUID.randomUUID().toString();
// 设置键和值,只有不存在时才成功,并设置过期时间 30 秒
Boolean success = redis.setnx(lockKey, requestId, 30, TimeUnit.SECONDS);
if (success) {
    try {
        // 执行业务逻辑
    } finally {
        // 释放锁:使用 Lua 脚本保证原子性(先判断再删除)
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        redis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
    }
}

问题:单点故障。如果 Redis 主从切换,锁可能丢失。Redlock(Redis 作者提出)使用多个独立 Redis 节点,多数派加锁,但争议较大(时钟漂移、GC 停顿导致锁失效)。

推荐:使用 Redisson 框架,它封装了看门狗(Watchdog)自动续期机制,避免锁过期任务未完成。

RLock lock = redisson.getLock("myLock");
lock.lock(10, TimeUnit.SECONDS);
try {
    // ...
} finally {
    lock.unlock();
}

7.2 基于 ZooKeeper 的分布式锁
ZooKeeper 通过临时顺序节点实现锁:每个客户端在锁节点下创建临时顺序节点,序号最小的获得锁。监听前一个节点的删除事件,实现公平锁。

优点:强一致性(ZAB 协议),无单点问题,自带心跳检测防止死锁。缺点:性能比 Redis 低(适合并发量不太高的场景)。

7.3 基于数据库的唯一索引
利用数据库唯一键约束作为锁:执行 INSERT INTO distributed_lock(lock_key, node_id) VALUES ('key', 'node1'),成功表示获得锁,删除即释放。性能差,但简单可靠。

第八部分:服务治理与微服务 —— 管理分布式系统的“千军万马”

当服务数量膨胀到几十上百个,需要一套治理体系来管理服务注册、发现、配置、路由、容错、监控。

8.1 服务注册与发现
服务启动时将自己的地址注册到注册中心(如 Nacos、Eureka、Consul、ZooKeeper),消费者从注册中心获取提供者列表,实现动态感知。

Nacos 使用示例(Spring Cloud Alibaba):

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
@RestController
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/call")
    public String call() {
        // 使用服务名调用,Ribbon 进行负载均衡
        return restTemplate.getForObject("http://service-provider/hello", String.class);
    }
}

8.2 配置中心
集中管理各环境配置,修改配置动态生效(无需重启)。Nacos Config、Apollo、Consul Key/Value 都是主流。

Apollo 示例:

@Value("${timeout:100}")
private int timeout;

// 配置自动热更新
@ApolloConfigChangeListener
public void onChange(ConfigChangeEvent changeEvent) {
    // 刷新相关 Bean
}

8.3 服务调用与负载均衡
除了 RestTemplate + Ribbon,也可以使用声明式 HTTP 客户端 Feign:

@FeignClient(name = "user-service", fallback = UserFallback.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable("id") Long id);
}

8.4 熔断、降级、限流 —— Hystrix / Sentinel
这三种手段是保障分布式系统韧性的核心模式。

熔断(Circuit Breaker)
当某个服务调用失败率达到阈值(如 50%),断路器打开,后续请求直接快速失败或走降级逻辑,避免级联故障。经过一段时间,允许少量请求通过测试服务是否恢复(半开状态)。

降级(Fallback)
当服务不可用或系统负载过高时,提供有损的替代响应(如返回缓存数据、友好提示)。降级可在客户端或服务端实现。

限流(Rate Limiting)
限制单位时间内的请求数量,超过阈值则拒绝服务(返回 429 Too Many Requests)或排队等待。常见算法:令牌桶、漏桶、计数器。

Sentinel 实战

@SentinelResource(value = "getUser", blockHandler = "handleBlock", fallback = "getUserFallback")
public User getUser(Long id) {
    // 业务逻辑
}

public User handleBlock(Long id, BlockException ex) {
    // 限流或熔断时的处理
    return new User(-1L, "系统繁忙");
}

public User getUserFallback(Long id, Throwable t) {
    // 所有异常的处理(包括业务异常)
    return new User(-1L, "服务降级");
}

配置限流规则:

List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("getUser");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(100);  // 每秒 100 QPS
rules.add(rule);
FlowRuleManager.loadRules(rules);

来源:
https://rvtst.cn/

相关文章
|
1月前
|
SQL 安全 算法
软件开发进阶技能之性能与安全调优(四)
本节聚焦安全调优:严守最小权限原则,缩减攻击面。涵盖SQL注入(禁用拼接,用PreparedStatement/MyBatis #{})、XSS(输出编码+框架自动转义)、命令注入(白名单校验);JWT安全(强密钥、合理过期、防算法混淆);会话固定防护与bcrypt加盐哈希密码存储。
|
1月前
|
消息中间件 NoSQL 中间件
软件开发进阶技能之分布式与高并发(二)
教程来源 https://oplhc.cn/ 消息队列(MQ)是分布式系统核心中间件,以异步通信实现服务解耦、流量削峰与最终一致性。支持可靠投递、幂等消费与死信处理,广泛应用于秒杀、日志收集等高并发场景。
|
1月前
|
Prometheus 监控 NoSQL
软件开发进阶技能之分布式与高并发(五)
教程来源本节详解高并发秒杀系统设计与可观测性实践:通过CDN静态化、Redis原子扣减、MQ异步下单、唯一键防重等实现抗洪峰、零超卖;并集成Prometheus监控、SkyWalking链路追踪、ELK日志分析,构建完整可观测体系。
|
1月前
|
SQL 监控 关系型数据库
软件开发进阶技能之数据库进阶(五)
教程来源 https://zlpow.cn/ 本节详解数据库高可用核心方案:主从复制(异步/半同步原理、搭建与延迟治理)、自动故障转移(MHA/Orchestrator)及读写分离实践,并涵盖监控指标、慢查询分析与配置调优,助力系统稳定扛住高并发。
|
7月前
|
SQL 监控 测试技术
2025年数据库性能压测工具对比与重点测试方案选型指南
文章围绕2025年数据库性能压测展开,介绍主流方案分为SaaS化平台、自建工具和一体化服务三类,对比它们在成本、易用性等方面的差异。阐述行业背景、趋势、核心问题与挑战,给出不同场景下的选型建议及最佳实践路径,还解答了常见选型问题。
|
1月前
|
移动开发 安全 开发工具
阿里云实人认证对接使用完全指南:从产品选型到代码落地
本文提供一份完整的阿里云实人认证对接使用指南。首先梳理了产品家族的核心差异,重点聚焦当前主售的金融级实人认证,涵盖实人认证方案、活体人脸验证方案、多因子意愿认证方案等多种产品方案的适用场景。接着详细拆解了从开通服务、创建RAM子账号、配置认证场景到实际接入的完整流程,核心部分分别讲解了App SDK接入和H5网页接入两大场景的时序与代码实现,给出了Java服务端、Python服务端以及Android客户端集成的完整示例。同时深入探讨了生产环境的安全加固策略,包括RAM最小权限授权、参数传输加密和敏感信息脱敏处理。最后梳理了计费逻辑、常见报错排查思路以及最佳实践建议,帮助开发者从零到一顺利完成与
|
1月前
|
存储 监控 开发工具
阿里云日志服务SLS全流程对接与深度使用指南
本文是一篇详尽的阿里云日志服务SLS技术科普文章,从核心概念、服务开通、资源创建、数据采集、SDK集成、查询分析、可视化告警、安全权限到成本优化,全面讲解SLS的对接与使用。文章包含Logtail采集、Python/Java SDK代码示例、SPL与SQL查询等实操内容,帮助用户从零构建企业级日志管理平台,实现日志的统一归集、实时分析与智能运维。
|
1月前
|
缓存 人工智能 API
阿里云百炼Token Plan团队版与Coding Plan核心差异全解析 附团队版全场景常见问题完整答疑
随着大模型在研发、办公、企业自动化场景常态化落地,不同使用者群体的算力消耗特征出现明显分化:数十人多岗位协同的企业团队,存在多角色额度分配、跨业务线统一计费、月度预算锁定、高峰算力保障等综合管理需求;而独立程序员、外包开发小组、学生研发爱好者,绝大多数算力消耗集中在代码生成、调试、项目重构、脚本编写等开发场景,对文档分析、多模态图文处理需求极低,更看重轻量化低价订阅、代码专属折扣、编程工具配套权益。
321 0
|
1月前
|
人工智能 自然语言处理 物联网
阿里云百炼大模型服务平台模型部署指南:流程与常见问题
阿里云百炼大模型部署流程参考,涵盖三种计费方式(预置吞吐PTU、模型单元、Token用量)的对比与适用场景,本文说明了各计费模式的费用计算、扩缩容规则及产品约束。部署后可通过OpenAI兼容接口、DashScope及Assistant SDK调用,并提供了代码示例。文章还解答了自有模型上传、权限不足、计费切换等常见问题。此外,2026年阿里云推出多项AI优惠:Qwen3.7-Max限时5折、HappyHorse视频模型8折、Token Plan多档套餐,以及轻量应用服务器38元/年起等云产品普惠权益,助力用户低成本落地AI应用。
|
1月前
|
人工智能 Java 应用服务中间件
AgentForge —— 让一句话变成一个生产可用的 Agent
AgentForge是阿里飞猪自研的“Agent工厂”平台,支持非技术同学5分钟零代码造出真Loop Agent,Node/Java工程师可直接部署生产级Agent团队。平台内置ANVIL框架、FECHO网关、fliggy-memory-sdk等核心技术,打通BUC鉴权、Aone容器、钉钉、SchedulerX等集团生态,实现“一句话描述→自动装备→云端运行→多Agent编排”全链路闭环。
495 1