02|Nacos 内核拆一拆:Distro、Raft、长轮询到底在干啥

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 本文是Nacos原理实践笔记的第二篇,聚焦“为什么这样设计”。清晰剖析Nacos双内核本质:服务发现(AP,Distro协议)追求高可用与最终一致;配置管理(CP,Raft协议)保障强一致性。详解长轮询推送、临时/持久实例差异、客户端本地缓存等关键机制,揭示其务实、分场景、重落地的设计哲学。(239字)

系列:Nacos 三篇实践笔记
上一篇:[01|重新拾起 Nacos:为啥团队最后还是回到了它]
下一篇:[03|Nacos 生产落地:多环境、踩坑、和 3.0 的 AI Registry 演进]
这一篇专门讲原理。不深挖代码,但把"为啥这样设计"讲透。

image.png

一、想用好 Nacos,先认清它在干两件不同的事

很多人对 Nacos 的认知是"一个工具"。其实它内部干的是两件性质完全不同的活:

  • 服务注册与发现:要快、要可用,丢一两条问题不大。
  • 配置管理:可以慢一点,但绝对不能丢

这两件事天然要不同的一致性策略。Nacos 的内核就是按这个差异分两套的:

模块 一致性 协议 典型 CAP 取舍
服务发现 最终一致 Distro(Nacos 自研) AP
配置管理 强一致 Raft(JRaft 实现) CP

image.png

把这张图刻在脑子里,后面所有东西都好理解了。


二、Distro:服务发现为啥默认用 AP

为啥不用强一致?

服务实例很多,上下线频繁。如果每次上线都要走 Raft 那种"多数派确认",集群压力会非常大。

更何况,服务发现的容错点很特殊:

  • 多一个实例,最多多一次失败重试
  • 少一个实例,最多少处理一段时间流量

短时间不一致,对业务体感几乎没影响。所以这里没必要用 CP

Distro 怎么干

Distro 是 Nacos 自己写的协议,思路非常实用:

  1. 责任分片。每个 Nacos 节点只负责一部分服务实例的"权威数据"。
  2. 本地写、异步同步。客户端注册到任意节点,节点先本地写再异步广播给其他节点。
  3. 最终一致。一段时间内集群内同一服务实例视图会收敛。
  4. 节点故障可恢复。某节点挂了,它负责的实例数据由其他节点接管,重启后可重新拉取。

image.png

我喜欢这个设计的一点:它承认了"服务发现是 AP 场景"这件事,没有为了强一致硬上 Raft


三、Raft:配置中心为啥要 CP

配置就不一样了。

想象一个场景:你在控制台里把一个核心限流值从 1000 改到 100。如果 Nacos 集群在这一刻不一致,部分节点收到了新值,部分节点还是老值——

客户端从不同节点拉到的配置不一样,业务行为开始飘。

这种情况比"多一个老实例"严重得多。所以配置中心必须 CP,写入要在多数派确认成功之后才算成功。

Nacos 配置中心走的是 JRaft,就是把 Raft 协议工程化的版本:

image.png

几个工程上的细节我必须讲清楚:

  1. 必须 ≥ 3 节点。Raft 要选举,2 节点没法选。
  2. 写都走 Leader。Follower 收到写请求会转发或拒绝。
  3. Leader 挂了会重新选。选举期间短暂不可写,是正常的。
  4. 配置存到 MySQL。Nacos 配置最终落库(默认 MySQL),Raft 是协调一致性,不是存储。

这套是教科书级 CP 实现。别想着 2 节点跑 Nacos 配置中心,工程上是错的。


四、配置推送:长轮询,不是 WebSocket

我做技术选型时一度以为 Nacos 推配置走的是 WebSocket。
不是

它用的是 长轮询(long polling)。流程大致是这样:

image.png

为什么用长轮询而不是 WebSocket?

  1. 简单。HTTP 协议,所有 SDK 都好实现,运维和网关压力小。
  2. 穿透网络很容易。WebSocket 在某些企业网络要做协议升级,长轮询就是普通 HTTP。
  3. 效果接近实时。客户端拿到变更通常在 1 秒内,业务体感就是"实时推送"

很多教程会写"Nacos 是推送的",严格说不准确。它实际是 long-polling 模拟出来的"准实时"。 但效果上没差,工程上更稳。


五、临时实例 vs 持久实例:上一篇埋的坑现在拆开讲

上一篇我提了一句:"Nacos 默认是临时实例,假死会有坑"。这里展开。

两种实例的差别

类型 心跳保活 服务端剔除 用途
临时实例(默认) 客户端心跳 心跳超时即剔除 业务微服务
持久实例 不靠心跳 服务端主动健康检查 网关、固定基础设施

假死场景为啥危险

业务微服务默认临时。问题是:

  • 进程没有完全死,心跳线程还在跑
  • 但业务线程已经卡住,处理不了请求
  • Nacos 那边看:心跳正常,实例健康
  • 流量继续打过去 → 大量超时

image.png

怎么治

我自己常用的几招:

  1. 配合健康检查 / Readiness 探针。让 K8s 或网关自己判健康,不光信 Nacos。
  2. 关键基础设施改持久实例。比如内部网关、定时任务调度器,这些"挂了大家都受影响"的东西,让 Nacos 主动检查。
  3. 下游做熔断。再好的注册中心也不能保证 100% 准确,下游必须有熔断兜底。

这一条要刻进团队 SOP:注册中心是辅助,不能替代调用方的容错


六、客户端缓存:Nacos 挂了为啥还能撑一阵

很多人不知道:Nacos 客户端默认会把服务列表和配置缓存到本地磁盘

这意味着什么?

  • Nacos 集群整体挂掉,业务短时间还能用旧的服务列表和配置撑一会儿
  • 服务重启时,如果连不上 Nacos,会读本地快照拉起来。

这是 Nacos 在 AP 路上做的另一手保险。

但要注意:

  • 缓存的是上一次的快照,不是最新。
  • 新实例上下线、配置变更,在 Nacos 全挂期间无法感知。

线上排查时,"为啥 Nacos 挂了一会儿业务居然没事",原因经常就是这个缓存。


七、把这几块拼起来看 Nacos 的"性格"

把这一篇的几件事拼到一起,Nacos 的内核性格就出来了:

image.png

可以用一句话概括它的设计哲学:

能 AP 就 AP,必须 CP 才 CP;写得快、推得近实时、客户端兜得住。

这个性格放在今天的微服务体系里非常合适。它没有去抢 Kafka、Etcd、ZooKeeper 各自擅长的领地,而是把"服务和配置"这两件最高频的事做扎实。


八、看完原理,对接入有什么启发

读完原理我自己改了几个习惯:

  1. 不再去纠结"Nacos 是 AP 还是 CP"。它两边都是,看你用哪一块。
  2. 配置中心至少 3 节点。这不是建议,是底线。
  3. 业务侧默认要做熔断。注册中心永远不能 100%。
  4. 临时实例假死要靠 K8s 探针 + 熔断双保险
  5. 配置走 long-polling 没问题,但本地缓存要懂,否则会被"看起来推送了实则缓存"骗到。

这些不是新东西,但你只有理解了机制,才会自然把这些动作做出来,而不是靠"踩一个坑学一句"。


九、总结:内核不复杂,但每一步都很务实

Nacos 的内核没有那种让人眼前一亮的算法。

它做的事更像一个老练工程师写出来的东西:

  • 该选 AP 选 AP
  • 该选 CP 选 CP
  • 推送做不到真推就用 long-polling 拟一个
  • 客户端做缓存兜底
  • 实例分临时和持久应对不同生命周期

每一步都对一线工程问题有清楚回应。这就是为什么它能撑住国内绝大多数互联网公司的微服务底座。

下一篇我会把它真正放进生产环境:多环境怎么切、集群怎么搭、踩过哪些坑、Nacos 3.0 加进来的 AI Registry / MCP 管理到底意味着什么。


上一篇:[01|重新拾起 Nacos:为啥团队最后还是回到了它]
下一篇:[03|Nacos 生产落地:多环境、踩坑、和 3.0 的 AI Registry 演进]

目录
相关文章
|
4天前
|
人工智能 Kubernetes 调度
AgentTeams 和 Claude Tag 都进入群聊模式,是新范式还是新叙事?
AgentTeams 和 AgentLoop 均处于邀测期,欢迎感兴趣的朋友申请测试。
|
4天前
|
人工智能 数据挖掘 测试技术
阿里云 Qoder 全系接入千问 Qwen3.7:夜间 Night Plan 折扣全解析
2026年阿里云完成Qoder全系产品对Qwen3.7系列模型的适配接入,并同步推出Night Plan夜间错峰计费机制,依托低谷空闲算力给出高额折扣,其中旗舰Qwen3.7 Max夜间仅2折,Qwen3.7 Plus夜间4折,使用最高可节省80%算力消耗成本。同时百炼平台面向新用户开放100万免费Tokens额度,个人开发者、企业团队可结合免费额度与夜间双重优惠,大幅降低代码重构、数据分析、长文档处理等高消耗任务开销。
143 0
|
4天前
|
Web App开发 SQL 人工智能
Addy Osmani 的 agent-skills 爆火:AI 编码终于开始从“会写代码”走向“按工程流程做事”
Addy Osmani(Chrome 工程负责人)推出的 agent-skills 仓库,将24个生产级工程实践(代码审查、性能优化、安全检查等)封装为可复用AI技能,赋能Copilot/Claude/Cursor等工具按规范流程协作,推动AI编码从“写代码”迈向“可信工程交付”。
58 0
Addy Osmani 的 agent-skills 爆火:AI 编码终于开始从“会写代码”走向“按工程流程做事”
|
4天前
|
JSON 算法 中间件
把 Headroom 的 SmartCrusher 拆开看了一眼,它根本不是在压 JSON
本文深度解析 Headroom 的核心压缩器 SmartCrusher(位于 `headroom-core/src/transforms/smart_crusher/`),揭示其与传统 zstd 的本质差异:不拼字节重复,而专注识别 LLM 无需阅读的冗余数据。通过 Lossless-First 策略、统计语义分析、变点保留、错误/离群硬约束及可逆 CCR 机制,实现语义级智能压缩——省 token 而不损关键信息。(239 字)
122 0
|
4天前
|
存储 缓存 运维
给 SRE agent 加"长记忆":我自己写一套,对比 Headroom 的 SharedContext 和 Learn
本文介绍为SRE Agent构建“长记忆”能力的实践:自研轻量级故障经验库`incident-kb`(SQLite+向量检索),专注存储结构化故障案例(症状指纹/根因/处置等),强调人工审核入库、告警入口实时注入。对比Headroom的SharedContext(存工作杂事)与Learn(提炼规则),三者定位不同、互不可替代,需分层建设。
38 0
|
4天前
|
人工智能 开发工具 git
02|拆 loopat 架构:Loop、Sandbox、Vault 到底解决了什么
本文是《loopat三篇实践笔记》的第二篇,深入剖析其核心架构设计:Loop(可复现工作现场)、Sandbox(沙箱隔离)、Vault(凭据分层)、Git worktree(任务边界)等,揭示其为何拒绝简单聊天式Agent,转而构建可审计、可沉淀、可协作的AI操作系统雏形。(239字)
47 1
|
4天前
|
Rust NoSQL 中间件
不抄代码只抄脑子:照着 SmartCrusher 给我那个 SRE agent 写了个压缩中间件
本文介绍为SRE场景定制的轻量级LLM输入压缩中间件`crusher-lite`:基于SmartCrusher思想,摒弃Rust/Python混合架构与复杂模型,仅用300行纯Python实现五大核心策略——无损改写优先、数据分布识字段、变点保留、错误硬保留、本地LRU版CCR兜底。专插于tool层,压缩比达78%~83%,零外部依赖,合规易审,月省成本超6000元。(239字)
60 0
不抄代码只抄脑子:照着 SmartCrusher 给我那个 SRE agent 写了个压缩中间件
|
4天前
|
人工智能 JSON NoSQL
蹲了一个偏冷门的 OpenSRE:让 LLM 别再"建议",直接吐工单
OpenSRE(Tracer-Cloud/opensre)是一个专注SRE事故调查的开源AI Agent框架,摒弃LLM模糊的“散文式建议”,强制输出带证据链、可执行字段的结构化工单(JSON),直连PagerDuty/Jira等系统。采用LangGraph编排、PostgreSQL+Redis,强调可观测性与生产可靠性,是AI从“副驾”迈向“工单生成器”的关键实践。(239字)
74 0
蹲了一个偏冷门的 OpenSRE:让 LLM 别再"建议",直接吐工单
|
4天前
|
数据库 数据安全/隐私保护
如何注册阿里云账号?最新阿里云账户注册流程及实名认证教程(个人和企业适用)
阿小云分享的通过手机号短信验证的方式注册阿里云账号,账号实名认证及免费上云权益领取指南,一个手机号码最多可以注册6个阿里云账号,阿里云官方活动:https://t.aliyun.com/U/OTnSAH
|
4天前
|
人工智能 安全 API
不仅听懂,更能干活:看张之阳如何让 Agent 安全接管智能家居
本文介绍七牛云工程师张之阳基于OpenClaw+Home Assistant打造的智能家居Agent实践:让AI理解“朋友来家调灯光”等模糊指令,通过统一API层、状态回查与安全边界设计,实现从对话到真实系统执行的完整闭环,探索AI落地生产力的关键工程路径。