当前位置: 首页 > news >正文

分布式系统设计(架构能力)

一、微服务架构
  1. 服务治理

    • Nacos 注册中心(AP模式)

      • CAP选择:Nacos 默认采用 AP 模式(可用性 + 分区容忍性),通过心跳检测实现服务健康管理。
      • 服务发现:客户端定时拉取服务列表,支持权重路由和元数据过滤。
      • 配置管理:通过 dataId 和 group 动态推送配置,支持灰度发布。
    • Sentinel 熔断规则持久化

      • 规则存储:将流控、熔断规则持久化到 Nacos/ZooKeeper,避免重启丢失。
      • 动态更新:通过 DataSource 接口监听配置中心变化,实时生效。
      // 示例:Sentinel 规则持久化到 Nacos 
      ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>( nacosServerAddr, groupId, dataId, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}) ); FlowRuleManager.register2Property(flowRuleDataSource.getProperty());

  2. 分布式事务

    • Seata AT模式

      • 两阶段流程
        1. 一阶段:执行业务 SQL,生成 UNDO_LOG(数据快照)。
        2. 二阶段:提交时删除 UNDO_LOG;回滚时通过 UNDO_LOG 恢复数据。
      • 全局锁:TC(事务协调器)通过全局锁避免脏写。
    • 最大努力通知型事务

      • 适用场景:跨系统最终一致性(如支付成功后通知商户)。
      • 实现步骤
        1. 本地事务提交后,异步发送通知消息。
        2. 消息队列保证至少一次投递,接收方需幂等处理。
  3. 网关设计

    • Spring Cloud Gateway 过滤器链

      • 核心过滤器
        • GlobalFilter:全局过滤(如鉴权、日志)。
        • GatewayFilter:路由级过滤(如添加请求头)。
      • 自定义过滤器
        @Component 
        public class AuthFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { if (!checkAuth(exchange.getRequest())) { return exchange.getResponse().setComplete(); // 拦截 } return chain.filter(exchange); } }

    • 动态路由配置

      • 基于Nacos:监听 Nacos 配置变化,刷新路由表。
      • API 动态更新:通过 RouteDefinitionRepository 接口实现。

二、中间件核心
  1. Redis

    • 集群模式

      • Cluster分片
        • 16384个哈希槽,每个节点负责部分槽位。
        • 客户端路由:通过 CRC16(key) % 16384 计算槽位。
      • Codis方案
        • 代理层(Codis-Proxy)负责分片,依赖 ZooKeeper 维护元数据。
    • 持久化策略

      • RDB:定时快照,恢复快但可能丢失数据。
      • AOF:追加日志,数据安全但文件较大。
      • 混合模式:RDB 全量 + AOF 增量(Redis 4.0+)。
    • 缓存问题解决方案

      • 穿透:布隆过滤器(RedissonBloomFilter)拦截无效请求。
      • 击穿:互斥锁(SET key value NX PX 3000)防止并发重建。
      • 雪崩:随机过期时间(基础过期时间 + 随机偏移量)。
  2. Kafka

    • ISR机制

      • In-Sync Replicas:与 Leader 保持同步的副本集合。
      • Leader选举:当 Leader 失效时,从 ISR 中选择新 Leader。
    • 零拷贝技术

      • sendfile系统调用:数据直接从磁盘文件传输到网卡,绕过用户态。
    • Exactly-Once语义

      • 幂等生产者:通过 PID + Sequence Number 去重。
      • 事务消息:跨分区原子性写入(需配合事务协调器)。
  3. RocketMQ

    • 事务消息流程

      1. 发送半消息(对消费者不可见)。
      2. 执行本地事务,提交或回滚。
      3. Broker 根据事务状态提交或丢弃消息。
    • 顺序消息实现

      • MessageQueueSelector:通过相同选择策略(如订单ID哈希)将消息发送到同一队列。
      • 消费者单线程顺序消费。

三、高可用设计
  1. 限流降级

    • 滑动窗口算法

      • 实现:将时间划分为多个小窗口,统计窗口内请求量。
      • 优势:比固定窗口更平滑,避免临界突发流量。
    • 令牌桶实现(Resilience4j)

      // 配置每秒10个令牌 
      RateLimiterConfig config = RateLimiterConfig.custom()                     .limitRefreshPeriod(Duration.ofSeconds(1)) .limitForPeriod(10) .build(); 
      RateLimiter limiter = RateLimiter.of("apiLimiter", config);

  2. 容灾方案

    • 同城双活

      • 数据同步:基于数据库主从复制或 DRBD 块级同步。
      • 流量切换:DNS 或负载均衡器(如 Nginx)切换流量。
    • 异地多活

      • 单元化路由:按用户 ID 哈希路由到指定机房(如用户A固定访问北京机房)。
      • 数据最终一致:通过消息队列异步同步数据。
  3. 压测实战

    • JMeter全链路压测

      1. 脚本录制:使用 JMeter 代理服务器录制用户操作。
      2. 参数化:CSV 文件驱动多用户登录(不同账号)。
      3. 分布式压测:控制机(Master)调度多台压力机(Slave)。
      4. 监控指标:TPS、响应时间、错误率、资源利用率(CPU/内存)。
    • 结果分析

      • 瓶颈定位:数据库慢 SQL、线程池满、缓存命中率低。
      • 优化建议:增加索引、调整线程池参数、预热缓存。

四、总结与实战案例

案例:电商大促系统设计

  • 挑战:秒杀场景下的高并发(10万QPS)、数据一致性。
  • 解决方案
    1. 流量削峰:MQ 队列缓冲请求,异步处理订单。
    2. 库存扣减:Redis Lua 脚本保证原子性,异步同步到数据库。
    3. 降级策略:核心功能(下单)优先,非核心功能(推荐)降级。

通过深入理解上述技术点,并结合实际场景灵活运用,能够设计出高可用、可扩展的分布式系统。

相关文章:

分布式系统设计(架构能力)

一、微服务架构 服务治理 Nacos 注册中心&#xff08;AP模式&#xff09; CAP选择&#xff1a;Nacos 默认采用 AP 模式&#xff08;可用性 分区容忍性&#xff09;&#xff0c;通过心跳检测实现服务健康管理。服务发现&#xff1a;客户端定时拉取服务列表&#xff0c;支持权重…...

171. Excel 表列序号

Excel 表列序号 题目描述尝试做法推荐做法 题目描述 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如&#xff1a; A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 1: 输入: colum…...

在 Java 中使用 Apache POI 为 Word 文档添加水印

在 Java 中使用 Apache POI 为 Word 文档添加水印 在日常办公中&#xff0c;我们经常需要给 Word 文档添加水印&#xff0c;以标明文件的机密性或归属权。本文将介绍如何使用 Apache POI 库在 Java 中给 Word 文档添加水印。 技术栈 Apache POI&#xff1a;用于操作 Word 文…...

贪心算法二

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…...

【大模型安全】大模型的技术风险

【大模型安全】大模型的技术风险 1.DDoS攻击2.常见的传统网络攻击方式3.恶意意图的识别4.AI生成虚假信息传播5.利用AI进行黑客攻击6.模型对抗攻击7.后门攻击8.Prompt攻击9.数据投毒攻击10.模型窃取攻击11.数据窃取攻击 1.DDoS攻击 2023年11月9日凌晨&#xff0c;OpenAI在官网公…...

Java 线程池中 shutdown 与 shutdownNow 的区别是什么?

Java 线程池中 shutdown 与 shutdownNow 的区别 核心行为差异 | 方法 | 行为描述 | |----------------|----------------------------------------------------------------------------| | shutdown | 平缓关闭线程池&#xff1a;1. 停止接受新任务。2. 已提交的任务&#xff…...

基于Spring Boot的共享学习经验系统的设计与实现

目录 摘 要 第1章 绪论 1.1研究背景与意义 1.2国内外现状 1.3研究目标 第2章 需求分析 2.1业务需求 2.1.1业务概述 2.1.2业务流程 2.2.1用例概述 2.2.2用例描述 2.3非功能性需求 第3章 系统设计 3.1技术路线 3.2系统功能模块设计 3.3系统架构 3.4数据库设计 3.4.1概念结构设…...

【简单的C++围棋游戏开发示例】

C围棋游戏开发简单示例&#xff08;控制台版&#xff09; ‌核心代码实现‌ #include <iostream> #include <vector> #include <queue> using namespace std;const int SIZE 9; // 简化棋盘为9x9‌:ml-citation{ref"1" data"citationList&…...

单片机中的基础外设GPIO的知识和应用—(6)

GPIO&#xff08;通用输入输出&#xff09;是单片机与外部世界交互的重要接口。单片机的GPIO引脚可以灵活配置为输入、输出、中断或复用功能&#xff0c;广泛应用于LED控制、按键读取、传感器通信等场景。下文以STM32F103C8T6的GPIO为例。有些51单片机IO功能有的稍微有不同&…...

10-Agent循环分析新闻并输出总结报告

目录 关键词 摘要 速览 自动新闻总结与行业分析报告生成流程 创建深度行业分析报告的工作流 测试用例执行与调试 业务逻辑与循环处理任务 演示如何在循环体中添加链接读取工具 使用大模型处理和分析新闻信息 构建循环分析新闻并生成综合报告的流程 分析和优化慢速循…...

十二、Redis Cluster(集群)详解:原理、搭建、数据分片与读写分离

Redis Cluster(集群)详解:原理、搭建、数据分片与读写分离 Redis Cluster 是 Redis 官方提供的分布式存储方案,通过数据分片(Sharding)实现 水平扩展(scalability),并提供 高可用性(HA) 和 故障自动转移(failover) 能力,解决了单机 Redis 内存受限、主从复制故障…...

贪心算法解题框架+经典反例分析,效率提升300%

贪心算法是一种在每一步选择中都采取当前状态下的最优决策&#xff0c;从而希望最终达到全局最优解的算法策略。以下从其定义、特点、一般步骤、应用场景及实例等方面进行讲解&#xff1a; 定义与基本思想 • 贪心算法在对问题求解时&#xff0c;总是做出在当前看来是最好的选…...

策略设计模式-下单

1、定义一个下单context类 通过这类来判断具体使用哪个实现类&#xff0c;可以通过一些枚举或者条件来判断 import com.alibaba.fastjson.JSON; import com.tc.common.exception.BusinessException; import com.tc.common.user.YjkUserDetails; import com.tc.institution.cons…...

Go加spy++隐藏窗口

最近发现有些软件的窗口就像狗皮膏药一样&#xff0c;关也关不掉&#xff0c;一点就要登录&#xff0c;属实是有点不爽了。 窗口的进程不能杀死&#xff0c;但是窗口我不想要。思路很简单&#xff0c;用 spy 找到要隐藏的窗口的句柄&#xff0c;然后调用 Windows 的 ShowWindo…...

React基础之tsx语法

tsx在jsx的基础上添加了新的类型&#xff0c;除此之外没有任何区别 事件绑定 function App() { const handleClick()>{ console.log(button被点击了); } return( <div className"App"> <button onClick{handleClick}>click me</button> </di…...

一体机:DeepSeek性能的“隐形枷锁”!

一体机是DeepSeek交付的最佳方式吗&#xff1f; 恰恰相反&#xff0c;一体机是阻碍DeepSeek提升推理性能的最大绊脚石。 为啥&#xff1f; 只因DeepSeek这个模型有点特殊&#xff0c;它是个高稀疏度的MoE模型。 MoE这种混合专家模型&#xff0c;设计的初衷是通过“激活一堆专…...

ALBEF的动量蒸馏(Momentum distillation)

简单记录学习~ 一、‌传统 ITC Loss 的局限性‌ ‌One-Hot Label 的缺陷‌ 传统对比学习依赖严格对齐的图文对&#xff0c;通过交叉熵损失&#xff08;如 softmax 归一化的相似度矩阵&#xff09;强制模型将匹配的图文对相似度拉高&#xff0c;非匹配对相似度压低‌11。但 one…...

浏览器WEB播放RTSP

注意&#xff1a;浏览器不能直接播放RTSP&#xff0c;必须转换后都能播放。这一点所有的播放都是如此。 参考 https://github.com/kyriesent/node-rtsp-stream GitHub - phoboslab/jsmpeg: MPEG1 Video Decoder in JavaScript 相关文件方便下载 https://download.csdn.net…...

将PDF转为Word的在线工具

参考视频&#xff1a;外文翻译 文章目录 一、迅捷PDF转换器二、Smallpdf 一、迅捷PDF转换器 二、Smallpdf...

03. 对象的创建,存储和访问原理

文章目录 01. 对象创建1.1 创建过程概览1.2 类加载检查1.3 为对象分配内存1.4 将内存空间初始化为零值1.5 设置对象的必要信息1.6 总结 02. 对象的内存布局2.1 对象头区域2.2 实例数据区域2.3 对齐填充区域2.4 总结 03. 对象的访问定位其他介绍01.关于我的博客 注&#xff1a;读…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

flow_controllers

关键点&#xff1a; 流控制器类型&#xff1a; 同步&#xff08;Sync&#xff09;&#xff1a;发布操作会阻塞&#xff0c;直到数据被确认发送。异步&#xff08;Async&#xff09;&#xff1a;发布操作非阻塞&#xff0c;数据发送由后台线程处理。纯同步&#xff08;PureSync…...