<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>随心笔记 Blog</title>
        <link>https://tanzhuo.xyz/</link>
        <description>随心笔记 Blog</description>
        <lastBuildDate>Fri, 03 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <item>
            <title><![CDATA[从容器云到智能云]]></title>
            <link>https://tanzhuo.xyz/2026/04/03/dang-ai-xue-hui-gan-zhi-zi-ji</link>
            <guid>https://tanzhuo.xyz/2026/04/03/dang-ai-xue-hui-gan-zhi-zi-ji</guid>
            <pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[在 AI 智能体（Agent）系统快速发展的今天，单个智能体已经不够用了。我们需要的是多智能体协作、可观测执行轨迹、安全副作用治理，以及在分布式环境下的可靠调度。]]></description>
            <content:encoded><![CDATA[<p>在 AI 智能体（Agent）系统快速发展的今天，单个智能体已经不够用了。我们需要的是<strong>多智能体协作</strong>、<strong>可观测执行轨迹</strong>、<strong>安全副作用治理</strong>，以及在分布式环境下的可靠调度。</p>
<!-- -->
<p>OpenClaw 在 gateway、tools、sessions 和本地多智能体路由上表现出色，但面对大规模协作、跨节点调度和操作者可见性时仍有短板。而类似 golutra 的编排与 trace 能力，又提供了宝贵的补充。</p>
<p>本文提出一个演进架构：<strong>将 Kubernetes 作为坚实底座，在其之上构建一个专为 AI 设计的控制平面</strong>——我们称之为 <strong>Kubernetes AI OS</strong>。它不替代 Kubernetes，而是将其视为基础设施层，新增智能体运行时、执行调度、能力发现、副作用治理和跨节点协同等能力。</p>
<p><img decoding="async" loading="lazy" src="https://tanzhuo.xyz/assets/images/2026-04-Gemini_Generated_Image_xonbpixonbpixonb-c7b4a8c8648cceb82c3292ec7ce19fe8.webp" width="1600" height="873" class="img_ev3q"></p>
<p><strong>Kubernetes AI OS：让 Kubernetes 成为 AI 智能体的原生控制平面</strong></p>
<p>在 AI 多智能体系统越来越复杂的今天，单节点运行时已经不够。我们需要一个能支持协作、可观测、安全调度，并且真正面向操作者的执行系统。</p>
<p>基于 OpenClaw 的 gateway runtime，我提出一个演进方向：在 <strong>Kubernetes 之上构建一个 AI 控制平面</strong>，称为 <strong>Kubernetes AI OS</strong>。</p>
<p>它不替代 Kubernetes，而是把 Kubernetes 当作坚实的底座，新增专为 AI 设计的智能体运行时、执行调度、副作用治理和跨节点协同能力。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么需要这个架构"><strong>为什么需要这个架构？</strong><a href="https://tanzhuo.xyz/2026/04/03/dang-ai-xue-hui-gan-zhi-zi-ji#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81%E8%BF%99%E4%B8%AA%E6%9E%B6%E6%9E%84" class="hash-link" aria-label="为什么需要这个架构的直接链接" title="为什么需要这个架构的直接链接" translate="no">​</a></h2>
<p>OpenClaw 目前在 channels、tools、sessions 和本地多智能体路由上很强，但在大规模协作、执行轨迹审计、跨节点放置上还有明显短板。</p>
<p>我们希望融合：</p>
<ul>
<li class="">OpenClaw 的南向集成和 agent runtime</li>
<li class="">类 golutra 的执行轨迹与可视化能力</li>
<li class="">Kubernetes 的生命周期、调度和故障恢复能力</li>
</ul>
<p>核心理念只有一句话：<strong>执行必须可见、可检查、可归因</strong>。没有清晰的执行账本，多智能体系统很容易变成黑盒。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="设计目标"><strong>设计目标</strong><a href="https://tanzhuo.xyz/2026/04/03/dang-ai-xue-hui-gan-zhi-zi-ji#%E8%AE%BE%E8%AE%A1%E7%9B%AE%E6%A0%87" class="hash-link" aria-label="设计目标的直接链接" title="设计目标的直接链接" translate="no">​</a></h2>
<ul>
<li class="">支持单节点内多智能体清晰协作</li>
<li class="">支持跨节点的工作流级调度</li>
<li class="">节点可自动加入、隔离、恢复</li>
<li class="">用小模型辅助角色推荐，但高风险决策必须走策略面</li>
<li class="">所有有意义的动作都要进统一执行账本</li>
<li class="">清晰分离控制面、执行面、可观测面和策略面</li>
</ul>
<p><strong>不做的事</strong>：不替换 Kubernetes 原生调度，不允许智能体无限制自由聊天，不让模型直接决定提权或拓扑变更等高危操作。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="六层架构概览"><strong>六层架构概览</strong><a href="https://tanzhuo.xyz/2026/04/03/dang-ai-xue-hui-gan-zhi-zi-ji#%E5%85%AD%E5%B1%82%E6%9E%B6%E6%9E%84%E6%A6%82%E8%A7%88" class="hash-link" aria-label="六层架构概览的直接链接" title="六层架构概览的直接链接" translate="no">​</a></h2>
<p>系统分为六层，责任边界清晰：</p>
<ul>
<li class=""><strong>Southbound Gateway Layer</strong>：沿用 OpenClaw 的 channel、tool、session 接入能力</li>
<li class=""><strong>Execution Kernel</strong>：核心执行层，管理 Run → Flow → Step → SideEffect 全生命周期</li>
<li class=""><strong>Cluster Mesh</strong>：负责节点注册、能力发布、step 调度和安全隔离（不鼓励节点间自由聊天）</li>
<li class=""><strong>Observability Plane</strong>：统一执行账本，提供 runs、flows、steps、side effects 的可视化视图</li>
<li class=""><strong>Cognition Plane</strong>：用小模型做 workload 识别、角色推荐、状态总结</li>
<li class=""><strong>Policy Plane</strong>：负责安全审批、secret 作用域、side-effect 治理和信任检查</li>
</ul>
<p>控制面决定“什么该跑、在哪跑、按什么策略跑”；执行面负责真正执行并产生 trace。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="单节点多智能体运行时"><strong>单节点多智能体运行时</strong><a href="https://tanzhuo.xyz/2026/04/03/dang-ai-xue-hui-gan-zhi-zi-ji#%E5%8D%95%E8%8A%82%E7%82%B9%E5%A4%9A%E6%99%BA%E8%83%BD%E4%BD%93%E8%BF%90%E8%A1%8C%E6%97%B6" class="hash-link" aria-label="单节点多智能体运行时的直接链接" title="单节点多智能体运行时的直接链接" translate="no">​</a></h2>
<p>即使只有一个节点，也要支持多角色协同运行。推荐基础角色包括：</p>
<ul>
<li class="">Planner（规划）</li>
<li class="">Executor（执行）</li>
<li class="">Reviewer（审查）</li>
<li class="">Watcher（监控）</li>
<li class="">Specialist（领域专家）</li>
</ul>
<p>所有动作先上报本地 ledger，再由控制面聚合，确保执行轨迹清晰可见。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="跨节点调度基于-step-而非聊天"><strong>跨节点调度：基于 Step 而非聊天</strong><a href="https://tanzhuo.xyz/2026/04/03/dang-ai-xue-hui-gan-zhi-zi-ji#%E8%B7%A8%E8%8A%82%E7%82%B9%E8%B0%83%E5%BA%A6%E5%9F%BA%E4%BA%8E-step-%E8%80%8C%E9%9D%9E%E8%81%8A%E5%A4%A9" class="hash-link" aria-label="跨节点调度基于-step-而非聊天的直接链接" title="跨节点调度基于-step-而非聊天的直接链接" translate="no">​</a></h2>
<p>跨节点协作的关键是<strong>以 Step 为单位调度</strong>，而不是让节点间随意转发消息。这样才能保证所有权清晰、可取消、可审计。</p>
<p>调度器会综合考虑所需工具、模型可用性、硬件资源、locality、信任等级和 tenant 亲和性等因素。</p>
<p>节点状态包括 joining、ready、degraded、quarantined、draining 等，支持自动隔离高风险节点。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="核心原语execution-ledger执行账本"><strong>核心原语：Execution Ledger（执行账本）</strong><a href="https://tanzhuo.xyz/2026/04/03/dang-ai-xue-hui-gan-zhi-zi-ji#%E6%A0%B8%E5%BF%83%E5%8E%9F%E8%AF%ADexecution-ledger%E6%89%A7%E8%A1%8C%E8%B4%A6%E6%9C%AC" class="hash-link" aria-label="核心原语execution-ledger执行账本的直接链接" title="核心原语execution-ledger执行账本的直接链接" translate="no">​</a></h2>
<p>这是整个系统最重要的一环。所有事件（run、flow、step、side effect、policy 等）都绑定到 runId，形成统一可查询的账本。</p>
<p>操作者应该能轻松回答：</p>
<ul>
<li class="">是哪个 agent 在执行？</li>
<li class="">发生了哪些副作用？</li>
<li class="">当前卡在哪一步？</li>
<li class="">这个失败是否可以安全重试？</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="与-kubernetes-的关系"><strong>与 Kubernetes 的关系</strong><a href="https://tanzhuo.xyz/2026/04/03/dang-ai-xue-hui-gan-zhi-zi-ji#%E4%B8%8E-kubernetes-%E7%9A%84%E5%85%B3%E7%B3%BB" class="hash-link" aria-label="与-kubernetes-的关系的直接链接" title="与-kubernetes-的关系的直接链接" translate="no">​</a></h2>
<p>Kubernetes 继续负责 Pod 调度、liveness、service discovery、存储和 RBAC 等基础设施能力。</p>
<p>AI OS 层则通过 CustomResource（CRD）来表达 HiveRun、HiveFlow、HiveStepLease、HiveNode 等对象，用 Operator 实现调谐逻辑。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="演进路径建议"><strong>演进路径建议</strong><a href="https://tanzhuo.xyz/2026/04/03/dang-ai-xue-hui-gan-zhi-zi-ji#%E6%BC%94%E8%BF%9B%E8%B7%AF%E5%BE%84%E5%BB%BA%E8%AE%AE" class="hash-link" aria-label="演进路径建议的直接链接" title="演进路径建议的直接链接" translate="no">​</a></h2>
<p>推荐从小步开始：</p>
<ol>
<li class=""><strong>Phase 1</strong>：单节点补齐 run ledger、flow graph 和 side-effect 可视化</li>
<li class=""><strong>Phase 2</strong>：实现单集群 step scheduler 和节点管理</li>
<li class=""><strong>Phase 3</strong>：加入轻量角色推荐</li>
<li class=""><strong>Phase 4</strong>：实现自适应集群行为</li>
</ol>
<p>第一目标不是追求完全自治，而是先做一个<strong>单节点、具备一流可观测能力的 AI 运行时</strong>。先让执行可见，再让副作用可治理，最后再做跨节点调度。</p>
<p>Kubernetes AI OS 的目标，是让 Kubernetes 真正成为 AI 时代的操作系统底座：在保持安全和可控的前提下，充分发挥多智能体的协作能力。</p>]]></content:encoded>
            <category>AI</category>
        </item>
        <item>
            <title><![CDATA[openclaw架构设计]]></title>
            <link>https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji</link>
            <guid>https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji</guid>
            <pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[在大模型技术快速迭代的今天，多数AI应用仍停留在“聊天交互”的表层——用户输入问题，模型返回文本，但无法真正触达本地设备、执行实际任务。]]></description>
            <content:encoded><![CDATA[<p>在大模型技术快速迭代的今天，多数AI应用仍停留在“聊天交互”的表层——用户输入问题，模型返回文本，但无法真正触达本地设备、执行实际任务。OpenClaw（前身为Clawdbot/Moltbot/Molty）的出现打破了这一局限：它将大模型的“推理能力”与本地执行环境彻底分离，让AI从“对话助手”升级为“可自主行动的代理”。本文将从整体架构、运行逻辑、设计亮点三个维度，深入解析这款由Peter Steinberger开发的TypeScript/Node.js开源工具。</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="整体架构设计中心辐射式分层解耦的操作系统级框架">整体架构设计：中心辐射式+分层解耦的“操作系统级”框架<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E6%95%B4%E4%BD%93%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1%E4%B8%AD%E5%BF%83%E8%BE%90%E5%B0%84%E5%BC%8F%E5%88%86%E5%B1%82%E8%A7%A3%E8%80%A6%E7%9A%84%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%BA%A7%E6%A1%86%E6%9E%B6" class="hash-link" aria-label="整体架构设计：中心辐射式+分层解耦的“操作系统级”框架的直接链接" title="整体架构设计：中心辐射式+分层解耦的“操作系统级”框架的直接链接" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://tanzhuo.xyz/assets/images/2026-04-Gemini_Generated_Image_iy2svaiy2svaiy2s-1-f3d52510266b418bdf06cabe1bb30c7a.webp" width="1408" height="768" class="img_ev3q"></p>
<p>OpenClaw的核心设计哲学是“把AI当成基础设施问题，而非提示工程问题”——模型仅负责推理，系统则承担状态管理、执行控制、安全保障和多渠道协同。其架构采用<strong>中心辐射式（Hub-and-Spoke）<strong>与</strong>分层解耦</strong>结合的方式，既保证了核心逻辑的集中可控，又兼顾了组件的灵活性。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="中心辐射式gateway作为唯一控制平面">中心辐射式：Gateway作为唯一控制平面<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E4%B8%AD%E5%BF%83%E8%BE%90%E5%B0%84%E5%BC%8Fgateway%E4%BD%9C%E4%B8%BA%E5%94%AF%E4%B8%80%E6%8E%A7%E5%88%B6%E5%B9%B3%E9%9D%A2" class="hash-link" aria-label="中心辐射式：Gateway作为唯一控制平面的直接链接" title="中心辐射式：Gateway作为唯一控制平面的直接链接" translate="no">​</a></h3>
<ul>
<li class="">OpenClaw以**Gateway（网关）**为中心，所有组件（客户端、渠道适配器、Agent执行器等）都围绕Gateway辐射连接。Gateway是系统的“交通枢纽”，默认绑定本地回环地址（127.0.0.1:18789），仅允许本地设备访问，从根源保障数据隐私。它的核心职责包括：<strong>统一认证与会话隔离</strong>：不同用户或设备的会话独立管理，避免数据交叉污染；</li>
<li class=""><strong>Lane Queue（车道式串行队列）</strong>：每个会话默认串行执行任务，彻底解决多任务并发导致的状态冲突和日志交织问题（可手动开启并行模式）；</li>
<li class=""><strong>消息路由与调度</strong>：将标准化后的消息精准转发到对应Agent；</li>
<li class=""><strong>流式交互支持</strong>：实时推送模型输出和“正在输入”状态，模拟自然对话体验。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="分层架构从外到内的能力拆解">分层架构：从外到内的能力拆解<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E5%88%86%E5%B1%82%E6%9E%B6%E6%9E%84%E4%BB%8E%E5%A4%96%E5%88%B0%E5%86%85%E7%9A%84%E8%83%BD%E5%8A%9B%E6%8B%86%E8%A7%A3" class="hash-link" aria-label="分层架构：从外到内的能力拆解的直接链接" title="分层架构：从外到内的能力拆解的直接链接" translate="no">​</a></h3>
<p>OpenClaw的分层架构从用户交互到基础设施层层递进，每一层职责明确、可独立扩展：</p>
<p><strong>客户端层：多入口的交互界面</strong></p>
<p>用户无需依赖专用App，可通过以下方式与OpenClaw交互：</p>
<ul>
<li class="">命令行工具（CLI）：适合技术用户快速调试；</li>
<li class="">Web UI：可视化操作面板；</li>
<li class="">macOS菜单栏App、iOS/Android Node：移动设备端的轻量入口；</li>
<li class="">第三方聊天平台：支持WhatsApp、Telegram、Discord等20+常用App，用户可直接用熟悉的工具下达指令。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="接入协调层gateway的中枢功能">接入协调层：Gateway的“中枢功能”<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E6%8E%A5%E5%85%A5%E5%8D%8F%E8%B0%83%E5%B1%82gateway%E7%9A%84%E4%B8%AD%E6%9E%A2%E5%8A%9F%E8%83%BD" class="hash-link" aria-label="接入协调层：Gateway的“中枢功能”的直接链接" title="接入协调层：Gateway的“中枢功能”的直接链接" translate="no">​</a></h3>
<p>如前所述，Gateway是接入协调的核心，负责将异构输入转化为系统可识别的格式，并管理会话生命周期。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="渠道抽象层突破平台协议壁垒">渠道抽象层：突破平台协议壁垒<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E6%B8%A0%E9%81%93%E6%8A%BD%E8%B1%A1%E5%B1%82%E7%AA%81%E7%A0%B4%E5%B9%B3%E5%8F%B0%E5%8D%8F%E8%AE%AE%E5%A3%81%E5%9E%92" class="hash-link" aria-label="渠道抽象层：突破平台协议壁垒的直接链接" title="渠道抽象层：突破平台协议壁垒的直接链接" translate="no">​</a></h3>
<p>不同聊天平台的消息协议差异巨大（如WhatsApp的Baileys协议、Telegram的MTProto协议），<strong>Channel Adapters（渠道适配器）</strong> 扮演了“翻译官”的角色：它将各平台的消息（文本、图片、语音等）统一转化为OpenClaw的内部标准格式，并处理附件下载、缓存和访问控制（如“仅允许指定联系人发送指令”）。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="核心逻辑层agent的思考与执行引擎">核心逻辑层：Agent的“思考与执行引擎”<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E6%A0%B8%E5%BF%83%E9%80%BB%E8%BE%91%E5%B1%82agent%E7%9A%84%E6%80%9D%E8%80%83%E4%B8%8E%E6%89%A7%E8%A1%8C%E5%BC%95%E6%93%8E" class="hash-link" aria-label="核心逻辑层：Agent的“思考与执行引擎”的直接链接" title="核心逻辑层：Agent的“思考与执行引擎”的直接链接" translate="no">​</a></h3>
<ul>
<li class="">核心逻辑层由<strong>Agent Runner</strong>和<strong>Memory System</strong>组成，是AI代理“做事”的关键：<strong>Agent Runner</strong>：每个渠道或群组可映射到独立的Agent实例（支持多Agent协作），通过RPC调用Pi Agent Runtime完成“接收指令→调用模型→执行工具→生成结果”的完整循环；</li>
<li class=""><strong>Memory System</strong>：负责上下文管理，包括会话历史、用户长期记忆、工具能力描述等，为模型提供决策依据。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="基础设施层本地执行的地基">基础设施层：本地执行的“地基”<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E5%B1%82%E6%9C%AC%E5%9C%B0%E6%89%A7%E8%A1%8C%E7%9A%84%E5%9C%B0%E5%9F%BA" class="hash-link" aria-label="基础设施层：本地执行的“地基”的直接链接" title="基础设施层：本地执行的“地基”的直接链接" translate="no">​</a></h3>
<p>基础设施层提供系统运行的基础能力：</p>
<ul>
<li class="">本地持久化：用Markdown和.jsonl格式存储所有数据（避免依赖云端数据库）；</li>
<li class="">WebSocket流式通信：保障客户端与Gateway的实时连接；</li>
<li class="">沙箱执行：限制工具的系统权限，防止恶意操作；</li>
<li class="">定时任务（Cron）与Webhook：支持主动触发任务（如每日晨间报告）。</li>
</ul>
<p><strong>核心组件关系：各模块如何协同工作？</strong></p>
<p>为更清晰地理解架构，我们可以将核心组件的关系简化为：</p>
<ol>
<li class=""><strong>Gateway</strong>作为“调度中心”，接收来自客户端或渠道适配器的消息，分配给对应的Agent；</li>
<li class=""><strong>Agent Runner</strong>根据Gateway的指令，调用模型生成决策，并执行工具（如读写文件、操作浏览器）；</li>
<li class=""><strong>Channel Adapters</strong>负责“翻译”第三方平台的消息，让用户无需切换工具即可交互；</li>
<li class=""><strong>Skills（技能插件）</strong>：存放在`~/.openclaw/workspace/skills`目录下，Agent可自主发现、安装并调用（支持ClawHub注册表分享技能）；</li>
<li class=""><strong>Nodes（设备端执行器）</strong>：在macOS、iOS等设备上运行，通过WebSocket暴露本地硬件能力（如语音输入、摄像头、屏幕录制）；</li>
<li class=""><strong>Canvas</strong>：独立端口（18793）提供的可视化工作空间，Agent可生成HTML/A2UI界面（如任务进度条、数据仪表盘）。</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="运行逻辑agent-loop与主动调度的做事机制">运行逻辑：Agent Loop与主动调度的“做事”机制<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E8%BF%90%E8%A1%8C%E9%80%BB%E8%BE%91agent-loop%E4%B8%8E%E4%B8%BB%E5%8A%A8%E8%B0%83%E5%BA%A6%E7%9A%84%E5%81%9A%E4%BA%8B%E6%9C%BA%E5%88%B6" class="hash-link" aria-label="运行逻辑：Agent Loop与主动调度的“做事”机制的直接链接" title="运行逻辑：Agent Loop与主动调度的“做事”机制的直接链接" translate="no">​</a></h3>
<p>OpenClaw的核心价值是“让AI真正做事”，这依赖于<strong>可循环的Agent Loop（代理循环）<strong>和</strong>主动调度机制</strong>——前者处理用户触发的任务，后者实现无人值守的自主运行。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="典型消息处理流程从输入到输出的全链路">典型消息处理流程：从输入到输出的全链路<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E5%85%B8%E5%9E%8B%E6%B6%88%E6%81%AF%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B%E4%BB%8E%E8%BE%93%E5%85%A5%E5%88%B0%E8%BE%93%E5%87%BA%E7%9A%84%E5%85%A8%E9%93%BE%E8%B7%AF" class="hash-link" aria-label="典型消息处理流程：从输入到输出的全链路的直接链接" title="典型消息处理流程：从输入到输出的全链路的直接链接" translate="no">​</a></h3>
<p>一条用户指令（如“整理桌面最近3天的文件并生成清单”）的处理流程如下：</p>
<p><strong>消息进入与标准化</strong></p>
<p>用户通过Telegram发送指令→Channel Adapter将Telegram消息转化为系统标准格式（包含文本内容、发送者信息、上下文）→将标准化消息丢入Gateway的对应Session Lane Queue（串行执行，避免冲突）。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="路由与agent激活">路由与Agent激活<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E8%B7%AF%E7%94%B1%E4%B8%8Eagent%E6%BF%80%E6%B4%BB" class="hash-link" aria-label="路由与Agent激活的直接链接" title="路由与Agent激活的直接链接" translate="no">​</a></h3>
<p>Gateway根据配置（如“main会话绑定默认Agent”“非main会话需@触发”），将消息路由到目标Agent。例如，用户在家庭群组中@OpenClaw，Gateway会激活“家庭助手”Agent。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="上下文组装让agent记得关键信息">上下文组装：让Agent“记得”关键信息<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E4%B8%8A%E4%B8%8B%E6%96%87%E7%BB%84%E8%A3%85%E8%AE%A9agent%E8%AE%B0%E5%BE%97%E5%85%B3%E9%94%AE%E4%BF%A1%E6%81%AF" class="hash-link" aria-label="上下文组装：让Agent“记得”关键信息的直接链接" title="上下文组装：让Agent“记得”关键信息的直接链接" translate="no">​</a></h3>
<p>Memory System会自动组装以下内容，作为模型的输入上下文：</p>
<ul>
<li class="">当前会话的历史消息（避免Agent“失忆”）；</li>
<li class="">用户长期记忆（如“用户喜欢用Markdown整理文件”“桌面路径是~/Desktop”）；</li>
<li class="">系统提示：包括AGENTS.md（Agent的行为基线，如“优先使用本地工具”）、SOUL.md（性格设定，如“简洁高效”）、TOOLS.md（工具的能力描述，如“file.read可读取本地文件”）；</li>
<li class="">已安装的Skills（如“文件分类技能”）。</li>
</ul>
<p>若上下文过长，系统会自动压缩总结，保证模型输入在上下文窗口内。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="模型调用与决策生成">模型调用与决策生成<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E6%A8%A1%E5%9E%8B%E8%B0%83%E7%94%A8%E4%B8%8E%E5%86%B3%E7%AD%96%E7%94%9F%E6%88%90" class="hash-link" aria-label="模型调用与决策生成的直接链接" title="模型调用与决策生成的直接链接" translate="no">​</a></h3>
<p>Agent Runner调用配置的LLM（支持Claude、GPT或本地模型如Llama 3），模型基于上下文判断：是否需要执行工具？</p>
<ul>
<li class="">若不需要工具：直接生成自然语言回复（如“已整理完成，清单已保存到桌面”）；</li>
<li class="">若需要工具：生成工具调用指令（如`{"name": "file.list", "parameters": {"path": "~/Desktop", "days": 3}}`）。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="工具执行多轮循环直到任务完成">工具执行：多轮循环直到任务完成<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E5%B7%A5%E5%85%B7%E6%89%A7%E8%A1%8C%E5%A4%9A%E8%BD%AE%E5%BE%AA%E7%8E%AF%E7%9B%B4%E5%88%B0%E4%BB%BB%E5%8A%A1%E5%AE%8C%E6%88%90" class="hash-link" aria-label="工具执行：多轮循环直到任务完成的直接链接" title="工具执行：多轮循环直到任务完成的直接链接" translate="no">​</a></h3>
<ol>
<li class="">工具执行采用<strong>循环机制</strong>：Agent Runner在沙箱中执行工具（main会话默认拥有主机权限，非main会话可强制Docker沙箱隔离）；</li>
<li class="">工具返回执行结果（如“找到5个文件：report.pdf、photo.jpg...”）；</li>
<li class="">结果被写回上下文，Agent Runner再次调用模型，判断是否需要进一步操作（如“是否需要将清单转为Markdown？”）；</li>
<li class="">重复上述步骤，直到模型认为任务完成。</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="输出与持久化">输出与持久化<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E8%BE%93%E5%87%BA%E4%B8%8E%E6%8C%81%E4%B9%85%E5%8C%96" class="hash-link" aria-label="输出与持久化的直接链接" title="输出与持久化的直接链接" translate="no">​</a></h3>
<p>最终结果通过Gateway流式推送给原渠道（如Telegram），同时所有交互记录、工具执行日志、记忆更新都会写入本地的.jsonl和Markdown文件，确保数据可追溯且不依赖云端。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="主动运行机制ai的自主意识来源">主动运行机制：AI的“自主意识”来源<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E4%B8%BB%E5%8A%A8%E8%BF%90%E8%A1%8C%E6%9C%BA%E5%88%B6ai%E7%9A%84%E8%87%AA%E4%B8%BB%E6%84%8F%E8%AF%86%E6%9D%A5%E6%BA%90" class="hash-link" aria-label="主动运行机制：AI的“自主意识”来源的直接链接" title="主动运行机制：AI的“自主意识”来源的直接链接" translate="no">​</a></h3>
<p>传统聊天机器人需要用户主动触发，但OpenClaw支持<strong>主动运行</strong>，让AI无需用户指令即可完成任务。其实现方式包括：</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="定时任务heartbeat-schedulercron">定时任务（Heartbeat Scheduler/Cron）<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1heartbeat-schedulercron" class="hash-link" aria-label="定时任务（Heartbeat Scheduler/Cron）的直接链接" title="定时任务（Heartbeat Scheduler/Cron）的直接链接" translate="no">​</a></h4>
<p>用户可配置周期性任务，如“每天早上8点整理昨日邮件并生成摘要”“每周日备份桌面文件到移动硬盘”。Gateway会按时唤醒Agent执行任务，结果自动发送到指定渠道（如用户的WhatsApp）。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="外部事件触发webhookpubsub">外部事件触发（Webhook/Pub/Sub）<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E5%A4%96%E9%83%A8%E4%BA%8B%E4%BB%B6%E8%A7%A6%E5%8F%91webhookpubsub" class="hash-link" aria-label="外部事件触发（Webhook/Pub/Sub）的直接链接" title="外部事件触发（Webhook/Pub/Sub）的直接链接" translate="no">​</a></h4>
<p>OpenClaw支持通过Webhook接收外部事件，如Gmail新邮件、GitHub Issue创建、智能家居设备触发等。例如，当用户收到重要工作邮件时，OpenClaw可自动提取关键信息并提醒用户。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="多agent协作">多Agent协作<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E5%A4%9Aagent%E5%8D%8F%E4%BD%9C" class="hash-link" aria-label="多Agent协作的直接链接" title="多Agent协作的直接链接" translate="no">​</a></h4>
<p>Agent可通过内置工具（如`sessions_list`查看所有会话、`sessions_send`向其他Agent发送消息）实现协作。例如，“日程管理Agent”发现用户明天有会议，可通知“文件整理Agent”提前准备会议资料。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="启动与运行简单几步即可部署">启动与运行：简单几步即可部署<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E5%90%AF%E5%8A%A8%E4%B8%8E%E8%BF%90%E8%A1%8C%E7%AE%80%E5%8D%95%E5%87%A0%E6%AD%A5%E5%8D%B3%E5%8F%AF%E9%83%A8%E7%BD%B2" class="hash-link" aria-label="启动与运行：简单几步即可部署的直接链接" title="启动与运行：简单几步即可部署的直接链接" translate="no">​</a></h3>
<p>OpenClaw的部署流程非常轻量化，适合普通用户快速上手：</p>
<ol>
<li class="">安装：`npm install -g openclaw@latest`；</li>
<li class="">初始化：`openclaw onboard`（引导配置聊天渠道、LLM模型、工作区路径）；</li>
<li class="">常驻运行：`openclaw onboard --install-daemon`（将Gateway作为系统守护进程，实现24/7运行）；</li>
<li class="">交互：通过CLI、Web UI或聊天App连接Gateway即可开始使用。</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="关键设计亮点与安全机制本地优先的隐私保障">关键设计亮点与安全机制：本地优先的隐私保障<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E5%85%B3%E9%94%AE%E8%AE%BE%E8%AE%A1%E4%BA%AE%E7%82%B9%E4%B8%8E%E5%AE%89%E5%85%A8%E6%9C%BA%E5%88%B6%E6%9C%AC%E5%9C%B0%E4%BC%98%E5%85%88%E7%9A%84%E9%9A%90%E7%A7%81%E4%BF%9D%E9%9A%9C" class="hash-link" aria-label="关键设计亮点与安全机制：本地优先的隐私保障的直接链接" title="关键设计亮点与安全机制：本地优先的隐私保障的直接链接" translate="no">​</a></h2>
<p>OpenClaw的设计围绕“用户控制权”和“隐私安全”展开，以下是其核心亮点：</p>
<p><strong>本地优先：数据永远在你手中</strong></p>
<p>所有数据（会话历史、记忆、工具执行日志）都存储在本地设备，Gateway默认仅监听127.0.0.1（本地回环地址），不会向云端传输任何数据。即使断网，OpenClaw仍可正常执行本地任务（如文件操作、本地模型调用）。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="安全隔离多重防护避免风险">安全隔离：多重防护避免风险<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E5%AE%89%E5%85%A8%E9%9A%94%E7%A6%BB%E5%A4%9A%E9%87%8D%E9%98%B2%E6%8A%A4%E9%81%BF%E5%85%8D%E9%A3%8E%E9%99%A9" class="hash-link" aria-label="安全隔离：多重防护避免风险的直接链接" title="安全隔离：多重防护避免风险的直接链接" translate="no">​</a></h3>
<p>OpenClaw通过多层机制保障系统安全：</p>
<ul>
<li class=""><strong>私信配对审批</strong>：第三方聊天平台的私信指令需用户手动审批（如Telegram用户发送`/pair`后，OpenClaw会发送验证码，用户验证后才能交互）；</li>
<li class=""><strong>沙箱执行</strong>：非main会话的工具执行默认在Docker沙箱中，限制对主机系统的访问；</li>
<li class=""><strong>工具黑名单</strong>：用户可配置禁止Agent调用某些危险工具（如`system.exec`执行系统命令）；</li>
<li class=""><strong>显式控制</strong>：支持通过`/think high`（提高模型思考深度）、`/verbose on`（显示工具执行细节）等命令微调Agent行为。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="可扩展性插件化架构支持自定义">可扩展性：插件化架构支持自定义<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E5%8F%AF%E6%89%A9%E5%B1%95%E6%80%A7%E6%8F%92%E4%BB%B6%E5%8C%96%E6%9E%B6%E6%9E%84%E6%94%AF%E6%8C%81%E8%87%AA%E5%AE%9A%E4%B9%89" class="hash-link" aria-label="可扩展性：插件化架构支持自定义的直接链接" title="可扩展性：插件化架构支持自定义的直接链接" translate="no">​</a></h3>
<p>OpenClaw的所有核心组件都支持热插拔：</p>
<ul>
<li class=""><strong>渠道扩展</strong>：可自行开发新的Channel Adapter（如微信、Signal）；</li>
<li class=""><strong>模型扩展</strong>：支持接入任意LLM（只需实现标准接口）；</li>
<li class=""><strong>技能扩展</strong>：用户可编写自定义Skills（如“自动同步Obsidian笔记”“生成PPT大纲”），Agent会自主阅读Skill的契约文件并调用；</li>
<li class=""><strong>内存扩展</strong>：可替换Memory System为向量数据库（如Pinecone），提升长期记忆的检索效率。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="记忆系统四层结构让agent越用越聪明">记忆系统：四层结构让Agent“越用越聪明”<a href="https://tanzhuo.xyz/2026/04/02/openclaw-jia-gou-she-ji#%E8%AE%B0%E5%BF%86%E7%B3%BB%E7%BB%9F%E5%9B%9B%E5%B1%82%E7%BB%93%E6%9E%84%E8%AE%A9agent%E8%B6%8A%E7%94%A8%E8%B6%8A%E8%81%AA%E6%98%8E" class="hash-link" aria-label="记忆系统：四层结构让Agent“越用越聪明”的直接链接" title="记忆系统：四层结构让Agent“越用越聪明”的直接链接" translate="no">​</a></h3>
<p>OpenClaw的记忆系统分为四层，确保Agent能高效利用历史信息：</p>
<ol>
<li class=""><strong>SOUL层</strong>：Agent的性格和价值观（如“优先保护用户隐私”“简洁回答问题”）；</li>
<li class=""><strong>TOOLS层</strong>：工具的能力描述和使用方法；</li>
<li class=""><strong>USER向量记忆</strong>：用户的长期偏好（如“喜欢咖啡胜过茶”“常用的文件路径”），采用向量存储实现快速检索；</li>
<li class=""><strong>Session短期记忆</strong>：当前会话的历史消息，自动压缩避免冗余。</li>
</ol>
<p>系统会定期对记忆进行“压缩（compaction）”，保留关键信息，删除重复内容，让Agent的“记忆”更高效。</p>]]></content:encoded>
            <category>AI</category>
        </item>
        <item>
            <title><![CDATA[Cursor 的发展]]></title>
            <link>https://tanzhuo.xyz/2026/03/15/cursor-de-fa-zhan</link>
            <guid>https://tanzhuo.xyz/2026/03/15/cursor-de-fa-zhan</guid>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[IDE 编程工具的背景 在很长一段时间里，软件开发主要依赖传统 IDE，例如： Visual Studio Code IntelliJ IDEA Eclipse 这些 IDE 的核心能力是： 代码编辑 语法高亮 自动…]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ide-编程工具的背景">IDE 编程工具的背景<a href="https://tanzhuo.xyz/2026/03/15/cursor-de-fa-zhan#ide-%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7%E7%9A%84%E8%83%8C%E6%99%AF" class="hash-link" aria-label="IDE 编程工具的背景的直接链接" title="IDE 编程工具的背景的直接链接" translate="no">​</a></h2>
<!-- -->
<p>在很长一段时间里，软件开发主要依赖传统 IDE，例如：</p>
<ul>
<li class="">Visual Studio Code</li>
<li class="">IntelliJ IDEA</li>
<li class="">Eclipse</li>
</ul>
<p>这些 IDE 的核心能力是：</p>
<ul>
<li class="">代码编辑</li>
<li class="">语法高亮</li>
<li class="">自动补全</li>
<li class="">调试工具</li>
</ul>
<p>但真正的代码逻辑仍然需要 <strong>程序员自己编写</strong>。</p>
<p>直到 <strong>大语言模型（LLM）出现后</strong>，软件开发开始进入 <strong>AI 编程时代</strong>。</p>
<p>最早的一批 AI 编程工具包括：</p>
<ul>
<li class="">GitHub Copilot</li>
<li class="">Tabnine</li>
</ul>
<p>这些工具主要解决 <strong>代码补全问题</strong>。</p>
<p>但 Cursor 的目标并不是简单补全，而是：</p>
<blockquote>
<p><strong>构建一个 AI 原生（AI-Native）的开发环境。</strong></p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cursor-的诞生">Cursor 的诞生<a href="https://tanzhuo.xyz/2026/03/15/cursor-de-fa-zhan#cursor-%E7%9A%84%E8%AF%9E%E7%94%9F" class="hash-link" aria-label="Cursor 的诞生的直接链接" title="Cursor 的诞生的直接链接" translate="no">​</a></h2>
<p>Cursor 是一个 <strong>AI 原生代码编辑器（AI-Native IDE）</strong>。</p>
<p>它由公司 <strong>Anysphere</strong> 开发。</p>
<p>公司成立于 <strong>2022 年</strong>，创始人是四位 MIT 毕业生：</p>
<ul>
<li class="">Michael Truell</li>
<li class="">Aman Sanger</li>
<li class="">Sualeh Asif</li>
<li class="">Arvid Lunnemark</li>
</ul>
<p>Cursor 在 <strong>2023 年正式发布</strong>。</p>
<p>技术上它是：</p>
<blockquote>
<p><strong>基于 VS Code Fork 的 AI IDE</strong></p>
</blockquote>
<p>但在 VS Code 的基础上加入了大量 AI 功能，例如：</p>
<ul>
<li class="">AI 代码生成</li>
<li class="">AI Debug</li>
<li class="">AI 重构</li>
<li class="">AI 查询代码库</li>
</ul>
<p>Cursor 的目标非常明确：</p>
<blockquote>
<p><strong>让开发者通过自然语言直接写代码。</strong></p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cursor-的核心技术设计">Cursor 的核心技术设计<a href="https://tanzhuo.xyz/2026/03/15/cursor-de-fa-zhan#cursor-%E7%9A%84%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E8%AE%BE%E8%AE%A1" class="hash-link" aria-label="Cursor 的核心技术设计的直接链接" title="Cursor 的核心技术设计的直接链接" translate="no">​</a></h2>
<p>Cursor 的设计思想主要包括三个核心点。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-ai-代码生成">1 AI 代码生成<a href="https://tanzhuo.xyz/2026/03/15/cursor-de-fa-zhan#1-ai-%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90" class="hash-link" aria-label="1 AI 代码生成的直接链接" title="1 AI 代码生成的直接链接" translate="no">​</a></h3>
<p>Cursor 通过大语言模型实现代码生成。</p>
<p>开发者可以直接输入：</p>
<p>实现一个 redis 分布式锁</p>
<p>Cursor 会自动生成：</p>
<ul>
<li class="">代码</li>
<li class="">注释</li>
<li class="">测试代码</li>
</ul>
<p>这和传统 IDE 的 <strong>代码补全完全不同</strong>。</p>
<p>传统 IDE：</p>
<p>开发者写代码<br>
IDE辅助补全</p>
<p>Cursor：</p>
<p>开发者描述需求<br>
AI生成代码</p>
<p>这种模式被称为：</p>
<blockquote>
<p><strong>Vibe Coding</strong></p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-codebase-理解能力">2 Codebase 理解能力<a href="https://tanzhuo.xyz/2026/03/15/cursor-de-fa-zhan#2-codebase-%E7%90%86%E8%A7%A3%E8%83%BD%E5%8A%9B" class="hash-link" aria-label="2 Codebase 理解能力的直接链接" title="2 Codebase 理解能力的直接链接" translate="no">​</a></h3>
<p>Cursor 的一个核心能力是：</p>
<p><strong>理解整个代码仓库。</strong></p>
<p>它会：</p>
<ol>
<li class="">建立代码向量索引</li>
<li class="">建立文件关系</li>
<li class="">建立依赖关系</li>
</ol>
<p>然后开发者可以直接问：</p>
<p>这个项目的用户登录逻辑在哪里？</p>
<p>Cursor 可以直接定位相关代码。</p>
<p>这类似于：</p>
<p>RAG + Code Embedding</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-ai-代码修改能力">3 AI 代码修改能力<a href="https://tanzhuo.xyz/2026/03/15/cursor-de-fa-zhan#3-ai-%E4%BB%A3%E7%A0%81%E4%BF%AE%E6%94%B9%E8%83%BD%E5%8A%9B" class="hash-link" aria-label="3 AI 代码修改能力的直接链接" title="3 AI 代码修改能力的直接链接" translate="no">​</a></h3>
<p>Cursor 支持一种能力叫：</p>
<p><strong>Smart Rewrite</strong></p>
<p>例如：</p>
<p>把这个模块改成异步</p>
<p>Cursor 可以：</p>
<ul>
<li class="">自动修改多个文件</li>
<li class="">自动调整函数</li>
<li class="">自动更新调用关系</li>
</ul>
<p>这在传统 IDE 中几乎是不可能的。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cursor-的快速增长">Cursor 的快速增长<a href="https://tanzhuo.xyz/2026/03/15/cursor-de-fa-zhan#cursor-%E7%9A%84%E5%BF%AB%E9%80%9F%E5%A2%9E%E9%95%BF" class="hash-link" aria-label="Cursor 的快速增长的直接链接" title="Cursor 的快速增长的直接链接" translate="no">​</a></h2>
<p>Cursor 的增长速度非常惊人。</p>
<p>发布后不到两年：</p>
<ul>
<li class="">ARR 超过 <strong>3 亿美元</strong></li>
<li class="">融资超过 <strong>10 亿美元</strong></li>
<li class="">公司估值接近 <strong>300 亿美元</strong></li>
</ul>
<p>Cursor 甚至成为：</p>
<blockquote>
<p><strong>增长最快的 AI SaaS 产品之一</strong></p>
</blockquote>
<p>很多公司开始使用 Cursor，例如：</p>
<ul>
<li class="">Nvidia</li>
<li class="">Stripe</li>
<li class="">Spotify</li>
</ul>
<p>例如 Nvidia 有 <strong>3 万多工程师使用 Cursor 开发代码</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cursor-的技术挑战">Cursor 的技术挑战<a href="https://tanzhuo.xyz/2026/03/15/cursor-de-fa-zhan#cursor-%E7%9A%84%E6%8A%80%E6%9C%AF%E6%8C%91%E6%88%98" class="hash-link" aria-label="Cursor 的技术挑战的直接链接" title="Cursor 的技术挑战的直接链接" translate="no">​</a></h2>
<p>虽然 Cursor 非常火，但学术研究也指出了一些问题。</p>
<p>研究发现：</p>
<ul>
<li class="">AI 编程助手会提高开发速度</li>
<li class="">但可能 <strong>增加代码复杂度和警告数量</strong></li>
</ul>
<p>例如一篇研究论文指出：</p>
<blockquote>
<p>使用 AI 编程助手后，项目开发速度会短期提升，但代码复杂度也会上升。</p>
</blockquote>
<p>另一项研究发现：</p>
<blockquote>
<p>AI 代码助手容易受到上下文错误代码影响，从而生成缺陷代码。</p>
</blockquote>
<p>这说明：</p>
<p>AI 编程仍然需要 <strong>开发者进行审核和控制</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cursor-的未来方向">Cursor 的未来方向<a href="https://tanzhuo.xyz/2026/03/15/cursor-de-fa-zhan#cursor-%E7%9A%84%E6%9C%AA%E6%9D%A5%E6%96%B9%E5%90%91" class="hash-link" aria-label="Cursor 的未来方向的直接链接" title="Cursor 的未来方向的直接链接" translate="no">​</a></h2>
<p>Cursor 的愿景非常激进：</p>
<p>未来的软件开发可能变成：</p>
<p>自然语言 → 软件系统</p>
<p>开发流程可能变成：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">需求</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">AI 生成代码</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">AI 生成测试</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">AI 自动部署</span><br></div></code></pre></div></div>
<p>也就是说：</p>
<p><strong>软件开发可能从“写代码”变成“描述需求”。</strong></p>
<p>Cursor 官方甚至提出一个愿景：</p>
<blockquote>
<p>有一天开发者只需要写 50 行伪代码，就能生成 2000 行完整代码。</p>
</blockquote>]]></content:encoded>
            <category>AI</category>
        </item>
        <item>
            <title><![CDATA[PolarDB 存算分离]]></title>
            <link>https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou</link>
            <guid>https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou</guid>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[背景 随着互联网业务规模不断扩大，传统关系型数据库架构逐渐暴露出一些瓶颈，例如扩展能力不足、存储成本高、读写压力集中等问题。]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="背景">背景<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#%E8%83%8C%E6%99%AF" class="hash-link" aria-label="背景的直接链接" title="背景的直接链接" translate="no">​</a></h2>
<!-- -->
<p>随着互联网业务规模不断扩大，传统关系型数据库架构逐渐暴露出一些瓶颈，例如扩展能力不足、存储成本高、读写压力集中等问题。为了应对这些挑战，云厂商开始设计一种新的数据库架构模式：<strong>存算分离（Storage-Compute Decoupling）</strong>。</p>
<p>PolarDB 是阿里云推出的一款云原生数据库，其核心设计理念之一就是 <strong>计算层与存储层解耦</strong>。这种架构使数据库具备更强的弹性扩展能力和更高的资源利用率。 ()</p>
<p>本文将从架构角度分析 PolarDB 的存算分离设计，并与 AWS Aurora 以及传统 MySQL 架构进行对比。</p>
<p><img decoding="async" loading="lazy" src="https://tanzhuo.xyz/assets/images/2026-04-Gemini_Generated_Image_lr15jglr15jglr15-aaa1df73e131dae3dab907117c43cd3a.webp" width="1408" height="768" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="传统-mysql-架构的问题">传统 MySQL 架构的问题<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#%E4%BC%A0%E7%BB%9F-mysql-%E6%9E%B6%E6%9E%84%E7%9A%84%E9%97%AE%E9%A2%98" class="hash-link" aria-label="传统 MySQL 架构的问题的直接链接" title="传统 MySQL 架构的问题的直接链接" translate="no">​</a></h2>
<p>在传统 MySQL 架构中，数据库通常运行在单个服务器上：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">MySQL Server</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ├── CPU</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ├── Memory</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> └── Local Disk</span><br></div></code></pre></div></div>
<p>计算和存储都在同一台机器上。</p>
<p>这种架构在早期互联网时代已经足够，但随着业务规模扩大，会出现几个明显问题：</p>
<p><strong>1 存储扩展困难</strong></p>
<p>数据库数据通常存储在本地磁盘中，当数据量增长时，只能通过：</p>
<ul>
<li class="">升级磁盘</li>
<li class="">更换更大的机器</li>
</ul>
<p>这种方式扩展能力有限。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-读扩展成本高">2 读扩展成本高<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#2-%E8%AF%BB%E6%89%A9%E5%B1%95%E6%88%90%E6%9C%AC%E9%AB%98" class="hash-link" aria-label="2 读扩展成本高的直接链接" title="2 读扩展成本高的直接链接" translate="no">​</a></h3>
<p>MySQL 常见的扩展方式是 <strong>主从复制</strong>：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Master</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ├── Slave1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ├── Slave2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> └── Slave3</span><br></div></code></pre></div></div>
<p>每个只读节点都需要一份完整的数据副本。</p>
<p>随着读节点增加：</p>
<ul>
<li class="">存储成本会快速增长</li>
<li class="">数据同步压力增加</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-高可用复杂">3 高可用复杂<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#3-%E9%AB%98%E5%8F%AF%E7%94%A8%E5%A4%8D%E6%9D%82" class="hash-link" aria-label="3 高可用复杂的直接链接" title="3 高可用复杂的直接链接" translate="no">​</a></h3>
<p>如果主节点故障：</p>
<ul>
<li class="">需要手动或自动进行主从切换</li>
<li class="">可能存在复制延迟</li>
<li class="">数据一致性需要额外处理</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="polardb-的存算分离架构">PolarDB 的存算分离架构<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#polardb-%E7%9A%84%E5%AD%98%E7%AE%97%E5%88%86%E7%A6%BB%E6%9E%B6%E6%9E%84" class="hash-link" aria-label="PolarDB 的存算分离架构的直接链接" title="PolarDB 的存算分离架构的直接链接" translate="no">​</a></h2>
<p>PolarDB 的核心设计是：</p>
<p><strong>计算节点与存储节点完全解耦。</strong></p>
<p>架构大致如下：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">          +--------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          |    Compute Node    |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          | (MySQL / PG / ORA) |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          +---------+----------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          +---------+----------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          | Distributed Storage|</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          |     (PolarStore)   |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          +--------------------+</span><br></div></code></pre></div></div>
<p>计算节点负责：</p>
<ul>
<li class="">SQL解析</li>
<li class="">查询执行</li>
<li class="">事务处理</li>
</ul>
<p>存储层负责：</p>
<ul>
<li class="">数据存储</li>
<li class="">日志管理</li>
<li class="">副本复制</li>
</ul>
<p>所有计算节点共享同一份分布式存储。</p>
<p>这种架构被称为：</p>
<p><strong>Shared Storage Architecture</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="存算分离解决了什么问题">存算分离解决了什么问题<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#%E5%AD%98%E7%AE%97%E5%88%86%E7%A6%BB%E8%A7%A3%E5%86%B3%E4%BA%86%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98" class="hash-link" aria-label="存算分离解决了什么问题的直接链接" title="存算分离解决了什么问题的直接链接" translate="no">​</a></h2>
<p>这种设计主要解决了传统数据库的几个核心问题。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-弹性扩展能力">1 弹性扩展能力<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#1-%E5%BC%B9%E6%80%A7%E6%89%A9%E5%B1%95%E8%83%BD%E5%8A%9B" class="hash-link" aria-label="1 弹性扩展能力的直接链接" title="1 弹性扩展能力的直接链接" translate="no">​</a></h3>
<p>在传统数据库中：</p>
<p>增加计算能力必须升级服务器。</p>
<p>而在 PolarDB 中：</p>
<p>可以直接增加计算节点：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Storage Layer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   ↑</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Compute1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Compute2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Compute3</span><br></div></code></pre></div></div>
<p>所有节点共享同一份数据。</p>
<p>因此可以实现：</p>
<ul>
<li class="">读扩展</li>
<li class="">分布式计算</li>
<li class="">秒级扩容</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-存储成本降低">2 存储成本降低<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#2-%E5%AD%98%E5%82%A8%E6%88%90%E6%9C%AC%E9%99%8D%E4%BD%8E" class="hash-link" aria-label="2 存储成本降低的直接链接" title="2 存储成本降低的直接链接" translate="no">​</a></h3>
<p>传统 MySQL 读节点需要完整数据副本。</p>
<p>PolarDB 的存算分离架构下：</p>
<p>多个计算节点共享同一存储系统。</p>
<p>因此：</p>
<ul>
<li class="">不需要复制完整数据</li>
<li class="">存储成本显著降低</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-高可用能力更强">3 高可用能力更强<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#3-%E9%AB%98%E5%8F%AF%E7%94%A8%E8%83%BD%E5%8A%9B%E6%9B%B4%E5%BC%BA" class="hash-link" aria-label="3 高可用能力更强的直接链接" title="3 高可用能力更强的直接链接" translate="no">​</a></h3>
<p>PolarDB 的存储层通常使用分布式副本机制，例如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Storage Node</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ├── Replica1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ├── Replica2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> └── Replica3</span><br></div></code></pre></div></div>
<p>当某个节点故障时：系统可以极快的进行恢复。</p>
<p>这种设计可以实现：</p>
<ul>
<li class="">自动故障恢复</li>
<li class="">高可用架构</li>
<li class="">数据持久化保障</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-极致性能">4 极致性能<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#4-%E6%9E%81%E8%87%B4%E6%80%A7%E8%83%BD" class="hash-link" aria-label="4 极致性能的直接链接" title="4 极致性能的直接链接" translate="no">​</a></h3>
<p>PolarDB 存储层通常采用：</p>
<ul>
<li class="">分布式日志结构</li>
<li class="">并行 I/O</li>
<li class="">SSD 云存储</li>
</ul>
<p>这种方式可以大幅提升数据库性能。主要瓶颈从存储层变化为了内部网络IO层。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="polardb-的劣势">polarDB 的劣势<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#polardb-%E7%9A%84%E5%8A%A3%E5%8A%BF" class="hash-link" aria-label="polarDB 的劣势的直接链接" title="polarDB 的劣势的直接链接" translate="no">​</a></h2>
<p>虽然存算分离架构有很多优势，但也存在一些挑战。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-网络延迟">1 网络延迟<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#1-%E7%BD%91%E7%BB%9C%E5%BB%B6%E8%BF%9F" class="hash-link" aria-label="1 网络延迟的直接链接" title="1 网络延迟的直接链接" translate="no">​</a></h3>
<p>计算层与存储层分离意味着：</p>
<p>数据访问需要通过网络。</p>
<p>相比本地磁盘：</p>
<p>会增加一定延迟。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-架构复杂度高">2 架构复杂度高<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#2-%E6%9E%B6%E6%9E%84%E5%A4%8D%E6%9D%82%E5%BA%A6%E9%AB%98" class="hash-link" aria-label="2 架构复杂度高的直接链接" title="2 架构复杂度高的直接链接" translate="no">​</a></h3>
<p>存算分离架构需要设计：</p>
<ul>
<li class="">分布式存储系统</li>
<li class="">网络协议</li>
<li class="">数据一致性机制</li>
</ul>
<p>实现难度远高于传统数据库。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-对云基础设施依赖强">3 对云基础设施依赖强<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#3-%E5%AF%B9%E4%BA%91%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E4%BE%9D%E8%B5%96%E5%BC%BA" class="hash-link" aria-label="3 对云基础设施依赖强的直接链接" title="3 对云基础设施依赖强的直接链接" translate="no">​</a></h3>
<p>这种架构高度依赖：</p>
<ul>
<li class="">高性能网络</li>
<li class="">分布式存储</li>
<li class="">云平台调度能力</li>
</ul>
<p>因此通常只适用于云环境。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="polardb-vs-aws-aurora">PolarDB vs AWS Aurora<a href="https://tanzhuo.xyz/2026/03/15/polardb-du-xie-fen-chi-jia-gou#polardb-vs-aws-aurora" class="hash-link" aria-label="PolarDB vs AWS Aurora的直接链接" title="PolarDB vs AWS Aurora的直接链接" translate="no">​</a></h2>
<p>PolarDB 和 Aurora 的整体设计理念非常接近，二者都是典型的 <strong>云原生数据库架构</strong>，都采用了 <strong>存算分离（Compute + Storage Decoupling）</strong> 的设计。</p>
<p>Aurora 也是一种 <strong>存算分离数据库</strong>。</p>
<p>Aurora 将计算节点与一个分布式存储集群分离，多个计算节点共享同一存储系统。</p>
<p>架构示意：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">          Writer Node</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       +-------+-------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       |               |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   Reader1         Reader2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       |               |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   +-----------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   |   Distributed Storage |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   +-----------------------+</span><br></div></code></pre></div></div>
<p>Aurora 的分布式存储通常跨多个可用区部署，以提升可用性。</p>
<p><strong>但在具体实现上，两者仍然存在一些重要差异。</strong></p>
<p>首先是 <strong>存储架构设计差异</strong>。</p>
<p>Aurora 的核心设计是 <strong>日志驱动存储（Log Structured Storage）</strong>。</p>
<p>在 Aurora 中，计算节点并不会直接写入数据库页，而是将 <strong>redo log</strong> 发送到存储节点。存储层根据这些日志来重建数据页。</p>
<p>简化后的流程如下：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Aurora Compute Node</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Redo Log</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Distributed Storage Nodes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Storage Node 重建数据页</span><br></div></code></pre></div></div>
<p>Aurora 的存储层通常由 <strong>6 个副本组成</strong>，分布在 <strong>3 个可用区（AZ）</strong>：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">AZ1 : Storage Node A / Storage Node B</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">AZ2 : Storage Node C / Storage Node D</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">AZ3 : Storage Node E / Storage Node F</span><br></div></code></pre></div></div>
<p>写入时只需要 <strong>4/6 quorum</strong> 即可提交事务。</p>
<p>这种设计带来了几个优势：</p>
<ul>
<li class="">写入只需要发送日志，网络传输量更小</li>
<li class="">不需要完整复制数据库页</li>
<li class="">故障恢复速度更快</li>
</ul>
<p>而 PolarDB 的存储实现方式略有不同。</p>
<p>PolarDB 采用的是 <strong>共享分布式存储（Shared Storage）</strong> 架构。</p>
<p>计算节点可以直接访问底层的 <strong>PolarStore / PolarFS 分布式文件系统</strong>，数据库页仍然以页的形式存储。</p>
<p>简化结构如下：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Client</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Compute Node (MySQL / PG / Oracle)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">PolarFS / PolarStore</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">↓</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Distributed Storage Nodes</span><br></div></code></pre></div></div>
<p>这种设计更接近传统数据库的存储方式，因此：</p>
<ul>
<li class="">数据页结构保持兼容</li>
<li class="">对数据库内核改动相对较小</li>
</ul>
<p>但在写入路径上，网络传输的数据量可能比 Aurora 的日志方式更大。</p>
<p>第二个差异是 <strong>读节点架构</strong>。</p>
<p>Aurora 的读节点主要是 <strong>Reader Instance</strong>，读节点通常只负责读取数据，而写操作集中在 <strong>Writer Node</strong>。</p>
<p>PolarDB 则支持一种叫做 <strong>Reader Node + 主节点共享存储</strong> 的模式，多个节点可以直接访问共享存储，从而实现更灵活的读扩展。</p>
<p>第三个差异是 <strong>生态与兼容性策略</strong>。</p>
<p>Aurora 是 AWS 深度改造后的数据库引擎，虽然兼容 MySQL / PostgreSQL，但底层实现已经发生了较大变化。</p>
<p>PolarDB 则更加注重 <strong>原生数据库兼容性</strong>：</p>
<ul>
<li class="">PolarDB MySQL</li>
<li class="">PolarDB PostgreSQL</li>
<li class="">PolarDB Oracle</li>
</ul>
<p>因此很多应用迁移到 PolarDB 时，修改成本会更低。</p>]]></content:encoded>
            <category>DB</category>
            <category>技术</category>
            <category>Linux</category>
            <category>Java</category>
        </item>
        <item>
            <title><![CDATA[团队管理经验]]></title>
            <link>https://tanzhuo.xyz/2026/03/15/tuan-dui-guan-li-jing-yan</link>
            <guid>https://tanzhuo.xyz/2026/03/15/tuan-dui-guan-li-jing-yan</guid>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[很多人以为技术团队管理是一门很复杂的学问，但我自己带团队之后慢慢发现，其实很多事情没有想象中那么复杂。技术团队管理，说到底不是“管人”，而是 让团队能够稳定地把事情做好。 刚开始带团队的时候，我也走过一些弯路。]]></description>
            <content:encoded><![CDATA[<p>很多人以为技术团队管理是一门很复杂的学问，但我自己带团队之后慢慢发现，其实很多事情没有想象中那么复杂。技术团队管理，说到底不是“管人”，而是 <strong>让团队能够稳定地把事情做好</strong>。</p>
<!-- -->
<p>刚开始带团队的时候，我也走过一些弯路。最早的时候，我觉得只要自己技术能力强，很多事情亲自做就能解决。但后来慢慢发现，如果团队规模变大，靠一个人是撑不住的。技术负责人真正需要做的事情，其实是让团队整体能力提升，而不是自己变成团队里最忙的人。</p>
<p>这些年做技术管理，我逐渐总结出一些比较简单但很重要的经验。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="先把事情想清楚再让团队去做">先把事情想清楚，再让团队去做<a href="https://tanzhuo.xyz/2026/03/15/tuan-dui-guan-li-jing-yan#%E5%85%88%E6%8A%8A%E4%BA%8B%E6%83%85%E6%83%B3%E6%B8%85%E6%A5%9A%E5%86%8D%E8%AE%A9%E5%9B%A2%E9%98%9F%E5%8E%BB%E5%81%9A" class="hash-link" aria-label="先把事情想清楚，再让团队去做的直接链接" title="先把事情想清楚，再让团队去做的直接链接" translate="no">​</a></h2>
<p>很多技术团队效率低，其实不是因为工程师能力不行，而是事情本身没有想清楚。</p>
<p>以前我也遇到过这种情况：需求来了，大家马上开始开发，结果开发到一半才发现设计不合理，又要返工。后来我慢慢养成一个习惯，在项目开始之前一定要把 <strong>设计思路和整体方案想清楚</strong>。</p>
<p>例如一个系统要做什么功能、系统大概怎么拆分、核心模块怎么设计、哪些地方可能成为瓶颈。如果这些事情没有想清楚，团队越努力，可能走得越偏。</p>
<p>所以现在我通常会先做一件事情：<strong>把问题想明白，再安排团队做事情</strong>。这样不仅效率更高，也能减少很多不必要的返工。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="团队分工一定要清晰">团队分工一定要清晰<a href="https://tanzhuo.xyz/2026/03/15/tuan-dui-guan-li-jing-yan#%E5%9B%A2%E9%98%9F%E5%88%86%E5%B7%A5%E4%B8%80%E5%AE%9A%E8%A6%81%E6%B8%85%E6%99%B0" class="hash-link" aria-label="团队分工一定要清晰的直接链接" title="团队分工一定要清晰的直接链接" translate="no">​</a></h2>
<p>技术团队里一个很常见的问题，就是责任不清。很多系统看起来大家都在做，但真正出了问题的时候，却没人知道应该找谁。</p>
<p>后来我慢慢意识到，一个团队如果想运转顺畅，必须要有清晰的责任划分。例如一个系统一定要有负责人，这个人不一定什么代码都写，但他必须清楚系统架构、核心逻辑以及系统运行情况。</p>
<p>我通常会给每个核心系统安排一个 Owner，例如某个服务、某个模块或者某个基础组件。这样当系统出现问题时，团队可以很快找到负责人，也能避免大家互相推诿。</p>
<p>责任清晰之后，团队效率会明显提升。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术负责人不应该什么都自己做">技术负责人不应该什么都自己做<a href="https://tanzhuo.xyz/2026/03/15/tuan-dui-guan-li-jing-yan#%E6%8A%80%E6%9C%AF%E8%B4%9F%E8%B4%A3%E4%BA%BA%E4%B8%8D%E5%BA%94%E8%AF%A5%E4%BB%80%E4%B9%88%E9%83%BD%E8%87%AA%E5%B7%B1%E5%81%9A" class="hash-link" aria-label="技术负责人不应该什么都自己做的直接链接" title="技术负责人不应该什么都自己做的直接链接" translate="no">​</a></h2>
<p>刚开始带团队的时候，我经常会忍不住自己去写很多代码。因为自己写代码确实比较快，也比较放心。但时间久了就会发现，这种方式其实不利于团队成长。</p>
<p>如果技术负责人把所有关键事情都自己做完，团队成员就很难成长。长期来看，这会让团队越来越依赖某一个人。</p>
<p>后来我慢慢调整了自己的方式。现在我更倾向于 <strong>让团队成员参与设计和决策</strong>，而不是只负责执行。比如系统设计讨论的时候，我会让大家一起参与，而不是我一个人决定。</p>
<p>这样做虽然一开始可能会慢一点，但长期来看，团队能力会越来越强。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="流程不是为了约束而是为了提高效率">流程不是为了约束，而是为了提高效率<a href="https://tanzhuo.xyz/2026/03/15/tuan-dui-guan-li-jing-yan#%E6%B5%81%E7%A8%8B%E4%B8%8D%E6%98%AF%E4%B8%BA%E4%BA%86%E7%BA%A6%E6%9D%9F%E8%80%8C%E6%98%AF%E4%B8%BA%E4%BA%86%E6%8F%90%E9%AB%98%E6%95%88%E7%8E%87" class="hash-link" aria-label="流程不是为了约束，而是为了提高效率的直接链接" title="流程不是为了约束，而是为了提高效率的直接链接" translate="no">​</a></h2>
<p>很多工程师一听到流程，就觉得是增加工作量。但实际上，一个成熟的团队一定需要基本流程。</p>
<p>例如在我们团队里，通常会有几个固定环节：</p>
<p>需求评审、技术设计、代码评审、测试验证、上线发布。</p>
<p>这些流程的目的不是增加复杂度，而是减少问题。例如代码评审可以提前发现潜在 bug，技术设计可以避免架构问题，测试流程可以减少线上事故。</p>
<p>当流程稳定之后，团队合作会顺畅很多。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术负责人需要关注长期问题">技术负责人需要关注长期问题<a href="https://tanzhuo.xyz/2026/03/15/tuan-dui-guan-li-jing-yan#%E6%8A%80%E6%9C%AF%E8%B4%9F%E8%B4%A3%E4%BA%BA%E9%9C%80%E8%A6%81%E5%85%B3%E6%B3%A8%E9%95%BF%E6%9C%9F%E9%97%AE%E9%A2%98" class="hash-link" aria-label="技术负责人需要关注长期问题的直接链接" title="技术负责人需要关注长期问题的直接链接" translate="no">​</a></h2>
<p>很多时候团队每天都在处理需求，很容易只关注眼前的事情。但如果长期不关注技术债务，系统会越来越难维护。</p>
<p>所以我通常会留出一部分时间去思考系统架构。例如：</p>
<p>系统是否存在性能瓶颈<br>
架构是否需要调整<br>
是否需要引入新的技术组件</p>
<p>这些事情短期内可能看不到效果，但长期来看会对系统稳定性产生很大影响。</p>
<p>技术负责人不仅要解决今天的问题，还要考虑 <strong>系统未来的发展方向</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="团队氛围其实很重要">团队氛围其实很重要<a href="https://tanzhuo.xyz/2026/03/15/tuan-dui-guan-li-jing-yan#%E5%9B%A2%E9%98%9F%E6%B0%9B%E5%9B%B4%E5%85%B6%E5%AE%9E%E5%BE%88%E9%87%8D%E8%A6%81" class="hash-link" aria-label="团队氛围其实很重要的直接链接" title="团队氛围其实很重要的直接链接" translate="no">​</a></h2>
<p>技术团队的效率不仅和技术能力有关，也和团队氛围有关。如果团队成员之间缺乏信任，很多事情都会变得困难。</p>
<p>我自己比较重视的一点是，让团队成员可以自由讨论技术问题。很多时候不同的人会有不同的思路，这种讨论往往能产生更好的解决方案。</p>
<p>另外我也不太喜欢那种过于严格的管理方式。技术团队更适合一种相对开放的环境，让大家专注于把事情做好。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术管理其实也是一种成长">技术管理其实也是一种成长<a href="https://tanzhuo.xyz/2026/03/15/tuan-dui-guan-li-jing-yan#%E6%8A%80%E6%9C%AF%E7%AE%A1%E7%90%86%E5%85%B6%E5%AE%9E%E4%B9%9F%E6%98%AF%E4%B8%80%E7%A7%8D%E6%88%90%E9%95%BF" class="hash-link" aria-label="技术管理其实也是一种成长的直接链接" title="技术管理其实也是一种成长的直接链接" translate="no">​</a></h2>
<p>从工程师到技术负责人，其实是一个很大的转变。以前只需要关注代码，现在需要关注团队、项目和系统整体。</p>
<p>刚开始的时候可能会不习惯，但慢慢会发现，技术管理其实也是一种新的挑战。它不仅需要技术能力，也需要思考能力和沟通能力。</p>
<p>对我来说，带团队最大的收获就是看到团队成员不断成长，同时系统也在不断进步。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="经验总结">经验总结<a href="https://tanzhuo.xyz/2026/03/15/tuan-dui-guan-li-jing-yan#%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93" class="hash-link" aria-label="经验总结的直接链接" title="经验总结的直接链接" translate="no">​</a></h2>
<p>这些年做技术团队管理，我最大的体会其实很简单：</p>
<p>技术团队管理不是复杂的管理学，而是让一群工程师能够 <strong>一起把事情做好</strong>。</p>
<p>只要目标清晰、分工明确、流程稳定，并且团队之间保持信任，很多事情其实都会自然变得顺畅。</p>]]></content:encoded>
            <category>技术</category>
        </item>
        <item>
            <title><![CDATA[微服务架构设计]]></title>
            <link>https://tanzhuo.xyz/2026/03/15/wei-fu-wu-jia-gou-she-ji</link>
            <guid>https://tanzhuo.xyz/2026/03/15/wei-fu-wu-jia-gou-she-ji</guid>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[为什么会出现微服务架构 在早期的软件系统中，大多数应用都采用 单体架构（Monolithic Architecture）。]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么会出现微服务架构">为什么会出现微服务架构<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-jia-gou-she-ji#%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BC%9A%E5%87%BA%E7%8E%B0%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84" class="hash-link" aria-label="为什么会出现微服务架构的直接链接" title="为什么会出现微服务架构的直接链接" translate="no">​</a></h2>
<!-- -->
<p>在早期的软件系统中，大多数应用都采用 <strong>单体架构（Monolithic Architecture）</strong>。所有功能模块都运行在同一个应用进程中，例如用户系统、订单系统、支付系统、库存系统等，都被打包在一个工程中统一部署。这种架构在系统规模较小时非常简单直接，开发效率也较高。</p>
<p>但随着业务不断增长，单体架构的问题逐渐显现出来。系统代码越来越庞大，一个项目可能包含几十万甚至上百万行代码，任何一次修改都需要重新构建和部署整个系统。同时，不同功能模块之间耦合严重，一个模块出现问题很可能影响整个系统运行。当访问量增长时，系统也无法只对某个热点模块进行扩展，只能整体扩容，资源利用效率很低。</p>
<p>在这种背景下，微服务架构逐渐成为大型系统的主流设计方式。微服务的核心思想是 <strong>将一个庞大的系统拆分为多个独立服务，每个服务负责一个明确的业务能力，并可以独立开发、部署和扩展</strong>。这样不仅可以降低系统复杂度，还可以提升系统的可维护性和扩展能力。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="微服务架构的核心设计思想">微服务架构的核心设计思想<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-jia-gou-she-ji#%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E7%9A%84%E6%A0%B8%E5%BF%83%E8%AE%BE%E8%AE%A1%E6%80%9D%E6%83%B3" class="hash-link" aria-label="微服务架构的核心设计思想的直接链接" title="微服务架构的核心设计思想的直接链接" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://tanzhuo.xyz/assets/images/2026-04-Gemini_Generated_Image_qjw17xqjw17xqjw1-40a2fd0d4db35c47974e2ed1357238bd.webp" width="1408" height="768" class="img_ev3q"></p>
<p>微服务架构并不仅仅是把系统拆分成很多小服务，更重要的是围绕 <strong>业务能力（Business Capability）进行系统设计</strong>。每个服务应该具备清晰的职责边界，并且能够独立运行。</p>
<p>在微服务设计中，通常会遵循几个核心原则：</p>
<p>首先是 <strong>单一职责原则</strong>。每个微服务只负责一个核心业务领域，例如用户服务、订单服务、库存服务等。这样可以避免服务职责混乱，也方便团队分工协作。</p>
<p>其次是 <strong>服务自治</strong>。每个微服务都拥有自己的数据库和数据模型，避免多个服务共享数据库。这样可以减少服务之间的强依赖，使系统更加松耦合。</p>
<p>第三是 <strong>独立部署</strong>。每个服务可以独立发布和升级，而不需要影响其他服务。这一点对于大型团队尤为重要，可以大幅提高研发效率。</p>
<p>最后是 <strong>接口驱动通信</strong>。服务之间通过 API 或消息系统进行通信，而不是直接调用数据库或共享代码库。</p>
<p>这些原则共同构成了微服务架构的基础。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="微服务系统的整体架构设计">微服务系统的整体架构设计<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-jia-gou-she-ji#%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%95%B4%E4%BD%93%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1" class="hash-link" aria-label="微服务系统的整体架构设计的直接链接" title="微服务系统的整体架构设计的直接链接" translate="no">​</a></h2>
<p>在实际系统中，一个完整的微服务架构通常由多个基础组件构成，而不仅仅是简单的服务拆分。</p>
<p>系统最外层通常是 <strong>API Gateway（网关层）</strong>。网关作为系统统一入口，负责处理客户端请求，并提供认证、限流、日志记录、路由转发等功能。通过网关，可以屏蔽后端服务的复杂性，使客户端只需要面对一个统一接口。</p>
<p>网关之后是 <strong>业务服务层</strong>。这一层由多个微服务组成，例如用户服务、订单服务、商品服务、支付服务等。每个服务负责独立业务能力，并通过 API 或 RPC 进行交互。</p>
<p>为了保证服务之间能够互相发现和通信，系统通常会引入 <strong>服务注册与发现系统</strong>。例如常见的 etcd、Nacos、Consul 等组件。服务启动时会注册到注册中心，其他服务可以通过注册中心获取目标服务地址。</p>
<p>在高并发系统中，通常还会引入 <strong>消息队列（MQ）</strong> 来实现异步通信，例如 Kafka、RabbitMQ 或 RocketMQ。消息队列可以用于削峰填谷、解耦服务以及构建事件驱动架构。</p>
<p>数据层方面，每个微服务一般会拥有自己的数据库，例如 MySQL、PostgreSQL 或 NoSQL 数据库。为了提升性能，还会使用 Redis 作为缓存层，减少数据库压力。</p>
<p>最终整个系统通常会运行在 <strong>容器平台（例如 Kubernetes）</strong> 上，通过容器编排实现服务的自动部署、扩容以及故障恢复。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="微服务架构中的关键设计问题">微服务架构中的关键设计问题<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-jia-gou-she-ji#%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E4%B8%AD%E7%9A%84%E5%85%B3%E9%94%AE%E8%AE%BE%E8%AE%A1%E9%97%AE%E9%A2%98" class="hash-link" aria-label="微服务架构中的关键设计问题的直接链接" title="微服务架构中的关键设计问题的直接链接" translate="no">​</a></h2>
<p>虽然微服务架构带来了很多优势，但也会引入新的复杂性。在系统设计时，需要重点关注几个关键问题。</p>
<p>首先是 <strong>服务拆分粒度</strong>。如果服务拆分过粗，系统仍然会变成大型单体；如果拆分过细，则会导致服务数量过多，增加系统复杂度。通常建议以业务领域为边界进行拆分，而不是按照技术模块拆分。</p>
<p>其次是 <strong>服务通信方式</strong>。同步调用通常使用 HTTP 或 gRPC，而异步通信则通过消息队列实现。在高并发系统中，大量同步调用可能会导致服务之间形成复杂调用链，因此需要合理设计通信模式。</p>
<p>第三是 <strong>分布式事务问题</strong>。在单体系统中，数据库事务可以保证数据一致性，但在微服务架构中，每个服务拥有独立数据库，传统事务机制无法直接使用。因此通常会采用 <strong>最终一致性（Eventual Consistency）</strong>、Saga 模式或分布式事务框架来解决数据一致性问题。</p>
<p>第四是 <strong>系统稳定性</strong>。在微服务架构中，服务数量增加意味着故障点也随之增加，因此需要引入限流、熔断、降级等机制。例如通过服务治理框架或 Service Mesh 来实现流量控制。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="微服务架构的扩展能力">微服务架构的扩展能力<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-jia-gou-she-ji#%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E7%9A%84%E6%89%A9%E5%B1%95%E8%83%BD%E5%8A%9B" class="hash-link" aria-label="微服务架构的扩展能力的直接链接" title="微服务架构的扩展能力的直接链接" translate="no">​</a></h2>
<p>微服务架构最大的优势之一就是 <strong>弹性扩展能力</strong>。</p>
<p>在传统单体架构中，如果某个功能模块成为系统瓶颈，例如订单服务压力过大，就必须整体扩容整个系统。而在微服务架构中，可以只对订单服务进行扩展，例如增加多个实例进行负载均衡。</p>
<p>在云原生环境中，Kubernetes 可以根据系统负载自动扩展服务实例数量，实现自动伸缩。例如在流量高峰期自动扩容服务节点，在流量下降后再自动缩容，从而提高资源利用率。</p>
<p>这种按需扩展能力，使得微服务架构非常适合互联网高并发场景。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="微服务架构的挑战">微服务架构的挑战<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-jia-gou-she-ji#%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E7%9A%84%E6%8C%91%E6%88%98" class="hash-link" aria-label="微服务架构的挑战的直接链接" title="微服务架构的挑战的直接链接" translate="no">​</a></h2>
<p>虽然微服务架构解决了很多问题，但它并不是万能的。相比单体架构，微服务系统会更加复杂。</p>
<p>首先是 <strong>运维复杂度增加</strong>。系统中可能存在几十甚至上百个服务，每个服务都有自己的部署流程和监控体系，因此需要完善的 DevOps 平台支持。</p>
<p>其次是 <strong>服务治理问题</strong>。随着服务数量增加，服务调用关系会变得非常复杂，需要借助服务治理系统进行管理。</p>
<p>另外是 <strong>分布式系统带来的问题</strong>，例如网络延迟、数据一致性、服务依赖等。这些问题在单体系统中几乎不存在，但在微服务系统中却需要重点解决。</p>
<p>因此在系统规模较小时，单体架构往往更加简单高效，而微服务架构更适合 <strong>中大型系统</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="微服务架构总结">微服务架构总结<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-jia-gou-she-ji#%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E6%80%BB%E7%BB%93" class="hash-link" aria-label="微服务架构总结的直接链接" title="微服务架构总结的直接链接" translate="no">​</a></h2>
<p>微服务架构的本质，是通过 <strong>服务拆分和自治</strong> 来降低系统复杂度，并提升系统的可扩展性与可维护性。它使系统能够根据业务增长进行灵活扩展，并支持团队并行开发，从而更好地支撑大型互联网系统的发展。</p>
<p>但微服务并不是简单的技术升级，它需要配套的基础设施，例如服务注册中心、API 网关、消息系统、监控系统以及容器平台等。只有在完整技术体系支持下，微服务架构才能真正发挥价值。</p>
<p>在实际系统设计中，架构师需要根据业务规模、团队能力以及系统复杂度进行综合判断，选择最适合的架构模式，而不是盲目追求微服务化。真正优秀的架构设计，并不是技术最复杂的方案，而是 <strong>能够在复杂度与收益之间取得平衡的方案</strong>。</p>]]></content:encoded>
            <category>技术</category>
            <category>Java</category>
        </item>
        <item>
            <title><![CDATA[一级二级缓存设计]]></title>
            <link>https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun</link>
            <guid>https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun</guid>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[为什么需要多级缓存 在互联网系统中，随着业务规模不断增长，数据库往往会成为系统的性能瓶颈。大量请求如果直接访问数据库，不仅会带来高延迟，还会导致数据库压力过大，甚至出现连接耗尽、查询变慢等问题。]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么需要多级缓存">为什么需要多级缓存<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81%E5%A4%9A%E7%BA%A7%E7%BC%93%E5%AD%98" class="hash-link" aria-label="为什么需要多级缓存的直接链接" title="为什么需要多级缓存的直接链接" translate="no">​</a></h2>
<!-- -->
<p>在互联网系统中，随着业务规模不断增长，数据库往往会成为系统的性能瓶颈。大量请求如果直接访问数据库，不仅会带来高延迟，还会导致数据库压力过大，甚至出现连接耗尽、查询变慢等问题。因此，几乎所有高并发系统都会引入 <strong>缓存（Cache）</strong> 来提升系统性能。</p>
<p>最常见的缓存方式是使用 Redis 作为统一缓存层。客户端请求首先访问 Redis，如果缓存命中，就直接返回数据；如果缓存未命中，再访问数据库并将结果写入缓存。这种方式已经能够显著降低数据库压力。</p>
<p>但随着系统规模继续扩大，仅仅依赖 Redis 仍然可能出现新的问题。例如在高 QPS 场景下，大量请求同时访问 Redis，会产生网络开销和 Redis CPU 压力。同时，某些热点数据可能会被频繁读取，每次都经过网络访问 Redis，也会带来额外延迟。</p>
<p>为了解决这些问题，很多大型系统会引入 <strong>多级缓存架构（Multi-Level Cache）</strong>，其中最常见的一种模式就是 <strong>一级缓存 + 二级缓存设计</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="一级二级缓存的基本架构">一级二级缓存的基本架构<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#%E4%B8%80%E7%BA%A7%E4%BA%8C%E7%BA%A7%E7%BC%93%E5%AD%98%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%9E%B6%E6%9E%84" class="hash-link" aria-label="一级二级缓存的基本架构的直接链接" title="一级二级缓存的基本架构的直接链接" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://tanzhuo.xyz/assets/images/2026-04-Gemini_Generated_Image_a0c1wqa0c1wqa0c1-f8f48454a1f04bb95342ba3fc5447ebd.webp" width="1408" height="768" class="img_ev3q"></p>
<p>一级二级缓存本质上是一种 <strong>缓存分层架构</strong>。</p>
<p>通常系统会设计两层缓存：</p>
<p><strong>一级缓存（L1 Cache）</strong></p>
<p>一级缓存通常位于 <strong>应用进程内部</strong>，也称为 <strong>本地缓存（Local Cache）</strong>。例如使用：</p>
<ul>
<li class="">Go：bigcache / ristretto</li>
<li class="">Java：Caffeine / Guava Cache</li>
<li class="">Node：LRU Cache</li>
</ul>
<p>一级缓存的特点是：</p>
<ul>
<li class="">访问速度极快（内存访问）</li>
<li class="">不需要网络通信</li>
<li class="">每个服务实例都有自己的缓存</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="二级缓存l2-cache">二级缓存（L2 Cache）<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#%E4%BA%8C%E7%BA%A7%E7%BC%93%E5%AD%98l2-cache" class="hash-link" aria-label="二级缓存（L2 Cache）的直接链接" title="二级缓存（L2 Cache）的直接链接" translate="no">​</a></h3>
<p>二级缓存通常是 <strong>分布式缓存系统</strong>，最常见的是 Redis 或 Memcached。所有服务实例共享同一个缓存系统。</p>
<p>二级缓存的特点是：</p>
<ul>
<li class="">多节点共享</li>
<li class="">数据一致性更好</li>
<li class="">容量更大</li>
<li class="">支持分布式部署</li>
</ul>
<p>整个系统的访问流程通常是：</p>
<p>客户端请求<br>
→ 服务进程<br>
→ 查询一级缓存<br>
→ 未命中则查询二级缓存<br>
→ 再未命中则查询数据库</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="一级二级缓存访问流程">一级二级缓存访问流程<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#%E4%B8%80%E7%BA%A7%E4%BA%8C%E7%BA%A7%E7%BC%93%E5%AD%98%E8%AE%BF%E9%97%AE%E6%B5%81%E7%A8%8B" class="hash-link" aria-label="一级二级缓存访问流程的直接链接" title="一级二级缓存访问流程的直接链接" translate="no">​</a></h2>
<p>在实际系统中，一次请求的典型访问流程如下：</p>
<p>首先，请求进入应用服务。系统会优先查询 <strong>一级缓存</strong>。如果数据存在，直接返回结果，这种情况延迟最低，通常只需要微秒级时间。</p>
<p>如果一级缓存未命中，则继续查询 <strong>二级缓存（Redis）</strong>。如果 Redis 中存在数据，则返回结果，并将该数据写入一级缓存，以便后续请求可以直接命中本地缓存。</p>
<p>如果 Redis 中也没有数据，则说明缓存未命中，此时系统需要访问数据库。数据库返回结果后，系统会同时写入 Redis 和一级缓存，从而建立新的缓存数据。</p>
<p>整个流程可以理解为：</p>
<p>L1 Cache → L2 Cache → Database</p>
<p>通过这种方式，大部分请求都可以在缓存层被拦截，从而避免频繁访问数据库。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么要设计两级缓存">为什么要设计两级缓存<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E8%AE%BE%E8%AE%A1%E4%B8%A4%E7%BA%A7%E7%BC%93%E5%AD%98" class="hash-link" aria-label="为什么要设计两级缓存的直接链接" title="为什么要设计两级缓存的直接链接" translate="no">​</a></h2>
<p>一级缓存和二级缓存各自解决不同的问题，两者结合可以大幅提升系统性能。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="降低-redis-压力">降低 Redis 压力<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#%E9%99%8D%E4%BD%8E-redis-%E5%8E%8B%E5%8A%9B" class="hash-link" aria-label="降低 Redis 压力的直接链接" title="降低 Redis 压力的直接链接" translate="no">​</a></h3>
<p>在高并发系统中，如果所有请求都访问 Redis，Redis 可能成为新的瓶颈。通过一级缓存，大量热点数据可以直接在应用内存中返回，从而减少 Redis 请求数量。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="减少网络开销">减少网络开销<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#%E5%87%8F%E5%B0%91%E7%BD%91%E7%BB%9C%E5%BC%80%E9%94%80" class="hash-link" aria-label="减少网络开销的直接链接" title="减少网络开销的直接链接" translate="no">​</a></h3>
<p>访问 Redis 需要网络通信，即使延迟只有 1ms，在高 QPS 场景下也会产生明显开销。而一级缓存是进程内访问，速度远远快于网络调用。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="提升系统吞吐量">提升系统吞吐量<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#%E6%8F%90%E5%8D%87%E7%B3%BB%E7%BB%9F%E5%90%9E%E5%90%90%E9%87%8F" class="hash-link" aria-label="提升系统吞吐量的直接链接" title="提升系统吞吐量的直接链接" translate="no">​</a></h3>
<p>通过一级缓存，系统可以处理更多请求，而不会增加 Redis 或数据库负载。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="提升热点数据访问效率">提升热点数据访问效率<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#%E6%8F%90%E5%8D%87%E7%83%AD%E7%82%B9%E6%95%B0%E6%8D%AE%E8%AE%BF%E9%97%AE%E6%95%88%E7%8E%87" class="hash-link" aria-label="提升热点数据访问效率的直接链接" title="提升热点数据访问效率的直接链接" translate="no">​</a></h3>
<p>在很多业务场景中，少量热点数据会被频繁访问，例如：</p>
<ul>
<li class="">热门商品</li>
<li class="">用户信息</li>
<li class="">配置数据</li>
<li class="">推荐结果</li>
</ul>
<p>一级缓存可以让这些热点数据直接在本地命中。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="一级缓存设计需要注意的问题">一级缓存设计需要注意的问题<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#%E4%B8%80%E7%BA%A7%E7%BC%93%E5%AD%98%E8%AE%BE%E8%AE%A1%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E7%9A%84%E9%97%AE%E9%A2%98" class="hash-link" aria-label="一级缓存设计需要注意的问题的直接链接" title="一级缓存设计需要注意的问题的直接链接" translate="no">​</a></h2>
<p>虽然一级缓存性能很好，但它也会带来一些新的问题。</p>
<p>首先是 <strong>数据一致性问题</strong>。由于一级缓存存在于每个服务实例中，不同实例的缓存数据可能不同步。当数据更新时，如果没有正确的缓存失效机制，可能会导致读取到旧数据。</p>
<p>为了解决这个问题，通常会采用 <strong>缓存失效策略</strong>。例如在数据更新时，通过消息队列或发布订阅机制通知所有服务实例清除本地缓存。</p>
<p>第二个问题是 <strong>缓存容量控制</strong>。一级缓存存在于应用内存中，如果缓存数据过多，可能会占用大量内存，影响系统稳定性。因此通常会使用 LRU 或 LFU 等策略限制缓存大小。</p>
<p>第三个问题是 <strong>缓存穿透和缓存击穿</strong>。当大量请求同时访问不存在的数据，可能会直接冲击数据库。通常可以通过布隆过滤器或互斥锁机制进行防护。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="缓存更新策略设计">缓存更新策略设计<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#%E7%BC%93%E5%AD%98%E6%9B%B4%E6%96%B0%E7%AD%96%E7%95%A5%E8%AE%BE%E8%AE%A1" class="hash-link" aria-label="缓存更新策略设计的直接链接" title="缓存更新策略设计的直接链接" translate="no">​</a></h2>
<p>在多级缓存系统中，缓存更新策略非常关键。</p>
<p>常见策略包括：</p>
<p><strong>Cache Aside（旁路缓存）</strong></p>
<p>应用程序先查询缓存，如果未命中再查询数据库，然后写入缓存。这是最常见的一种模式。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="write-through写穿透">Write Through（写穿透）<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#write-through%E5%86%99%E7%A9%BF%E9%80%8F" class="hash-link" aria-label="Write Through（写穿透）的直接链接" title="Write Through（写穿透）的直接链接" translate="no">​</a></h3>
<p>应用在写入数据库的同时也更新缓存，保证缓存和数据库数据同步。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="write-back写回缓存">Write Back（写回缓存）<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#write-back%E5%86%99%E5%9B%9E%E7%BC%93%E5%AD%98" class="hash-link" aria-label="Write Back（写回缓存）的直接链接" title="Write Back（写回缓存）的直接链接" translate="no">​</a></h3>
<p>应用只写缓存，由缓存系统异步写入数据库。这种方式性能更高，但实现复杂。</p>
<p>在互联网系统中，大多数业务都会采用 <strong>Cache Aside 模式</strong>，因为它实现简单且稳定。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="一级二级缓存架构适用场景">一级二级缓存架构适用场景<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#%E4%B8%80%E7%BA%A7%E4%BA%8C%E7%BA%A7%E7%BC%93%E5%AD%98%E6%9E%B6%E6%9E%84%E9%80%82%E7%94%A8%E5%9C%BA%E6%99%AF" class="hash-link" aria-label="一级二级缓存架构适用场景的直接链接" title="一级二级缓存架构适用场景的直接链接" translate="no">​</a></h2>
<p>多级缓存架构通常适用于以下场景：</p>
<p><strong>高并发读取系统</strong></p>
<p>例如商品详情页、用户信息查询、配置读取等。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="热点数据访问频繁">热点数据访问频繁<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#%E7%83%AD%E7%82%B9%E6%95%B0%E6%8D%AE%E8%AE%BF%E9%97%AE%E9%A2%91%E7%B9%81" class="hash-link" aria-label="热点数据访问频繁的直接链接" title="热点数据访问频繁的直接链接" translate="no">​</a></h3>
<p>例如排行榜、推荐列表等。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="数据库压力较大">数据库压力较大<a href="https://tanzhuo.xyz/2026/03/15/wei-fu-wu-yi-er-ji-huan-cun#%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8E%8B%E5%8A%9B%E8%BE%83%E5%A4%A7" class="hash-link" aria-label="数据库压力较大的直接链接" title="数据库压力较大的直接链接" translate="no">​</a></h3>
<p>通过缓存层可以显著减少数据库查询次数。</p>
<p>对于一些实时一致性要求非常高的系统，例如金融交易系统，通常不会使用多级缓存，而是直接访问数据库。</p>]]></content:encoded>
            <category>技术</category>
            <category>Java</category>
            <category>Redis</category>
        </item>
        <item>
            <title><![CDATA[ETCD 探索]]></title>
            <link>https://tanzhuo.xyz/2026/03/14/da-jian-etcdji-qun</link>
            <guid>https://tanzhuo.xyz/2026/03/14/da-jian-etcdji-qun</guid>
            <pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[在分布式系统中，经常会遇到这样的问题： 服务节点需要共享配置 系统需要做服务发现 分布式锁需要一个协调中心 集群需要一个一致性的状态存储 这些问题，本质上都需要一个 可靠的分布式协调系统。]]></description>
            <content:encoded><![CDATA[<p>在分布式系统中，经常会遇到这样的问题：</p>
<!-- -->
<ul>
<li class="">服务节点需要共享配置</li>
<li class="">系统需要做服务发现</li>
<li class="">分布式锁需要一个协调中心</li>
<li class="">集群需要一个一致性的状态存储</li>
</ul>
<p>这些问题，本质上都需要一个 <strong>可靠的分布式协调系统</strong>。</p>
<p>而在现代云原生体系中，最常用的组件就是 <strong>etcd</strong>。</p>
<p>例如：</p>
<ul>
<li class="">Kubernetes</li>
<li class="">CoreDNS</li>
<li class="">service mesh</li>
<li class="">分布式配置中心</li>
</ul>
<p>这些系统的底层都依赖 etcd。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="etcd-是什么">etcd 是什么<a href="https://tanzhuo.xyz/2026/03/14/da-jian-etcdji-qun#etcd-%E6%98%AF%E4%BB%80%E4%B9%88" class="hash-link" aria-label="etcd 是什么的直接链接" title="etcd 是什么的直接链接" translate="no">​</a></h2>
<p>简单来说：</p>
<p><strong>etcd 就是一个高可靠的分布式 Key-Value 数据库。</strong></p>
<p>但它和普通数据库最大的区别是：</p>
<p><strong>它是为“分布式协调”而设计的。</strong></p>
<p>它的主要特点有：</p>
<ul>
<li class="">强一致（Strong Consistency）</li>
<li class="">支持分布式集群</li>
<li class="">提供 Watch 监听机制</li>
<li class="">支持事务</li>
<li class="">提供租约（Lease）机制</li>
</ul>
<p>很多分布式系统都会用 etcd 做：</p>
<ul>
<li class="">服务注册中心</li>
<li class="">配置中心</li>
<li class="">分布式锁</li>
<li class="">Leader 选举</li>
</ul>
<p>例如 Kubernetes 就把整个 <strong>集群状态</strong> 存在 etcd 中。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="强一致性raft-共识算法">强一致性（Raft 共识算法）<a href="https://tanzhuo.xyz/2026/03/14/da-jian-etcdji-qun#%E5%BC%BA%E4%B8%80%E8%87%B4%E6%80%A7raft-%E5%85%B1%E8%AF%86%E7%AE%97%E6%B3%95" class="hash-link" aria-label="强一致性（Raft 共识算法）的直接链接" title="强一致性（Raft 共识算法）的直接链接" translate="no">​</a></h2>
<p>etcd 内部使用的是 <strong>Raft 共识算法</strong>。</p>
<p>Raft 的核心思想是：</p>
<p>整个集群中会选举出一个 <strong>Leader 节点</strong>。</p>
<p>所有写请求必须经过 Leader。</p>
<p>流程大致是：</p>
<p>客户端 → Leader → 同步到多数节点 → 提交成功</p>
<p>只有当：</p>
<p><strong>超过一半节点确认写入</strong></p>
<p>数据才算真正提交。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="etcd-集群搭建">etcd 集群搭建<a href="https://tanzhuo.xyz/2026/03/14/da-jian-etcdji-qun#etcd-%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA" class="hash-link" aria-label="etcd 集群搭建的直接链接" title="etcd 集群搭建的直接链接" translate="no">​</a></h2>
<p>部署环境：</p>
<p>操作系统：</p>
<p>Debian 11.5.0</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-下载-etcd">1 下载 etcd<a href="https://tanzhuo.xyz/2026/03/14/da-jian-etcdji-qun#1-%E4%B8%8B%E8%BD%BD-etcd" class="hash-link" aria-label="1 下载 etcd的直接链接" title="1 下载 etcd的直接链接" translate="no">​</a></h3>
<p>从 github 下载 etcd 二进制文件：</p>
<p><a href="https://github.com/etcd-io/etcd/releases?ref=tanzhuo.xyz" target="_blank" rel="noopener noreferrer" class="">https://github.com/etcd-io/etcd/releases</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-安装-etcd">2 安装 etcd<a href="https://tanzhuo.xyz/2026/03/14/da-jian-etcdji-qun#2-%E5%AE%89%E8%A3%85-etcd" class="hash-link" aria-label="2 安装 etcd的直接链接" title="2 安装 etcd的直接链接" translate="no">​</a></h3>
<p>解压之后，将以下文件放入：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">/usr/local/bin</span><br></div></code></pre></div></div>
<p>主要是：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">etcd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">etcdctl</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-设置执行权限">3 设置执行权限<a href="https://tanzhuo.xyz/2026/03/14/da-jian-etcdji-qun#3-%E8%AE%BE%E7%BD%AE%E6%89%A7%E8%A1%8C%E6%9D%83%E9%99%90" class="hash-link" aria-label="3 设置执行权限的直接链接" title="3 设置执行权限的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">sudo chmod +x /usr/local/bin/etcd</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">sudo chmod +x /usr/local/bin/etcdctl</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-验证集群">4 验证集群<a href="https://tanzhuo.xyz/2026/03/14/da-jian-etcdji-qun#4-%E9%AA%8C%E8%AF%81%E9%9B%86%E7%BE%A4" class="hash-link" aria-label="4 验证集群的直接链接" title="4 验证集群的直接链接" translate="no">​</a></h3>
<p>可以使用 etcdctl 查看数据：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">ETCDCTL_API=3 etcdctl \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--cacert=/opt/etcd/ssl/ca.pem \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--cert=/opt/etcd/ssl/server.pem \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--key=/opt/etcd/ssl/server-key.pem \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--endpoints="https://172.24.93.151:2379,https://172.24.93.149:2379,https://172.24.93.150:2379" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">get / --prefix --keys-only</span><br></div></code></pre></div></div>
<p>删除 key：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">ETCDCTL_API=3 etcdctl \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--cacert=/opt/etcd/ssl/ca.pem \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--cert=/opt/etcd/ssl/server.pem \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--key=/opt/etcd/ssl/server-key.pem \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--endpoints="https://172.24.93.151:2379,https://172.24.93.149:2379,https://172.24.93.150:2379" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">del --prefix ""</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="etcd-为什么比-redis-更适合做分布式协调">etcd 为什么比 Redis 更适合做分布式协调<a href="https://tanzhuo.xyz/2026/03/14/da-jian-etcdji-qun#etcd-%E4%B8%BA%E4%BB%80%E4%B9%88%E6%AF%94-redis-%E6%9B%B4%E9%80%82%E5%90%88%E5%81%9A%E5%88%86%E5%B8%83%E5%BC%8F%E5%8D%8F%E8%B0%83" class="hash-link" aria-label="etcd 为什么比 Redis 更适合做分布式协调的直接链接" title="etcd 为什么比 Redis 更适合做分布式协调的直接链接" translate="no">​</a></h2>
<p>很多人会问：</p>
<p>Redis 不是也可以做分布式锁吗？</p>
<p>确实可以。</p>
<p>但 Redis 是 <strong>AP 系统</strong>，而 etcd 是 <strong>CP 系统</strong>。</p>
<p>简单理解就是：</p>
<p>Redis 更注重 <strong>可用性与性能</strong>。</p>
<p>etcd 更注重 <strong>一致性与可靠性</strong>。</p>]]></content:encoded>
            <category>技术</category>
            <category>Java</category>
            <category>Linux</category>
        </item>
        <item>
            <title><![CDATA[Flink 理解]]></title>
            <link>https://tanzhuo.xyz/2026/03/14/flink-ji-qun-da-jian</link>
            <guid>https://tanzhuo.xyz/2026/03/14/flink-ji-qun-da-jian</guid>
            <pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[前言 在大数据系统的发展过程中，一直存在一个核心问题： 数据越来越多，但处理速度越来越慢。 传统的数据处理方式，大多数是 离线处理。]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="前言">前言<a href="https://tanzhuo.xyz/2026/03/14/flink-ji-qun-da-jian#%E5%89%8D%E8%A8%80" class="hash-link" aria-label="前言的直接链接" title="前言的直接链接" translate="no">​</a></h2>
<!-- -->
<p>在大数据系统的发展过程中，一直存在一个核心问题：</p>
<p><strong>数据越来越多，但处理速度越来越慢。</strong></p>
<p>传统的数据处理方式，大多数是 <strong>离线处理</strong>。</p>
<p>例如：</p>
<p>每天晚上跑一次任务：</p>
<ul>
<li class="">统计用户行为</li>
<li class="">计算广告数据</li>
<li class="">生成报表</li>
<li class="">分析业务指标</li>
</ul>
<p>这种方式叫：</p>
<p><strong>Batch Processing（批处理）</strong></p>
<p>典型工具例如：</p>
<ul>
<li class="">Hadoop MapReduce</li>
<li class="">Hive</li>
<li class="">Spark</li>
</ul>
<p>这些系统适合处理 <strong>海量历史数据</strong>。</p>
<p>但是随着互联网的发展，很多业务开始需要：</p>
<p><strong>实时数据处理。</strong></p>
<p>例如：</p>
<ul>
<li class="">实时风控</li>
<li class="">实时推荐</li>
<li class="">实时监控</li>
<li class="">实时广告竞价</li>
<li class="">实时日志分析</li>
</ul>
<p>这些场景有一个共同特点：</p>
<p><strong>数据必须“边产生边处理”。</strong></p>
<p>不能等到第二天。</p>
<p>于是就出现了一个新的计算模式：</p>
<p><strong>Stream Processing（流式计算）。</strong></p>
<p><img decoding="async" loading="lazy" src="https://tanzhuo.xyz/assets/images/2026-04-Gemini_Generated_Image_xvg9q2xvg9q2xvg9-d0ff4be7b9e2ef01d55dbbf821b03ac4.webp" width="1600" height="873" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么需要-flink">为什么需要 Flink<a href="https://tanzhuo.xyz/2026/03/14/flink-ji-qun-da-jian#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81-flink" class="hash-link" aria-label="为什么需要 Flink的直接链接" title="为什么需要 Flink的直接链接" translate="no">​</a></h2>
<p>早期实时计算系统主要依赖：</p>
<ul>
<li class="">Storm</li>
<li class="">Spark Streaming</li>
</ul>
<p>但这些系统都有一些问题。</p>
<p>例如：</p>
<p>Storm 虽然是流计算系统，但：</p>
<ul>
<li class="">开发复杂</li>
<li class="">容错能力一般</li>
<li class="">状态管理困难</li>
</ul>
<p>Spark Streaming 虽然稳定，但它的本质是：</p>
<p><strong>微批处理（Micro Batch）。</strong></p>
<p>也就是说：</p>
<p>它并不是真正的流计算。</p>
<p>例如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">每1秒处理一批数据</span><br></div></code></pre></div></div>
<p>这种模式在很多场景下仍然不够实时。</p>
<p>于是 Flink 出现了。</p>
<p>Flink 的目标很明确：</p>
<p><strong>构建一个真正的流计算系统。</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flink-解决了什么问题">Flink 解决了什么问题<a href="https://tanzhuo.xyz/2026/03/14/flink-ji-qun-da-jian#flink-%E8%A7%A3%E5%86%B3%E4%BA%86%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98" class="hash-link" aria-label="Flink 解决了什么问题的直接链接" title="Flink 解决了什么问题的直接链接" translate="no">​</a></h2>
<p>Flink 的出现，主要解决了几个关键问题。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-实时数据处理">1 实时数据处理<a href="https://tanzhuo.xyz/2026/03/14/flink-ji-qun-da-jian#1-%E5%AE%9E%E6%97%B6%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86" class="hash-link" aria-label="1 实时数据处理的直接链接" title="1 实时数据处理的直接链接" translate="no">​</a></h3>
<p>Flink 可以实现真正的 <strong>毫秒级实时计算</strong>。</p>
<p>例如：</p>
<p>用户点击商品：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">点击 → Kafka → Flink → 实时推荐</span><br></div></code></pre></div></div>
<p>整个过程可能只需要：</p>
<p><strong>几十毫秒。</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="状态管理问题">状态管理问题<a href="https://tanzhuo.xyz/2026/03/14/flink-ji-qun-da-jian#%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86%E9%97%AE%E9%A2%98" class="hash-link" aria-label="状态管理问题的直接链接" title="状态管理问题的直接链接" translate="no">​</a></h3>
<p>在流计算中，一个非常重要的问题是：</p>
<p><strong>状态（State）。</strong></p>
<p>例如：</p>
<p>统计用户点击次数：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">用户A 点击 1次</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">用户A 点击 2次</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">用户A 点击 3次</span><br></div></code></pre></div></div>
<p>系统需要记住之前的数据。</p>
<p>Flink 内置了 <strong>状态管理机制</strong>：</p>
<ul>
<li class="">Keyed State</li>
<li class="">Operator State</li>
</ul>
<p>并且支持：</p>
<ul>
<li class="">本地状态</li>
<li class="">RocksDB 状态存储</li>
</ul>
<p>这样可以处理 <strong>超大规模状态数据</strong>。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="容错问题">容错问题<a href="https://tanzhuo.xyz/2026/03/14/flink-ji-qun-da-jian#%E5%AE%B9%E9%94%99%E9%97%AE%E9%A2%98" class="hash-link" aria-label="容错问题的直接链接" title="容错问题的直接链接" translate="no">​</a></h3>
<p>在分布式系统中，节点宕机是常态。</p>
<p>Flink 通过 <strong>Checkpoint 机制</strong> 来保证数据安全。</p>
<p>简单来说：</p>
<p>系统会定期保存计算状态。</p>
<p>如果节点宕机：</p>
<p>系统可以从 <strong>Checkpoint 恢复计算</strong>。</p>
<p>这种机制保证了：</p>
<p><strong>Exactly Once（精准一次处理）。</strong></p>
<p>也就是说：</p>
<p>每条数据只会被处理一次。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="事件时间问题">事件时间问题<a href="https://tanzhuo.xyz/2026/03/14/flink-ji-qun-da-jian#%E4%BA%8B%E4%BB%B6%E6%97%B6%E9%97%B4%E9%97%AE%E9%A2%98" class="hash-link" aria-label="事件时间问题的直接链接" title="事件时间问题的直接链接" translate="no">​</a></h3>
<p>在流计算中，有一个非常难的问题：</p>
<p>事件时间（Event Time）。</p>
<p>例如：</p>
<p>日志数据可能会延迟到达。</p>
<p>如果只按系统时间计算，就会出现统计错误。</p>
<p>Flink 引入了：</p>
<p><strong>Watermark（水位线）机制。</strong></p>
<p>Watermark 可以帮助系统判断：</p>
<p>哪些数据已经“基本到齐”。</p>
<p>这样就可以正确处理：</p>
<ul>
<li class="">延迟数据</li>
<li class="">窗口计算</li>
<li class="">时间聚合</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flink-的核心设计思想">Flink 的核心设计思想<a href="https://tanzhuo.xyz/2026/03/14/flink-ji-qun-da-jian#flink-%E7%9A%84%E6%A0%B8%E5%BF%83%E8%AE%BE%E8%AE%A1%E6%80%9D%E6%83%B3" class="hash-link" aria-label="Flink 的核心设计思想的直接链接" title="Flink 的核心设计思想的直接链接" translate="no">​</a></h2>
<p>Flink 的设计有几个非常重要的理念。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-stream-first">1 Stream First<a href="https://tanzhuo.xyz/2026/03/14/flink-ji-qun-da-jian#1-stream-first" class="hash-link" aria-label="1 Stream First的直接链接" title="1 Stream First的直接链接" translate="no">​</a></h3>
<p>Flink 的核心理念是：</p>
<p><strong>一切都是流。</strong></p>
<p>批处理只是：</p>
<p><strong>有限数据流。</strong></p>
<p>因此：</p>
<p>Flink 的 Batch 和 Stream 使用同一套引擎。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="state-driven">State Driven<a href="https://tanzhuo.xyz/2026/03/14/flink-ji-qun-da-jian#state-driven" class="hash-link" aria-label="State Driven的直接链接" title="State Driven的直接链接" translate="no">​</a></h3>
<p>Flink 是一个 <strong>状态驱动计算系统</strong>。</p>
<p>所有计算都围绕状态展开。</p>
<p>例如：</p>
<ul>
<li class="">用户行为统计</li>
<li class="">实时聚合</li>
<li class="">实时监控</li>
</ul>
<p>这些都依赖状态管理。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="exactly-once">Exactly Once<a href="https://tanzhuo.xyz/2026/03/14/flink-ji-qun-da-jian#exactly-once" class="hash-link" aria-label="Exactly Once的直接链接" title="Exactly Once的直接链接" translate="no">​</a></h3>
<p>Flink 非常强调：</p>
<p><strong>数据处理的正确性。</strong></p>
<p>通过：</p>
<ul>
<li class="">Checkpoint</li>
<li class="">分布式快照</li>
<li class="">两阶段提交</li>
</ul>
<p>Flink 可以实现：</p>
<p><strong>Exactly Once 语义。</strong></p>
<p>这是很多实时系统非常关键的能力。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flink-在实际系统中的应用">Flink 在实际系统中的应用<a href="https://tanzhuo.xyz/2026/03/14/flink-ji-qun-da-jian#flink-%E5%9C%A8%E5%AE%9E%E9%99%85%E7%B3%BB%E7%BB%9F%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8" class="hash-link" aria-label="Flink 在实际系统中的应用的直接链接" title="Flink 在实际系统中的应用的直接链接" translate="no">​</a></h2>
<p>Flink 在很多互联网公司都有大量应用。</p>
<p>典型场景包括：</p>
<p>实时推荐系统</p>
<p>用户行为分析</p>
<p>广告点击统计</p>
<p>实时风控系统</p>
<p>日志实时分析</p>
<p>例如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">用户行为 → Kafka → Flink → ClickHouse</span><br></div></code></pre></div></div>
<p>Flink 在中间负责：</p>
<ul>
<li class="">数据清洗</li>
<li class="">实时计算</li>
<li class="">实时聚合</li>
</ul>]]></content:encoded>
            <category>技术</category>
        </item>
        <item>
            <title><![CDATA[Netty 深入学习]]></title>
            <link>https://tanzhuo.xyz/2026/03/14/netty-shen-ru-xue-xi</link>
            <guid>https://tanzhuo.xyz/2026/03/14/netty-shen-ru-xue-xi</guid>
            <pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[在分布式系统、微服务架构中，网络通信是最基础也是最重要的一部分。 很多高性能框架（如 Dubbo、gRPC、RocketMQ、Elasticsearch 等）底层都依赖 Netty 来完成网络通信。]]></description>
            <content:encoded><![CDATA[<p>在分布式系统、微服务架构中，网络通信是最基础也是最重要的一部分。<br>
很多高性能框架（如 Dubbo、gRPC、RocketMQ、Elasticsearch 等）底层都依赖 <strong>Netty</strong> 来完成网络通信。</p>
<!-- -->
<p>理解 Netty，首先要理解它背后的 <strong>NIO 网络模型设计思想</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="传统网络编程的问题">传统网络编程的问题<a href="https://tanzhuo.xyz/2026/03/14/netty-shen-ru-xue-xi#%E4%BC%A0%E7%BB%9F%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E7%9A%84%E9%97%AE%E9%A2%98" class="hash-link" aria-label="传统网络编程的问题的直接链接" title="传统网络编程的问题的直接链接" translate="no">​</a></h2>
<p>在早期 Java 网络编程中，大多数程序使用的是 <strong>BIO（Blocking IO）</strong> 模型。</p>
<p>例如：</p>
<p>服务器每接入一个客户端连接，就创建一个线程。</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">一个连接 = 一个线程</span><br></div></code></pre></div></div>
<p>如果连接很多，比如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">1万连接 = 1万个线程</span><br></div></code></pre></div></div>
<p>这会带来几个严重问题：</p>
<p><strong>线程资源消耗巨大</strong></p>
<p>线程本身需要内存和调度成本。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="线程上下文切换开销大">线程上下文切换开销大<a href="https://tanzhuo.xyz/2026/03/14/netty-shen-ru-xue-xi#%E7%BA%BF%E7%A8%8B%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2%E5%BC%80%E9%94%80%E5%A4%A7" class="hash-link" aria-label="线程上下文切换开销大的直接链接" title="线程上下文切换开销大的直接链接" translate="no">​</a></h3>
<p>CPU需要频繁在不同线程之间切换。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="系统扩展性差">系统扩展性差<a href="https://tanzhuo.xyz/2026/03/14/netty-shen-ru-xue-xi#%E7%B3%BB%E7%BB%9F%E6%89%A9%E5%B1%95%E6%80%A7%E5%B7%AE" class="hash-link" aria-label="系统扩展性差的直接链接" title="系统扩展性差的直接链接" translate="no">​</a></h3>
<p>连接数量一多，系统就容易崩溃。</p>
<p>因此，传统 BIO 并不适合 <strong>高并发网络服务</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nio-的核心设计思想">NIO 的核心设计思想<a href="https://tanzhuo.xyz/2026/03/14/netty-shen-ru-xue-xi#nio-%E7%9A%84%E6%A0%B8%E5%BF%83%E8%AE%BE%E8%AE%A1%E6%80%9D%E6%83%B3" class="hash-link" aria-label="NIO 的核心设计思想的直接链接" title="NIO 的核心设计思想的直接链接" translate="no">​</a></h2>
<p>为了解决 BIO 的问题，Java 提出了 <strong>NIO（Non-Blocking IO）</strong>。</p>
<p>NIO 的核心思想非常简单：</p>
<blockquote>
<p><strong>用少量线程，管理大量连接</strong></p>
</blockquote>
<p>它依赖三个核心组件：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Channel</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Buffer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Selector</span><br></div></code></pre></div></div>
<p>这三者构成了 NIO 的核心架构。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="channel通道">Channel（通道）<a href="https://tanzhuo.xyz/2026/03/14/netty-shen-ru-xue-xi#channel%E9%80%9A%E9%81%93" class="hash-link" aria-label="Channel（通道）的直接链接" title="Channel（通道）的直接链接" translate="no">​</a></h2>
<p>Channel 可以理解为：</p>
<blockquote>
<p><strong>数据传输的管道</strong></p>
</blockquote>
<p>和传统 IO 不同的是：</p>
<p>传统 IO：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">输入流 / 输出流</span><br></div></code></pre></div></div>
<p>而 Channel：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">是双向的</span><br></div></code></pre></div></div>
<p>既可以读，也可以写。Channel 本质就是 <strong>网络连接的抽象</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="buffer缓冲区">Buffer（缓冲区）<a href="https://tanzhuo.xyz/2026/03/14/netty-shen-ru-xue-xi#buffer%E7%BC%93%E5%86%B2%E5%8C%BA" class="hash-link" aria-label="Buffer（缓冲区）的直接链接" title="Buffer（缓冲区）的直接链接" translate="no">​</a></h2>
<p>在 NIO 中，所有数据都必须先进入 <strong>Buffer</strong>。</p>
<p>可以理解为：</p>
<blockquote>
<p><strong>数据的临时存储区域</strong></p>
</blockquote>
<p>数据流程：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">网络 -&gt; Buffer -&gt; 程序</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">程序 -&gt; Buffer -&gt; 网络</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="selector选择器">Selector（选择器）<a href="https://tanzhuo.xyz/2026/03/14/netty-shen-ru-xue-xi#selector%E9%80%89%E6%8B%A9%E5%99%A8" class="hash-link" aria-label="Selector（选择器）的直接链接" title="Selector（选择器）的直接链接" translate="no">​</a></h2>
<p>Selector 是 <strong>NIO 最核心的组件</strong>。</p>
<p>它的作用是：</p>
<blockquote>
<p><strong>用一个线程管理多个 Channel</strong></p>
</blockquote>
<p>也就是：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">一个线程</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">监听多个连接</span><br></div></code></pre></div></div>
<p>工作方式类似：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">事件轮询</span><br></div></code></pre></div></div>
<p>流程：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Selector</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">监听多个 Channel</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">哪个 Channel 有事件</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">处理哪个</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reactor-线程模型">Reactor 线程模型<a href="https://tanzhuo.xyz/2026/03/14/netty-shen-ru-xue-xi#reactor-%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8B" class="hash-link" aria-label="Reactor 线程模型的直接链接" title="Reactor 线程模型的直接链接" translate="no">​</a></h2>
<p>Reactor 线程模型是一种 <strong>高并发网络服务器常用的设计模式</strong>。它的核心思想是：<strong>用少量线程，通过事件驱动的方式去处理大量网络连接</strong>。线程不再为每一个连接单独创建，而是通过监听网络事件（连接、读、写等），当某个连接有数据到达时再去处理它。这样就避免了大量线程带来的资源消耗和上下文切换问题，大大提升了服务器的并发处理能力。</p>
<p><img decoding="async" loading="lazy" src="https://tanzhuo.xyz/assets/images/2026-03-6f2341a1-2edd-42d2-b66a-a174f49001c4-1d85f6faeca7214b64186dc69cd8562e.webp" width="1536" height="1024" class="img_ev3q"></p>
<p>Reactor 模型通常包含几个关键角色：</p>
<p><strong>1、事件监听（Reactor）</strong>
负责监听网络事件，例如新的连接到来、数据可读、数据可写等。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2连接接入acceptor">2、连接接入（Acceptor）<a href="https://tanzhuo.xyz/2026/03/14/netty-shen-ru-xue-xi#2%E8%BF%9E%E6%8E%A5%E6%8E%A5%E5%85%A5acceptor" class="hash-link" aria-label="2、连接接入（Acceptor）的直接链接" title="2、连接接入（Acceptor）的直接链接" translate="no">​</a></h3>
<p>当有新的客户端连接时，负责接收连接并注册到后续的处理线程中。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3事件分发dispatcher">3、事件分发（Dispatcher）<a href="https://tanzhuo.xyz/2026/03/14/netty-shen-ru-xue-xi#3%E4%BA%8B%E4%BB%B6%E5%88%86%E5%8F%91dispatcher" class="hash-link" aria-label="3、事件分发（Dispatcher）的直接链接" title="3、事件分发（Dispatcher）的直接链接" translate="no">​</a></h3>
<p>将不同的网络事件分发给对应的处理逻辑。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4业务处理handler">4、业务处理（Handler）<a href="https://tanzhuo.xyz/2026/03/14/netty-shen-ru-xue-xi#4%E4%B8%9A%E5%8A%A1%E5%A4%84%E7%90%86handler" class="hash-link" aria-label="4、业务处理（Handler）的直接链接" title="4、业务处理（Handler）的直接链接" translate="no">​</a></h3>
<p>真正执行业务逻辑，比如解析协议、处理请求、返回结果。</p>
<p>在 Netty 中，Reactor 模型通常体现为 <strong>BossGroup + WorkerGroup 的线程结构</strong>：</p>
<ul>
<li class=""><strong>Boss 线程</strong>：负责接收客户端连接</li>
<li class=""><strong>Worker 线程</strong>：负责处理网络读写和业务逻辑</li>
</ul>
<p>通过这种设计，Netty 可以用 <strong>少量线程处理成千上万的连接</strong>，这也是它能够实现高性能网络通信的核心原因。</p>]]></content:encoded>
            <category>技术</category>
            <category>Java</category>
        </item>
        <item>
            <title><![CDATA[Redis分布式锁]]></title>
            <link>https://tanzhuo.xyz/2026/03/14/redisfen-bu-shi-tan-suo</link>
            <guid>https://tanzhuo.xyz/2026/03/14/redisfen-bu-shi-tan-suo</guid>
            <pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[很多人在刚接触分布式系统的时候，都会遇到一个问题： 多个服务实例同时处理同一件事情，如何避免数据被重复处理？ 例如： 用户抢优惠券 定时任务执行 库存扣减 订单状态更新 如果系统只有一个进程，其实很简单，用 本地锁（…]]></description>
            <content:encoded><![CDATA[<p>很多人在刚接触分布式系统的时候，都会遇到一个问题：<br>
<strong>多个服务实例同时处理同一件事情，如何避免数据被重复处理？</strong></p>
<!-- -->
<p>例如：</p>
<ul>
<li class="">用户抢优惠券</li>
<li class="">定时任务执行</li>
<li class="">库存扣减</li>
<li class="">订单状态更新</li>
</ul>
<p>如果系统只有一个进程，其实很简单，用 <strong>本地锁（mutex）</strong> 就能解决。</p>
<p>但在微服务架构或者集群部署之后，问题就变了。</p>
<p>系统可能有：</p>
<ul>
<li class="">10个服务实例</li>
<li class="">100个Worker</li>
<li class="">甚至多个数据中心</li>
</ul>
<p>这时候，本地锁就完全失效了，因为不同进程之间根本不知道彼此的锁状态。</p>
<p>于是就出现了一个概念：</p>
<p><strong>分布式锁（Distributed Lock）</strong></p>
<p>分布式锁的目标很简单：</p>
<blockquote>
<p>在分布式环境下，保证某一时刻只有一个节点能执行某段逻辑。</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="为什么-redis-可以做分布式锁">为什么 Redis 可以做分布式锁？<a href="https://tanzhuo.xyz/2026/03/14/redisfen-bu-shi-tan-suo#%E4%B8%BA%E4%BB%80%E4%B9%88-redis-%E5%8F%AF%E4%BB%A5%E5%81%9A%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81" class="hash-link" aria-label="为什么 Redis 可以做分布式锁？的直接链接" title="为什么 Redis 可以做分布式锁？的直接链接" translate="no">​</a></h2>
<p>在实现分布式锁的时候，很多人第一反应是数据库。</p>
<p>例如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">select ... for update</span><br></div></code></pre></div></div>
<p>但数据库锁的问题是：</p>
<ul>
<li class="">性能差</li>
<li class="">锁粒度大</li>
<li class="">并发高时压力很大</li>
</ul>
<p>于是大家开始寻找一个更适合做锁的系统。</p>
<p>Redis就非常合适。</p>
<p>原因很简单：</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="redis天然具备三个优势">Redis天然具备三个优势<a href="https://tanzhuo.xyz/2026/03/14/redisfen-bu-shi-tan-suo#redis%E5%A4%A9%E7%84%B6%E5%85%B7%E5%A4%87%E4%B8%89%E4%B8%AA%E4%BC%98%E5%8A%BF" class="hash-link" aria-label="Redis天然具备三个优势的直接链接" title="Redis天然具备三个优势的直接链接" translate="no">​</a></h3>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1单线程模型">1）单线程模型<a href="https://tanzhuo.xyz/2026/03/14/redisfen-bu-shi-tan-suo#1%E5%8D%95%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8B" class="hash-link" aria-label="1）单线程模型的直接链接" title="1）单线程模型的直接链接" translate="no">​</a></h3>
<p>Redis核心命令是单线程执行的。</p>
<p>这意味着：</p>
<p>同一时间只有一个命令在执行。</p>
<p>所以像下面这种操作：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">SET key value NX</span><br></div></code></pre></div></div>
<p>是 <strong>绝对原子操作</strong>。</p>
<p>不会出现竞争条件。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2内存操作速度极快">2）内存操作，速度极快<a href="https://tanzhuo.xyz/2026/03/14/redisfen-bu-shi-tan-suo#2%E5%86%85%E5%AD%98%E6%93%8D%E4%BD%9C%E9%80%9F%E5%BA%A6%E6%9E%81%E5%BF%AB" class="hash-link" aria-label="2）内存操作，速度极快的直接链接" title="2）内存操作，速度极快的直接链接" translate="no">​</a></h3>
<p>Redis所有数据都在内存中。</p>
<p>一次锁操作通常只需要：</p>
<ul>
<li class="">一次 SET</li>
<li class="">一次 DEL</li>
</ul>
<p>延迟通常在：</p>
<p><strong>几十微秒级别</strong></p>
<p>远远比数据库快。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3支持自动过期">3）支持自动过期<a href="https://tanzhuo.xyz/2026/03/14/redisfen-bu-shi-tan-suo#3%E6%94%AF%E6%8C%81%E8%87%AA%E5%8A%A8%E8%BF%87%E6%9C%9F" class="hash-link" aria-label="3）支持自动过期的直接链接" title="3）支持自动过期的直接链接" translate="no">​</a></h3>
<p>Redis key 可以设置 TTL。</p>
<p>例如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">SET lock:order 123 NX EX 10</span><br></div></code></pre></div></div>
<p>含义是：</p>
<ul>
<li class="">不存在才创建</li>
<li class="">10秒自动过期</li>
</ul>
<p>这样即使服务崩溃，锁也不会永远卡住。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="redis锁释放">Redis锁释放<a href="https://tanzhuo.xyz/2026/03/14/redisfen-bu-shi-tan-suo#redis%E9%94%81%E9%87%8A%E6%94%BE" class="hash-link" aria-label="Redis锁释放的直接链接" title="Redis锁释放的直接链接" translate="no">​</a></h2>
<p>释放锁时不能直接 DEL。</p>
<p>因为可能发生这种情况：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">线程A获取锁</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">线程A执行超时</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">锁过期</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">线程B获取锁</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">线程A执行完删除锁</span><br></div></code></pre></div></div>
<p>这时候线程A会误删线程B的锁。</p>
<p>正确做法是：</p>
<p><strong>只删除自己持有的锁。</strong></p>
<p>通常通过 Lua 脚本实现：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">if redis.call("GET",KEYS[1]) == ARGV[1] then</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    return redis.call("DEL",KEYS[1])</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">else</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    return 0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">end</span><br></div></code></pre></div></div>
<p>这样才能保证安全释放。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="redis分布式锁的几个经典问题">redis分布式锁的几个经典问题<a href="https://tanzhuo.xyz/2026/03/14/redisfen-bu-shi-tan-suo#redis%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%E7%9A%84%E5%87%A0%E4%B8%AA%E7%BB%8F%E5%85%B8%E9%97%AE%E9%A2%98" class="hash-link" aria-label="redis分布式锁的几个经典问题的直接链接" title="redis分布式锁的几个经典问题的直接链接" translate="no">​</a></h2>
<p>虽然Redis锁很简单，但在真实系统中会遇到很多坑。</p>
<p>最常见的几个问题是：</p>
<p><strong>锁过期问题</strong></p>
<p>如果业务执行时间超过TTL：</p>
<p>锁就会提前释放。</p>
<p>其他节点就可能同时进入。</p>
<p>解决办法：</p>
<p><strong>自动续期（WatchDog）。</strong></p>
<p>例如：</p>
<ul>
<li class="">锁10秒</li>
<li class="">根据过期时间最后30%的时间进行自动秒续期一次，并添加抖动时间，防止在一个时刻进行续期，对Redis进行集中请求</li>
</ul>
<p>只要任务还在执行，锁就不会过期。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="redis单点问题">Redis单点问题<a href="https://tanzhuo.xyz/2026/03/14/redisfen-bu-shi-tan-suo#redis%E5%8D%95%E7%82%B9%E9%97%AE%E9%A2%98" class="hash-link" aria-label="Redis单点问题的直接链接" title="Redis单点问题的直接链接" translate="no">​</a></h3>
<p>如果Redis挂掉：</p>
<p>所有锁都会失效。</p>
<p>常见解决方案是：</p>
<ul>
<li class="">Redis Sentinel</li>
<li class="">Redis Cluster</li>
<li class="">RedLock算法</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="redis-ap设计与-etcdzookeeper-cp-架构区别">Redis AP设计与 ETCD，Zookeeper CP 架构区别<a href="https://tanzhuo.xyz/2026/03/14/redisfen-bu-shi-tan-suo#redis-ap%E8%AE%BE%E8%AE%A1%E4%B8%8E-etcdzookeeper-cp-%E6%9E%B6%E6%9E%84%E5%8C%BA%E5%88%AB" class="hash-link" aria-label="Redis AP设计与 ETCD，Zookeeper CP 架构区别的直接链接" title="Redis AP设计与 ETCD，Zookeeper CP 架构区别的直接链接" translate="no">​</a></h2>
<p>Redis本身是一个偏 <strong>AP（可用性优先）</strong> 的系统。</p>
<p>也就是说：</p>
<p>在网络分区或者节点故障的时候，Redis会优先保证服务可用，而不是保证数据绝对一致。</p>
<p>这就可能带来一个风险：</p>
<p>在极端情况下，<strong>可能同时出现两个客户端都认为自己拿到了锁</strong>。</p>
<p>例如：</p>
<p>客户端A在主节点获取了锁<br>
主节点还没来得及同步到从节点<br>
主节点突然宕机<br>
从节点被提升为新的主节点</p>
<p>这时候新的主节点并不知道A已经加过锁。</p>
<p>客户端B就可能再次获取锁。</p>
<p>这样就会出现：</p>
<p>两个客户端同时持有锁。</p>
<p>这就是Redis分布式锁在理论上的一致性风险。</p>
<p>相比之下，像 <strong>etcd 或 ZooKeeper</strong> 这样的系统是基于 <strong>CP模型（强一致）</strong> 设计的。</p>
<p>它们内部通过 <strong>Raft 或 ZAB 协议</strong> 保证多数节点确认之后才会提交数据。</p>
<p>因此：</p>
<p>一旦锁被获取成功，整个集群都会达成一致。</p>
<p>不会出现多个客户端同时拿到锁的情况。</p>
<p>所以在工程实践中通常有一个经验：</p>
<p>如果是 <strong>业务级锁（例如库存、任务控制）</strong><br>
Redis分布式锁通常已经足够使用。</p>
<p>但如果是 <strong>强一致要求很高的场景</strong><br>
例如：</p>
<p>金融交易<br>
全局调度系统<br>
分布式协调服务</p>
<p>很多系统会选择：</p>
<p>etcd / ZooKeeper 这种强一致的锁实现。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="redis分布式锁总结">Redis分布式锁总结<a href="https://tanzhuo.xyz/2026/03/14/redisfen-bu-shi-tan-suo#redis%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%E6%80%BB%E7%BB%93" class="hash-link" aria-label="Redis分布式锁总结的直接链接" title="Redis分布式锁总结的直接链接" translate="no">​</a></h2>
<p>Redis分布式锁的核心思想其实非常简单</p>
<p><strong>利用Redis原子操作实现互斥。</strong></p>
<p>它通常包含三个关键点：</p>
<p>1）原子加锁<br>
2）安全释放<br>
3）自动过期或续期</p>
<p>在实际工程中，一套成熟的Redis锁通常还会包含：</p>
<p><strong>重试机制</strong></p>
<ul>
<li class="">WatchDog自动续期</li>
<li class="">Lua安全释放</li>
<li class="">锁唯一标识</li>
</ul>
<p>这些设计组合在一起，才能真正成为一个稳定可靠的 <strong>分布式锁系统</strong>。</p>]]></content:encoded>
            <category>Redis</category>
            <category>Java</category>
        </item>
        <item>
            <title><![CDATA[算法：基础知识]]></title>
            <link>https://tanzhuo.xyz/2026/03/14/suan-fa-ji-chu-zhi-shi</link>
            <guid>https://tanzhuo.xyz/2026/03/14/suan-fa-ji-chu-zhi-shi</guid>
            <pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[什么是算法？ 算法，本质上就是 解决问题的一套步骤。 只要是： 输入一组数据 按照一定规则处理 得到结果 这整套处理过程，就是算法。 算法的理解 为什么程序员需要关心算法？因为同样一个问题，不同的算法效率可能差很多。]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="什么是算法">什么是算法？<a href="https://tanzhuo.xyz/2026/03/14/suan-fa-ji-chu-zhi-shi#%E4%BB%80%E4%B9%88%E6%98%AF%E7%AE%97%E6%B3%95" class="hash-link" aria-label="什么是算法？的直接链接" title="什么是算法？的直接链接" translate="no">​</a></h2>
<!-- -->
<p>算法，本质上就是 <strong>解决问题的一套步骤</strong>。</p>
<p>只要是：</p>
<p>输入一组数据<br>
按照一定规则处理<br>
得到结果</p>
<p>这整套处理过程，就是算法。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="算法的理解">算法的理解<a href="https://tanzhuo.xyz/2026/03/14/suan-fa-ji-chu-zhi-shi#%E7%AE%97%E6%B3%95%E7%9A%84%E7%90%86%E8%A7%A3" class="hash-link" aria-label="算法的理解的直接链接" title="算法的理解的直接链接" translate="no">​</a></h2>
<p>为什么程序员需要关心算法？因为同样一个问题，不同的算法效率可能差很多。有的做法可能几秒就能算出来，有的可能要跑好几分钟甚至更久。当数据量变大时，这种差距会越来越明显，所以很多系统性能好不好，其实和算法设计关系很大。</p>
<p>算法通常不会单独存在，它往往和数据结构一起使用。数据结构负责把数据组织好，比如数组、链表、树、哈希表这些；而算法则负责对这些数据进行操作。简单来说，一个负责存数据，一个负责处理数据，两者配合起来，程序才能高效运行。</p>
<p>在现实系统中，算法其实无处不在。比如搜索引擎要根据算法排序网页，短视频平台要用算法推荐内容，导航软件要用算法计算最短路线，电商平台也会用算法做商品推荐和排序。很多我们每天使用的软件，其实背后都有各种算法在工作。</p>
<p>学习算法并不是为了刷多少题，而是为了培养解决问题的思路。当遇到一个问题时，能快速想到几种解决方式，然后选择效率更高的一种，这才是算法真正的价值。很多经验丰富的工程师，其实都是在不断优化解决问题的方法。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="算法学习应该关注什么">算法学习应该关注什么？<a href="https://tanzhuo.xyz/2026/03/14/suan-fa-ji-chu-zhi-shi#%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E5%BA%94%E8%AF%A5%E5%85%B3%E6%B3%A8%E4%BB%80%E4%B9%88" class="hash-link" aria-label="算法学习应该关注什么？的直接链接" title="算法学习应该关注什么？的直接链接" translate="no">​</a></h2>
<p>很多人学习算法时容易陷入刷题。</p>
<p>但实际上更重要的是理解：</p>
<p>1.问题如何建模</p>
<p>2.数据结构如何设计</p>
<p>3.时间复杂度如何优化</p>
<p>4.算法思路如何演进</p>
<p><strong>真正的算法能力，不是记住多少题。而是：看到问题，能快速想到解决思路。</strong></p>]]></content:encoded>
            <category>技术</category>
        </item>
        <item>
            <title><![CDATA[AI的发展史]]></title>
            <link>https://tanzhuo.xyz/2026/03/13/aide-fa-zhan-shi</link>
            <guid>https://tanzhuo.xyz/2026/03/13/aide-fa-zhan-shi</guid>
            <pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[AI到底是怎么一步一步发展起来的？ 很多人觉得 AI 好像是这几年突然冒出来的，其实不是。AI的发展已经走了 70多年，可以简单理解为三个阶段。]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai到底是怎么一步一步发展起来的">AI到底是怎么一步一步发展起来的？<a href="https://tanzhuo.xyz/2026/03/13/aide-fa-zhan-shi#ai%E5%88%B0%E5%BA%95%E6%98%AF%E6%80%8E%E4%B9%88%E4%B8%80%E6%AD%A5%E4%B8%80%E6%AD%A5%E5%8F%91%E5%B1%95%E8%B5%B7%E6%9D%A5%E7%9A%84" class="hash-link" aria-label="AI到底是怎么一步一步发展起来的？的直接链接" title="AI到底是怎么一步一步发展起来的？的直接链接" translate="no">​</a></h2>
<!-- -->
<p>很多人觉得 AI 好像是这几年突然冒出来的，其实不是。AI的发展已经走了 <strong>70多年</strong>，可以简单理解为三个阶段。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="第一阶段ai概念诞生19501980">第一阶段：AI概念诞生（1950—1980）<a href="https://tanzhuo.xyz/2026/03/13/aide-fa-zhan-shi#%E7%AC%AC%E4%B8%80%E9%98%B6%E6%AE%B5ai%E6%A6%82%E5%BF%B5%E8%AF%9E%E7%94%9F19501980" class="hash-link" aria-label="第一阶段：AI概念诞生（1950—1980）的直接链接" title="第一阶段：AI概念诞生（1950—1980）的直接链接" translate="no">​</a></h2>
<p>1950年，英国科学家 <strong>图灵（Alan Turing）</strong> 提出一个问题：</p>
<blockquote>
<p>“机器能不能像人一样思考？”</p>
</blockquote>
<p>于是他提出了一个著名的测试 （<strong>图灵测试）</strong>。</p>
<p>简单说就是：<br>
如果人类和机器聊天，分不出来谁是机器，那机器就算“有智能”。</p>
<p>1956年，美国召开了一次会议，第一次正式提出：</p>
<blockquote>
<p>Artificial Intelligence（人工智能）</p>
</blockquote>
<p>从那时起，AI成为一个正式研究领域。</p>
<p>不过当时的计算机很弱，数据也少，所以AI主要停留在理论研究阶段。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="第二阶段ai开始有点用19802010">第二阶段：AI开始有点用（1980—2010）<a href="https://tanzhuo.xyz/2026/03/13/aide-fa-zhan-shi#%E7%AC%AC%E4%BA%8C%E9%98%B6%E6%AE%B5ai%E5%BC%80%E5%A7%8B%E6%9C%89%E7%82%B9%E7%94%A819802010" class="hash-link" aria-label="第二阶段：AI开始有点用（1980—2010）的直接链接" title="第二阶段：AI开始有点用（1980—2010）的直接链接" translate="no">​</a></h2>
<p>随着计算机越来越强，一些AI技术开始真正落地，比如：</p>
<ul>
<li class="">语音识别</li>
<li class="">机器翻译</li>
<li class="">推荐系统</li>
</ul>
<p>很多互联网产品，其实早就用了AI，例如：</p>
<ul>
<li class="">淘宝推荐商品</li>
<li class="">Google搜索排序</li>
<li class="">Netflix推荐电影</li>
</ul>
<p>但是那个时候的AI，还比较“笨”。</p>
<p>基本只能做 <strong>单一任务</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="第三阶段大模型时代2010现在">第三阶段：大模型时代（2010—现在）<a href="https://tanzhuo.xyz/2026/03/13/aide-fa-zhan-shi#%E7%AC%AC%E4%B8%89%E9%98%B6%E6%AE%B5%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%97%B6%E4%BB%A32010%E7%8E%B0%E5%9C%A8" class="hash-link" aria-label="第三阶段：大模型时代（2010—现在）的直接链接" title="第三阶段：大模型时代（2010—现在）的直接链接" translate="no">​</a></h2>
<p>真正让AI爆发的，是三个因素：</p>
<p><strong>1 算力变强</strong></p>
<p>GPU算力暴涨。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-数据变多">2 数据变多<a href="https://tanzhuo.xyz/2026/03/13/aide-fa-zhan-shi#2-%E6%95%B0%E6%8D%AE%E5%8F%98%E5%A4%9A" class="hash-link" aria-label="2 数据变多的直接链接" title="2 数据变多的直接链接" translate="no">​</a></h3>
<p>互联网产生海量数据。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-算法突破">3 算法突破<a href="https://tanzhuo.xyz/2026/03/13/aide-fa-zhan-shi#3-%E7%AE%97%E6%B3%95%E7%AA%81%E7%A0%B4" class="hash-link" aria-label="3 算法突破的直接链接" title="3 算法突破的直接链接" translate="no">​</a></h3>
<p>特别是 <strong>深度学习 + Transformer架构</strong>。</p>
<p>2017年，Google发布一篇论文：</p>
<blockquote>
<p>Attention Is All You Need</p>
</blockquote>
<p>这篇论文直接催生了今天的大模型。</p>
<p>于是出现了一批AI产品：</p>
<ul>
<li class="">ChatGPT</li>
<li class="">Claude</li>
<li class="">Gemini</li>
<li class="">DeepSeek</li>
</ul>
<p>AI突然从“工具”变成了一个可以对话、写作、编程、画画的智能助手。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai现在发展到什么水平">AI现在发展到什么水平？<a href="https://tanzhuo.xyz/2026/03/13/aide-fa-zhan-shi#ai%E7%8E%B0%E5%9C%A8%E5%8F%91%E5%B1%95%E5%88%B0%E4%BB%80%E4%B9%88%E6%B0%B4%E5%B9%B3" class="hash-link" aria-label="AI现在发展到什么水平？的直接链接" title="AI现在发展到什么水平？的直接链接" translate="no">​</a></h2>
<p>如果放在十年前，很多人可能会觉得 AI 只是个实验室技术，或者只是一些有趣的小工具。但现在情况已经完全不一样了。<br>
今天的 AI，已经从“新奇玩具”变成了真正的 <strong>生产力工具</strong>，而且正在越来越多的行业里发挥作用。</p>
<p>最明显的变化发生在 <strong>软件开发领域</strong>。现在很多程序员在日常工作中都会使用 AI 辅助写代码，比如 Cursor、Copilot、ChatGPT、Claude 等工具。AI 不仅可以帮开发者写函数、生成脚本，还能帮助查 bug、解释代码逻辑，甚至可以根据需求快速生成一段完整的程序框架。在很多团队中，引入 AI 之后，开发效率普遍可以提升 <strong>30%—50%</strong>。</p>
<p>在 <strong>内容创作领域</strong>，AI 的应用也非常广泛。现在 AI 已经可以写新闻、写小说、写广告文案、写总结报告，甚至很多自媒体作者都会用 AI 来辅助写文章、整理素材或者生成创意。虽然最终内容往往还需要人工修改，但 AI 已经可以完成很大一部分基础工作，大大提高了创作效率。</p>
<p>在 <strong>企业服务领域</strong>，AI 也开始大量替代一些重复性工作，比如客服。很多电商平台、银行和运营商已经开始使用 AI 客服系统来处理常见问题咨询。相比传统人工客服，AI 可以做到 <strong>24 小时在线响应</strong>，同时处理大量用户请求，大幅降低企业的人力成本。</p>
<p>另外，在 <strong>视觉内容生产方面</strong>，AI 的能力也进步非常快。像 Midjourney、DALL·E 这样的工具已经可以根据文字生成高质量图片，而 Sora、Runway 等视频生成技术也开始逐渐成熟。现在一些短视频、广告设计，甚至影视制作中，都已经开始用 AI 来辅助生成画面、角色或动画内容。</p>
<p>在 <strong>数据分析领域</strong>，AI 同样发挥着越来越重要的作用。很多企业已经在使用 AI 自动分析数据报表、生成 BI 报告，甚至给出业务趋势判断和决策建议。一些公司已经开始部署所谓的“AI 数据分析助手”，帮助管理层更快地理解数据和做出决策。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai现在已经在哪些行业落地">AI现在已经在哪些行业落地？<a href="https://tanzhuo.xyz/2026/03/13/aide-fa-zhan-shi#ai%E7%8E%B0%E5%9C%A8%E5%B7%B2%E7%BB%8F%E5%9C%A8%E5%93%AA%E4%BA%9B%E8%A1%8C%E4%B8%9A%E8%90%BD%E5%9C%B0" class="hash-link" aria-label="AI现在已经在哪些行业落地？的直接链接" title="AI现在已经在哪些行业落地？的直接链接" translate="no">​</a></h2>
<p>其实AI已经悄悄进入了很多行业。互联网平台里的内容推荐，比如抖音、淘宝、B站，本质上都是AI在决定你看到什么内容；金融行业用AI做风控、反欺诈和投资分析，很多银行的核心系统里都有AI模型在运行；医疗领域里，AI已经可以辅助医生诊断疾病、识别医学影像，比如X光片和CT，有些场景下甚至比人工识别更快更准确；在制造业，AI被用在工厂自动化、质量检测和设备预测维护，让工厂越来越智能化；在IT行业，AI也开始进入运维领域，比如自动监控系统、日志分析、自动排障和自动扩容，未来甚至可能出现“AI运维助手”，帮助工程师管理复杂系统。可以说，AI已经从实验室技术，变成了很多行业背后的基础工具。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai对人类意味着什么">AI对人类意味着什么？<a href="https://tanzhuo.xyz/2026/03/13/aide-fa-zhan-shi#ai%E5%AF%B9%E4%BA%BA%E7%B1%BB%E6%84%8F%E5%91%B3%E7%9D%80%E4%BB%80%E4%B9%88" class="hash-link" aria-label="AI对人类意味着什么？的直接链接" title="AI对人类意味着什么？的直接链接" translate="no">​</a></h2>
<p>很多人担心 AI 会不会取代人类，其实更现实的情况是：<strong>AI并不是来取代人的，而是来放大人的能力的。</strong></p>
<p>回顾技术的发展史，人类一直在用工具放大自己的能力。<br>
蒸汽机让人类拥有了远超自身的体力，计算机让人类拥有了极强的计算能力，互联网让信息传播速度几乎没有距离限制。</p>
<p>而 AI 放大的，是人类的 <strong>智力劳动能力</strong>。</p>
<p>很多过去需要一个团队完成的事情，现在一个人加上 AI 就能做到。例如写代码、分析数据、制作内容、做设计、做运营方案等。AI 可以帮人快速生成思路、整理信息、完成大量基础工作，而人类则负责判断方向、做决策和把控结果。</p>
<p>换句话说，未来很多工作的模式可能会变成：</p>
<p><strong>一个人 + AI，就相当于过去的一个小团队。</strong></p>
<p>所以，从更长远的角度来看，AI真正改变的不是“人会不会失业”，而是 <strong>工作的方式会发生变化</strong>。<br>
重复性、标准化的工作会越来越多地被 AI 完成，而人类更多需要做的是创造、判断、决策和创新。</p>
<p>可以说，AI并不是人类的对手，而更像是一种新的工具。<br>
就像当年计算机和互联网改变了世界一样，AI正在成为新的基础能力，并逐渐融入到每一个行业之中。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="未来ai会如何发展">未来AI会如何发展？<a href="https://tanzhuo.xyz/2026/03/13/aide-fa-zhan-shi#%E6%9C%AA%E6%9D%A5ai%E4%BC%9A%E5%A6%82%E4%BD%95%E5%8F%91%E5%B1%95" class="hash-link" aria-label="未来AI会如何发展？的直接链接" title="未来AI会如何发展？的直接链接" translate="no">​</a></h2>
<p>从目前的发展趋势来看，AI未来大概率会往几个方向发展。首先，AI会从“聊天工具”逐渐变成<strong>可以自己完成任务的智能体（AI Agent）</strong>，比如自动写代码、自动分析数据、自动运营系统，人只需要给目标，AI就能一步一步把事情完成。其次，AI会越来越多地进入现实世界，例如与机器人、自动驾驶、智能工厂结合，让机器不仅会“思考”，还会“行动”。另外，AI也会逐渐成为一种<strong>基础能力</strong>，像互联网和电力一样融入各类软件和系统中，未来几乎所有应用都会带有AI功能。简单来说，未来的AI不会只是一个工具，而更像是人类的“智能助手”和“生产力放大器”，帮助个人和企业用更少的人力完成更多的事情。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai目前的资金投入与成本情况">AI目前的资金投入与成本情况<a href="https://tanzhuo.xyz/2026/03/13/aide-fa-zhan-shi#ai%E7%9B%AE%E5%89%8D%E7%9A%84%E8%B5%84%E9%87%91%E6%8A%95%E5%85%A5%E4%B8%8E%E6%88%90%E6%9C%AC%E6%83%85%E5%86%B5" class="hash-link" aria-label="AI目前的资金投入与成本情况的直接链接" title="AI目前的资金投入与成本情况的直接链接" translate="no">​</a></h2>
<p>从全球来看，AI已经成为资本投入最大的科技领域之一，各国政府、科技公司和投资机构都在持续加码。根据斯坦福发布的《AI Index 2025》报告，<strong>2024年全球企业在AI领域的投资规模达到约2523亿美元</strong>，创历史新高。</p>
<p>其中，美国依然是AI投资最强的国家，<strong>2024年美国私营AI投资达到1091亿美元</strong>，大约是中国（约93亿美元）的12倍、英国（45亿美元）的24倍。</p>
<p>在AI投资结构中，<strong>生成式AI（如大模型）是增长最快的领域</strong>，2024年全球生成式AI私营投资达到 <strong>339亿美元</strong>，同比增长约18.7%。</p>
<p>与此同时，AI的企业使用率也在快速增长。数据显示，<strong>2024年约78%的企业已经在业务中使用AI技术</strong>，相比前一年的55%明显提升，这意味着AI正在从“技术尝试”变成企业的常规工具。</p>
<p>从市场规模来看，AI产业也处于高速增长阶段。2025年全球AI市场规模约 <strong>3910亿美元</strong>，预计到2030年可能增长到 <strong>1.8万亿美元以上</strong>，成为未来增长最快的科技产业之一。</p>
<p>简单来说，现在AI的发展背后是 <strong>大量资金、算力和企业投入的共同推动</strong>。科技巨头、投资机构和各国政府都在持续投入资源，希望在未来的AI产业竞争中占据领先位置。</p>]]></content:encoded>
            <category>AI</category>
        </item>
        <item>
            <title><![CDATA[go-lynx设计思路]]></title>
            <link>https://tanzhuo.xyz/2026/03/13/go-lynxshe-ji-si-lu</link>
            <guid>https://tanzhuo.xyz/2026/03/13/go-lynxshe-ji-si-lu</guid>
            <pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[前言 github.com/go-lynx 的设计目的是为了可以快速帮助企业构建微服务体系的基础框架，其中我把整个仓库（包括组织 go-lynx 下 29 个 repo）进行了拆分，分为了lynx架构基座，和各种ly…]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="前言">前言<a href="https://tanzhuo.xyz/2026/03/13/go-lynxshe-ji-si-lu#%E5%89%8D%E8%A8%80" class="hash-link" aria-label="前言的直接链接" title="前言的直接链接" translate="no">​</a></h2>
<!-- -->
<p>github.com/go-lynx 的设计目的是为了可以快速帮助企业构建微服务体系的基础框架，其中我把整个仓库（包括组织 go-lynx 下 29 个 repo）进行了拆分，分为了lynx架构基座，和各种lynx插件模块。</p>
<p><img decoding="async" loading="lazy" src="https://avatars.githubusercontent.com/u/150900434?s=96&amp;v=4" alt="" class="img_ev3q"></p>
<p><a href="https://github.com/go-lynx?ref=tanzhuo.xyz" target="_blank" rel="noopener noreferrer" class="">https://github.com/go-lynx</a></p>
<p>亮点就是：<strong>Plug-and-Play</strong>（真正开箱即用），把复杂微服务架构变成“搭积木”。</p>
<p>它不是从 0 造轮子，而是站在巨人肩膀上：</p>
<ul>
<li class="">核心运行时借 <strong>Kratos</strong>（B 站那套开源框架）</li>
<li class="">服务发现/治理用 <strong>Polaris</strong>（腾讯云原生服务网格），<strong>Nacos （阿里开源）</strong></li>
<li class="">分布式事务用 <strong>Seata，DTM 等</strong></li>
<li class="">然后我自己加了一套<strong>插件管理系统 + 事件总线 + 控制平面</strong>，实现真正热插拔。</li>
</ul>
<p><strong>对比 Kratos</strong>：Kratos 是“基础框架”，Lynx 是“Kratos 的生产增强版 + 插件体系 + 零配置”。如果你喜欢 Kratos 但嫌配置麻烦、插件不统一，这套就是为这个痛点生的。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="脚手架">脚手架<a href="https://tanzhuo.xyz/2026/03/13/go-lynxshe-ji-si-lu#%E8%84%9A%E6%89%8B%E6%9E%B6" class="hash-link" aria-label="脚手架的直接链接" title="脚手架的直接链接" translate="no">​</a></h2>
<p><strong>零配置 + CLI 脚手架</strong>go install github.com/go-lynx/lynx/cmd/lynx@latestlynx new my-service 一条命令快速生成完整项目。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="已实现的插件体系">已实现的插件体系<a href="https://tanzhuo.xyz/2026/03/13/go-lynxshe-ji-si-lu#%E5%B7%B2%E5%AE%9E%E7%8E%B0%E7%9A%84%E6%8F%92%E4%BB%B6%E4%BD%93%E7%B3%BB" class="hash-link" aria-label="已实现的插件体系的直接链接" title="已实现的插件体系的直接链接" translate="no">​</a></h2>
<ul>
<li class="">已有的插件：gRPC、HTTP、Redis、PostgreSQL、Redis 分布式锁、Swagger、Tracer、Seata 等。</li>
<li class="">插件间通过内置 <strong>Event Bus</strong> 通信，实现插件之间的互通，控制。</li>
<li class="">服务注册发现 + 健康检查 + 多版本 + 负载均衡（Polaris）</li>
<li class="">流量治理：限流、熔断、蓝绿/金丝雀、fallback</li>
<li class="">安全：TLS 双向认证、JWT、OAuth2、RBAC/ABAC</li>
<li class="">分布式事务：Seata 全自动</li>
<li class="">可观测性：Prometheus + OpenTelemetry + Zap（JSON 日志）</li>
<li class="">优雅关机、重试、死信队列、恢复管理器</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="配置驱动">配置驱动<a href="https://tanzhuo.xyz/2026/03/13/go-lynxshe-ji-si-lu#%E9%85%8D%E7%BD%AE%E9%A9%B1%E5%8A%A8" class="hash-link" aria-label="配置驱动的直接链接" title="配置驱动的直接链接" translate="no">​</a></h2>
<ul>
<li class="">每个插件有固定 confPrefix（如 <code>lynx.grpc.service</code>、<code>lynx.grpc.client</code>），配置从 Lynx Runtime 的 <code>rt.GetConfig().Value(confPrefix).Scan(...)</code> 加载。</li>
<li class="">支持 Configure(c) 热更新：服务端用 <code>confMu</code> 保护配置指针替换，保证并发安全并可在不重启下更新部分能力。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lynx项目示例配置-yaml-格式">lynx项目示例配置 YAML 格式<a href="https://tanzhuo.xyz/2026/03/13/go-lynxshe-ji-si-lu#lynx%E9%A1%B9%E7%9B%AE%E7%A4%BA%E4%BE%8B%E9%85%8D%E7%BD%AE-yaml-%E6%A0%BC%E5%BC%8F" class="hash-link" aria-label="lynx项目示例配置 YAML 格式的直接链接" title="lynx项目示例配置 YAML 格式的直接链接" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">lynx:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  polaris: {namespace: default}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  http: {addr: ":8080"}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  grpc: {addr: ":9090"}</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  metrics/tracing/logging/tls/rate_limit 全都有现成模板</span><br></div></code></pre></div></div>
<p>整体类似于springboot，使用什么插件就可以配置什么内容，插件完全开箱即用</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="插件化架构设计">插件化架构设计<a href="https://tanzhuo.xyz/2026/03/13/go-lynxshe-ji-si-lu#%E6%8F%92%E4%BB%B6%E5%8C%96%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1" class="hash-link" aria-label="插件化架构设计的直接链接" title="插件化架构设计的直接链接" translate="no">​</a></h2>
<ul>
<li class="">统一插件接口：插件实现 Lynx 的 <code>plugins.Plugin</code> 接口，通过 BasePlugin 嵌入获得 ID、名称、版本、配置前缀、权重等通用能力。</li>
<li class="">工厂注册：客户端插件在 <code>init()</code> 里通过 <code>factory.GlobalTypedFactory().RegisterPlugin(clientPluginName, "lynx.grpc.client", ...)</code> 注册，由框架按配置前缀加载并管理生命周期。</li>
<li class="">生命周期：标准三阶段——InitializeResources（读配置、校验）、StartupTasks（启动服务/连接）、CleanupTasks（优雅关闭、释放资源）。</li>
<li class="">依赖注入：服务端插件通过 <code>SetDependencies</code> 注入应用名、Logger、证书、控制面等，避免全局单例，便于测试与多实例。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="安全模块设计">安全模块设计<a href="https://tanzhuo.xyz/2026/03/13/go-lynxshe-ji-si-lu#%E5%AE%89%E5%85%A8%E6%A8%A1%E5%9D%97%E8%AE%BE%E8%AE%A1" class="hash-link" aria-label="安全模块设计的直接链接" title="安全模块设计的直接链接" translate="no">​</a></h2>
<p>为了保证内网微服务之间的通讯安全，Lynx 内置了 TLS 证书自动管理与轮转能力，在服务运行过程中证书更新无需重启，新建立的连接会自动使用最新证书，实现真正的零停机更新。整体设计上通过统一的证书提供者（CertificateProvider）进行证书管理，内网 grpc 服务端在 TLS 握手时动态获取当前证书，客户端则通过同一机制获取 Root CA 并支持凭证刷新，使证书更新可以自动生效。同时该机制可以对接文件监听、云证书服务或密钥管理系统，实现自动化证书更新与企业级安全通信，既提升了系统安全性，也大幅降低了运维成本。</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[OpenClaw 使用记录]]></title>
            <link>https://tanzhuo.xyz/2026/03/13/openclaw</link>
            <guid>https://tanzhuo.xyz/2026/03/13/openclaw</guid>
            <pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[OpenClaw 是一个 开源的 AI Agent 自动化执行框架。 它的核心目标是让 AI 不仅仅停留在“对话”，而是能够 自动规划任务、调用工具、执行操作并持续迭代完成复杂目标，最近使用下来总结了一些内容。]]></description>
            <content:encoded><![CDATA[<p>OpenClaw 是一个 <strong>开源的 AI Agent 自动化执行框架</strong>。<br>
它的核心目标是让 AI 不仅仅停留在“对话”，而是能够 **自动规划任务、调用工具、执行操作并持续迭代完成复杂目标，**最近使用下来总结了一些内容。</p>
<!-- -->
<p>简单来说，OpenClaw 可以理解为：</p>
<blockquote>
<p><strong>一个可以自动写代码、执行命令、分析项目并持续迭代任务的 AI 工程助手。</strong></p>
</blockquote>
<p>与普通的 ChatGPT 或 Claude 不同，OpenClaw 的设计目标是：</p>
<ul>
<li class="">让 AI <strong>具备任务执行能力</strong></li>
<li class="">可以 <strong>拆解复杂目标</strong></li>
<li class="">自动 <strong>调用工具和执行命令</strong></li>
<li class="">持续 <strong>迭代直到任务完成</strong></li>
</ul>
<p>因此，它更像是一个 <strong>AI 自动化开发助手（AI Software Engineer）</strong>。</p>
<p><a href="https://openclaw.ai/?ref=tanzhuo.xyz" target="_blank" rel="noopener noreferrer" class="">OpenClaw — Personal AI Assistant</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openclaw-的核心能力">OpenClaw 的核心能力<a href="https://tanzhuo.xyz/2026/03/13/openclaw#openclaw-%E7%9A%84%E6%A0%B8%E5%BF%83%E8%83%BD%E5%8A%9B" class="hash-link" aria-label="OpenClaw 的核心能力的直接链接" title="OpenClaw 的核心能力的直接链接" translate="no">​</a></h2>
<p>OpenClaw 的能力主要体现在 <strong>任务规划 + 自动执行 + 工具调用</strong> 三个方面。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="任务规划planning">任务规划（Planning）<a href="https://tanzhuo.xyz/2026/03/13/openclaw#%E4%BB%BB%E5%8A%A1%E8%A7%84%E5%88%92planning" class="hash-link" aria-label="任务规划（Planning）的直接链接" title="任务规划（Planning）的直接链接" translate="no">​</a></h2>
<p>当用户给 OpenClaw 一个目标，例如：</p>
<blockquote>
<p>“帮我给这个项目增加一个 Redis 缓存”</p>
</blockquote>
<p>OpenClaw 会自动进行任务拆解，例如：</p>
<ol>
<li class="">分析项目结构</li>
<li class="">找到数据库访问代码</li>
<li class="">设计缓存策略</li>
<li class="">修改代码</li>
<li class="">添加测试</li>
<li class="">执行验证</li>
</ol>
<p>这个过程类似一个 <strong>AI 自动生成开发计划</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="自动执行任务">自动执行任务<a href="https://tanzhuo.xyz/2026/03/13/openclaw#%E8%87%AA%E5%8A%A8%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1" class="hash-link" aria-label="自动执行任务的直接链接" title="自动执行任务的直接链接" translate="no">​</a></h2>
<p>OpenClaw 不只是给建议，而是可以：</p>
<ul>
<li class="">修改代码</li>
<li class="">创建文件</li>
<li class="">运行 Shell 命令</li>
<li class="">安装依赖</li>
<li class="">执行脚本</li>
</ul>
<p>例如：</p>
<p>git clone project<br>
npm install<br>
npm run test</p>
<p>AI 可以直接执行这些操作。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="工具调用能力">工具调用能力<a href="https://tanzhuo.xyz/2026/03/13/openclaw#%E5%B7%A5%E5%85%B7%E8%B0%83%E7%94%A8%E8%83%BD%E5%8A%9B" class="hash-link" aria-label="工具调用能力的直接链接" title="工具调用能力的直接链接" translate="no">​</a></h2>
<p>OpenClaw 可以通过 Tool 调用不同能力，例如：</p>
<ul>
<li class="">文件系统</li>
<li class="">Shell</li>
<li class="">Git</li>
<li class="">HTTP API</li>
<li class="">编译工具</li>
<li class="">测试框架</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="openclaw-的缺陷">OpenClaw 的缺陷<a href="https://tanzhuo.xyz/2026/03/13/openclaw#openclaw-%E7%9A%84%E7%BC%BA%E9%99%B7" class="hash-link" aria-label="OpenClaw 的缺陷的直接链接" title="OpenClaw 的缺陷的直接链接" translate="no">​</a></h2>
<p>虽然 OpenClaw 很强，但目前仍然存在一些明显问题。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="非常依赖模型能力">非常依赖模型能力<a href="https://tanzhuo.xyz/2026/03/13/openclaw#%E9%9D%9E%E5%B8%B8%E4%BE%9D%E8%B5%96%E6%A8%A1%E5%9E%8B%E8%83%BD%E5%8A%9B" class="hash-link" aria-label="非常依赖模型能力的直接链接" title="非常依赖模型能力的直接链接" translate="no">​</a></h2>
<p>OpenClaw 的能力 <strong>高度依赖底层模型</strong>。</p>
<p>如果模型能力不够：</p>
<ul>
<li class="">任务规划能力会下降</li>
<li class="">代码质量下降</li>
<li class="">执行容易出错</li>
</ul>
<p>因此很多时候：</p>
<p>Agent能力 ≈ 模型能力</p>
<p>如果模型弱，OpenClaw 也会变得“很傻”。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="token-成本问题">Token 成本问题<a href="https://tanzhuo.xyz/2026/03/13/openclaw#token-%E6%88%90%E6%9C%AC%E9%97%AE%E9%A2%98" class="hash-link" aria-label="Token 成本问题的直接链接" title="Token 成本问题的直接链接" translate="no">​</a></h2>
<p>Agent 系统通常需要：</p>
<ul>
<li class="">多轮思考</li>
<li class="">多次调用模型</li>
<li class="">持续上下文</li>
</ul>
<p>对Token的消耗非常高，每次都携带了大量上下文进行模型调用，就算调优也只是减少部分开销，或者替换便宜的模型，但便宜的模型替换又会导致上面的问题，OpenClaw变得完全不可靠，不可控。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总体来说">总体来说<a href="https://tanzhuo.xyz/2026/03/13/openclaw#%E6%80%BB%E4%BD%93%E6%9D%A5%E8%AF%B4" class="hash-link" aria-label="总体来说的直接链接" title="总体来说的直接链接" translate="no">​</a></h2>
<p>OpenClaw 是一个非常有潜力的 <strong>AI Agent 框架</strong>。</p>
<p>优点：</p>
<ul>
<li class="">自动任务规划</li>
<li class="">自动执行能力</li>
<li class="">可扩展的 Agent 架构</li>
</ul>
<p>缺点：</p>
<ul>
<li class="">非常依赖模型</li>
<li class="">Token 成本较高 (模型调用非常高，复杂任务能力完全取决于模型)</li>
<li class="">执行过程不透明 (非常严重，执行过程完全不透明，需要配合控制平台一起监控才行)</li>
</ul>
<p>因此它目前更适合：</p>
<ul>
<li class="">AI 自动化开发</li>
<li class="">DevOps 自动化</li>
<li class="">AI Agent 实验</li>
</ul>
<p>但如果结合：</p>
<ul>
<li class="">强模型</li>
<li class="">可视化系统</li>
<li class="">Agent 管理平台</li>
</ul>
<p>未来可能会成为：</p>
<blockquote>
<p><strong>AI 自动化团队的核心基础设施。</strong></p>
</blockquote>]]></content:encoded>
            <category>技术</category>
            <category>AI</category>
        </item>
        <item>
            <title><![CDATA[运维历史演进与 K8S 之后趋势]]></title>
            <link>https://tanzhuo.xyz/2026/03/13/ops-evolution</link>
            <guid>https://tanzhuo.xyz/2026/03/13/ops-evolution</guid>
            <pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[背景 过去三十多年，服务器运维其实一直在做一件事：让人越来越少地去“手动管机器”。 早期的运维非常原始。服务器买回来要自己上架、装系统、配置网络、改配置文件。]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="背景">背景<a href="https://tanzhuo.xyz/2026/03/13/ops-evolution#%E8%83%8C%E6%99%AF" class="hash-link" aria-label="背景的直接链接" title="背景的直接链接" translate="no">​</a></h2>
<!-- -->
<p>过去三十多年，服务器运维其实一直在做一件事：<strong>让人越来越少地去“手动管机器”。</strong></p>
<p>早期的运维非常原始。服务器买回来要自己上架、装系统、配置网络、改配置文件。机器出了问题，就 SSH 登录上去排查，很多时候靠的是经验和记忆。那时候的运维，本质上就是“人盯机器”。</p>
<p>但当服务器数量越来越多，这种方式很快就撑不住了。<br>
问题主要有两个：<strong>重复劳动</strong>和<strong>配置混乱</strong>。</p>
<p>重复劳动很好理解，比如同一个服务要部署到几十台机器，每次都要手动执行一堆命令；规模一大，运维每天都在做这些重复的事情。在 SRE 体系里，这类工作有一个专门的名字，叫 <strong>toil</strong> （可以自动化、重复、但长期价值不高的工作）。</p>
<p>另一个问题叫 <strong>配置漂移</strong>。今天在一台机器上临时改了个参数，半年后没人记得；不同机器的配置慢慢变得不一样，系统也越来越难维护。</p>
<p>为了解决这些问题，运维开始走向自动化。<br>
最早是各种 <strong>Shell 脚本</strong>，后来发展成 <strong>配置管理工具</strong>（比如 Puppet、Chef、Ansible）。再往后，一个更重要的理念出现了：<strong>基础设施即代码（IaC）</strong>。</p>
<p>简单来说，就是把服务器配置写成代码，放进 Git 里管理。这样所有变更都有记录，可以回滚，也可以重复执行。运维不再是“去机器上改东西”，而是“改代码”。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="虚拟化云计算">虚拟化云计算<a href="https://tanzhuo.xyz/2026/03/13/ops-evolution#%E8%99%9A%E6%8B%9F%E5%8C%96%E4%BA%91%E8%AE%A1%E7%AE%97" class="hash-link" aria-label="虚拟化云计算的直接链接" title="虚拟化云计算的直接链接" translate="no">​</a></h2>
<p>再往后，一个非常关键的变化出现了：<strong>虚拟化和云计算</strong>。</p>
<p>以前买服务器是一件很重的事情，需要采购、上架、布线。虚拟化出现后，一台物理服务器可以跑很多虚拟机，服务器不再是硬件，而变成了一种“资源”。<br>
到了云时代，甚至不需要自己买服务器了，直接在控制台点几下就能申请资源。运维的角色，也开始从“管机器的人”变成“调度资源的人”。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="容器化技术">容器化技术<a href="https://tanzhuo.xyz/2026/03/13/ops-evolution#%E5%AE%B9%E5%99%A8%E5%8C%96%E6%8A%80%E6%9C%AF" class="hash-link" aria-label="容器化技术的直接链接" title="容器化技术的直接链接" translate="no">​</a></h2>
<p>真正改变软件交付方式的，是 <strong>Docker 和 Kubernetes</strong>。</p>
<p>Docker 解决的是一个老问题：<strong>软件在不同环境运行不一致</strong>。<br>
开发机器能跑，测试机器不行，线上环境又不一样。Docker 把应用和运行环境一起打包成一个镜像，就像打包盒饭一样，拿到哪里都能运行。</p>
<p>但如果只有 Docker，还是不够。<br>
当容器数量变成几十、几百、几千个时，就需要一个系统去管理这些容器。于是 Kubernetes 出现了。</p>
<p>Kubernetes 的核心思想其实很简单：<br>
<strong>你只需要告诉系统“我希望系统是什么样”，系统会不断把现实拉回这个目标状态。</strong></p>
<p>比如你声明：“我要 3 个服务实例”，如果有一个挂掉了，Kubernetes 会自动再拉起一个；如果机器坏了，容器会自动调度到别的机器上。<br>
这种机制叫 <strong>控制循环（Control Loop）</strong>，也是 Kubernetes 能够自动化管理大规模集群的关键。</p>
<p>所以从更宏观的角度看，运维的发展其实是三次大的跃迁：</p>
<ul>
<li class=""><strong>配置管理 / IaC</strong>：让服务器配置可以版本化管理</li>
<li class=""><strong>虚拟化 / 云计算</strong>：让服务器变成资源</li>
<li class=""><strong>Docker + Kubernetes</strong>：让整个集群可以自动运行</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-之后如何发展">Kubernetes 之后，如何发展<a href="https://tanzhuo.xyz/2026/03/13/ops-evolution#kubernetes-%E4%B9%8B%E5%90%8E%E5%A6%82%E4%BD%95%E5%8F%91%E5%B1%95" class="hash-link" aria-label="Kubernetes 之后，如何发展的直接链接" title="Kubernetes 之后，如何发展的直接链接" translate="no">​</a></h2>
<p>Kubernetes 并不是终点，它只是把“集群管理”这个问题解决得比较好了。<br>
在 Kubernetes 之后，运维的发展主要集中在三个方向：<strong>更自动、更可观测、更少服务器心智负担。</strong></p>
<p>第一个趋势是 <strong>GitOps</strong>。</p>
<p>GitOps 的思路很简单：<br>
<strong>Git 就是系统的唯一事实来源。</strong></p>
<p>所有配置都写在 Git 里，系统自动把线上环境和 Git 的状态对齐。如果要改配置，不再是去服务器上操作，而是提一个 PR。合并代码之后，系统自动完成部署。</p>
<p>这种模式最大的好处是：<br>
变更可审计、回滚简单、流程更清晰。</p>
<p>第二个趋势是 <strong>可观测性和服务治理</strong>。</p>
<p>当系统变成微服务之后，真正复杂的往往不是某个服务，而是服务之间的调用关系。<br>
请求可能经过十几个服务，一旦某个环节慢了，整个系统都会受影响。</p>
<p>于是出现了 <strong>Service Mesh、Prometheus、OpenTelemetry</strong> 这一类技术。<br>
它们的核心目标是：<strong>让系统运行状态更透明，问题更容易被发现。</strong></p>
<p>第三个趋势是 <strong>Serverless 和边缘计算</strong>。</p>
<p>Serverless 的理念是：<br>
开发者只需要写代码，服务器由平台自动管理。</p>
<p>比如一个函数在有请求时才运行，没有请求就不占资源。对很多场景来说，这种模式可以大幅降低运维成本。</p>
<p>与此同时，一些计算也开始往“边缘”移动，比如门店设备、工厂设备、车载系统等。<br>
为了适应这些场景，也出现了很多轻量化 Kubernetes（比如 K3s）和云边协同技术。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-如何改变运维">AI 如何改变运维<a href="https://tanzhuo.xyz/2026/03/13/ops-evolution#ai-%E5%A6%82%E4%BD%95%E6%94%B9%E5%8F%98%E8%BF%90%E7%BB%B4" class="hash-link" aria-label="AI 如何改变运维的直接链接" title="AI 如何改变运维的直接链接" translate="no">​</a></h2>
<p>最近几年，AI 也开始逐渐进入运维领域。</p>
<p>很多传统的监控系统都是基于 <strong>固定阈值</strong> 的，比如 CPU 超过 80% 报警。但在复杂系统中，很多异常其实很难用阈值描述。</p>
<p>于是越来越多的平台开始用 <strong>机器学习来做异常检测</strong>。</p>
<p>例如：</p>
<ul>
<li class="">AWS 的 DevOps Guru 会分析指标数据，自动发现异常并给出建议</li>
<li class="">Azure 的智能检测会自动识别性能下降或错误率上升</li>
<li class="">Elastic 的异常检测会先学习系统的正常行为，再识别异常模式</li>
</ul>
<p>还有一些研究和产品，会用深度学习去分析日志，从日志序列中发现异常模式。</p>
<p>这些技术的目标其实很简单：<br>
<strong>减少告警噪声，让运维更快找到真正的问题。</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="运维这个职业何去何从">运维这个职业，何去何从<a href="https://tanzhuo.xyz/2026/03/13/ops-evolution#%E8%BF%90%E7%BB%B4%E8%BF%99%E4%B8%AA%E8%81%8C%E4%B8%9A%E4%BD%95%E5%8E%BB%E4%BD%95%E4%BB%8E" class="hash-link" aria-label="运维这个职业，何去何从的直接链接" title="运维这个职业，何去何从的直接链接" translate="no">​</a></h2>
<p>很多人看到自动化和 AI，会担心运维是不是会消失。<br>
但现实情况更像是：<strong>运维的工作方式在改变。</strong></p>
<p>过去运维的价值，很多时候体现在“会不会手动处理问题”。<br>
比如登录机器、改配置、重启服务、排查故障。</p>
<p>但未来更有价值的能力，其实是这些：</p>
<ul>
<li class="">能把经验 <strong>自动化</strong></li>
<li class="">能把流程 <strong>平台化</strong></li>
<li class="">能从业务指标理解系统问题</li>
<li class="">能设计 <strong>可观测性和稳定性体系</strong></li>
</ul>
<p>目前来说 <strong>未来的运维，不是去修机器的人，而是让系统自己会修自己，会观测自己，会听从人类语言指令自动构建建设的那个人。</strong></p>]]></content:encoded>
            <category>Linux</category>
            <category>AI</category>
        </item>
        <item>
            <title><![CDATA[Redis 线程模型]]></title>
            <link>https://tanzhuo.xyz/2026/03/13/redis-nei-cun-mo-xing</link>
            <guid>https://tanzhuo.xyz/2026/03/13/redis-nei-cun-mo-xing</guid>
            <pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Redis 以高性能著称，其核心原因之一就是其独特的 线程模型设计。很多人听说 Redis 是“单线程”，但实际上 Redis 的线程模型在不同版本中已经发生了演进。]]></description>
            <content:encoded><![CDATA[<p>Redis 以高性能著称，其核心原因之一就是其独特的 <strong>线程模型设计</strong>。很多人听说 Redis 是“单线程”，但实际上 Redis 的线程模型在不同版本中已经发生了演进。理解 Redis 的线程模型，对于理解其高性能原理、以及在高并发场景中的使用方式非常重要。</p>
<!-- -->
<p>本文将从 <strong>Redis 单线程设计、事件驱动模型、IO 多路复用以及 Redis 6 之后的多线程改进</strong>几个方面进行介绍。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="redis-为什么选择单线程">Redis 为什么选择单线程<a href="https://tanzhuo.xyz/2026/03/13/redis-nei-cun-mo-xing#redis-%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9%E5%8D%95%E7%BA%BF%E7%A8%8B" class="hash-link" aria-label="Redis 为什么选择单线程的直接链接" title="Redis 为什么选择单线程的直接链接" translate="no">​</a></h2>
<p>Redis 早期版本（Redis 6 之前）的核心执行模型是 <strong>单线程处理命令</strong>。</p>
<p>也就是说：</p>
<ul>
<li class="">所有客户端请求</li>
<li class="">所有命令执行</li>
<li class="">数据读写</li>
</ul>
<p>都由 <strong>一个主线程完成</strong>。</p>
<p>但需要注意的是：</p>
<p>Redis 的单线程 <strong>只指命令执行单线程</strong>，并不是整个 Redis 进程只有一个线程。例如：</p>
<ul>
<li class="">RDB 持久化</li>
<li class="">AOF rewrite</li>
<li class="">异步删除</li>
<li class="">BIO 线程</li>
</ul>
<p>这些其实都是后台线程。</p>
<p>Redis 的核心线程只负责：</p>
<ul>
<li class="">网络 IO</li>
<li class="">命令解析</li>
<li class="">命令执行</li>
<li class="">返回结果</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="单线程为什么依然很快">单线程为什么依然很快<a href="https://tanzhuo.xyz/2026/03/13/redis-nei-cun-mo-xing#%E5%8D%95%E7%BA%BF%E7%A8%8B%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BE%9D%E7%84%B6%E5%BE%88%E5%BF%AB" class="hash-link" aria-label="单线程为什么依然很快的直接链接" title="单线程为什么依然很快的直接链接" translate="no">​</a></h2>
<p>很多人会疑惑：单线程为什么还能支撑几十万 QPS？</p>
<p>Redis 的高性能主要来自以下几个原因。</p>
<p>内存数据库：Redis 所有数据都在内存中，避免了磁盘 IO。内存速度和磁盘速度不是一个数量级的。</p>
<p>避免线程切换开销：单线程执行命令，避免了加锁，竞争，复杂并发控制</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="io-多路复用">IO 多路复用<a href="https://tanzhuo.xyz/2026/03/13/redis-nei-cun-mo-xing#io-%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8" class="hash-link" aria-label="IO 多路复用的直接链接" title="IO 多路复用的直接链接" translate="no">​</a></h2>
<p>Redis 并不是一次只处理一个连接，而是使用 <strong>IO 多路复用模型</strong>。</p>
<p>Redis 使用的 IO 模型包括：</p>
<ul>
<li class="">epoll（Linux）</li>
<li class="">kqueue（MacOS / BSD）</li>
<li class="">select</li>
<li class="">evport</li>
</ul>
<p>Redis 会通过事件循环监听所有客户端连接：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">             ┌───────────────┐</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Client 1 ───▶│               │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Client 2 ───▶│               │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Client 3 ───▶│  IO Multiplex │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Client N ───▶│               │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">             └───────┬───────┘</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                     │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                     ▼</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               Redis EventLoop</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                     │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                     ▼</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               Command Execute</span><br></div></code></pre></div></div>
<p>处理流程：</p>
<ol>
<li class="">监听多个客户端 socket</li>
<li class="">哪个 socket 有数据就绪</li>
<li class="">读取请求</li>
<li class="">执行命令</li>
<li class="">返回结果</li>
</ol>
<p>因此 Redis 可以用 <strong>单线程同时处理大量连接</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="redis-6-的多线程改进">Redis 6 的多线程改进<a href="https://tanzhuo.xyz/2026/03/13/redis-nei-cun-mo-xing#redis-6-%E7%9A%84%E5%A4%9A%E7%BA%BF%E7%A8%8B%E6%94%B9%E8%BF%9B" class="hash-link" aria-label="Redis 6 的多线程改进的直接链接" title="Redis 6 的多线程改进的直接链接" translate="no">​</a></h2>
<p>随着硬件发展，CPU 核数越来越多，Redis 的单线程模型在某些场景下会遇到瓶颈，瓶颈主要在 <strong>网络 IO</strong>。</p>
<p>例如：</p>
<ul>
<li class="">大量客户端连接</li>
<li class="">网络数据收发量巨大</li>
</ul>
<p>因此 Redis 6 引入了 <strong>IO 多线程</strong>。</p>
<p>执行流程变为：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Client Request</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       ▼</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">IO Threads (read)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       ▼</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Main Thread Execute Command</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       ▼</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">IO Threads (write)</span><br></div></code></pre></div></div>
<p>因此：</p>
<ul>
<li class=""><strong>命令执行仍然是单线程</strong></li>
<li class=""><strong>IO 操作可以并行</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="redis-单线程的使用建议">Redis 单线程的使用建议<a href="https://tanzhuo.xyz/2026/03/13/redis-nei-cun-mo-xing#redis-%E5%8D%95%E7%BA%BF%E7%A8%8B%E7%9A%84%E4%BD%BF%E7%94%A8%E5%BB%BA%E8%AE%AE" class="hash-link" aria-label="Redis 单线程的使用建议的直接链接" title="Redis 单线程的使用建议的直接链接" translate="no">​</a></h2>
<p>由于 Redis 命令执行是单线程，因此需要注意以下几点：</p>
<p><strong>避免慢命令</strong></p>
<p>例如：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">KEYS *</span><br></div></code></pre></div></div>
<p>这类命令会阻塞 Redis。</p>
<p>应该使用：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">SCAN</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="控制大-key">控制大 Key<a href="https://tanzhuo.xyz/2026/03/13/redis-nei-cun-mo-xing#%E6%8E%A7%E5%88%B6%E5%A4%A7-key" class="hash-link" aria-label="控制大 Key的直接链接" title="控制大 Key的直接链接" translate="no">​</a></h3>
<p>大 Key 会导致：</p>
<ul>
<li class="">网络阻塞</li>
<li class="">CPU 执行时间变长</li>
</ul>
<p>建议：</p>
<ul>
<li class="">拆分数据</li>
<li class="">使用 hash / set</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="使用-pipeline">使用 Pipeline<a href="https://tanzhuo.xyz/2026/03/13/redis-nei-cun-mo-xing#%E4%BD%BF%E7%94%A8-pipeline" class="hash-link" aria-label="使用 Pipeline的直接链接" title="使用 Pipeline的直接链接" translate="no">​</a></h3>
<p>Pipeline 可以减少网络往返：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">client -&gt; redis -&gt; client</span><br></div></code></pre></div></div>
<p>提升整体吞吐量。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结">总结<a href="https://tanzhuo.xyz/2026/03/13/redis-nei-cun-mo-xing#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接" translate="no">​</a></h2>
<p>Redis 通过 <strong>内存操作、IO 多路复用、事件驱动（Event Loop）以及单线程命令执行</strong> 的架构设计，在避免锁竞争和线程切换开销的同时，实现了极高的并发处理能力。</p>]]></content:encoded>
            <category>技术</category>
            <category>Redis</category>
        </item>
        <item>
            <title><![CDATA[数据结构：二叉树]]></title>
            <link>https://tanzhuo.xyz/2026/03/13/shu-ju-jie-gou-shuang-xiang-lian-biao</link>
            <guid>https://tanzhuo.xyz/2026/03/13/shu-ju-jie-gou-shuang-xiang-lian-biao</guid>
            <pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[二叉树（Binary Tree） 是一种常见的数据结构，它由若干节点组成，每个节点最多只有 两个子节点： 左子节点（Left Child） 右子节点（Right Child） 因此称为 二叉树 每个节点通常包含三个部…]]></description>
            <content:encoded><![CDATA[<p><strong>二叉树（Binary Tree）</strong> 是一种常见的数据结构，它由若干节点组成，每个节点最多只有 <strong>两个子节点</strong>：</p>
<!-- -->
<ul>
<li class="">左子节点（Left Child）</li>
<li class="">右子节点（Right Child）</li>
</ul>
<p>因此称为 <strong>二叉树</strong></p>
<p>每个节点通常包含三个部分：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Node {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    value</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    left</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    right</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>简单结构示例：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">        A</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       / \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      B   C</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     / \   \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    D   E   F</span><br></div></code></pre></div></div>
<p>其中：</p>
<ul>
<li class="">A 是 <strong>根节点（Root）</strong></li>
<li class="">B、C 是 A 的 <strong>子节点</strong></li>
<li class="">D、E 是 B 的 <strong>子节点</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="满二叉树full-binary-tree">满二叉树（Full Binary Tree）<a href="https://tanzhuo.xyz/2026/03/13/shu-ju-jie-gou-shuang-xiang-lian-biao#%E6%BB%A1%E4%BA%8C%E5%8F%89%E6%A0%91full-binary-tree" class="hash-link" aria-label="满二叉树（Full Binary Tree）的直接链接" title="满二叉树（Full Binary Tree）的直接链接" translate="no">​</a></h2>
<p>如果一棵树的 <strong>所有节点要么有两个子节点，要么没有子节点</strong>，则称为满二叉树。</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">        A</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       / \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      B   C</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     / \ / \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    D  E F  G</span><br></div></code></pre></div></div>
<p>特点：</p>
<ul>
<li class="">每个节点要么 <strong>0 个子节点</strong></li>
<li class="">要么 <strong>2 个子节点</strong></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="完全二叉树complete-binary-tree">完全二叉树（Complete Binary Tree）<a href="https://tanzhuo.xyz/2026/03/13/shu-ju-jie-gou-shuang-xiang-lian-biao#%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91complete-binary-tree" class="hash-link" aria-label="完全二叉树（Complete Binary Tree）的直接链接" title="完全二叉树（Complete Binary Tree）的直接链接" translate="no">​</a></h2>
<p>完全二叉树要求：</p>
<ul>
<li class="">除最后一层外，其余层全部填满</li>
<li class="">最后一层节点从 <strong>左往右连续排列</strong></li>
</ul>
<p>示例：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">        1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       / \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      2   3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     / \  /</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    4  5 6</span><br></div></code></pre></div></div>
<p>这种结构非常适合 <strong>数组存储</strong>，因此 <strong>堆（Heap）</strong> 就是完全二叉树。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="二叉搜索树bst">二叉搜索树（BST）<a href="https://tanzhuo.xyz/2026/03/13/shu-ju-jie-gou-shuang-xiang-lian-biao#%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91bst" class="hash-link" aria-label="二叉搜索树（BST）的直接链接" title="二叉搜索树（BST）的直接链接" translate="no">​</a></h2>
<p>二叉搜索树（Binary Search Tree）满足：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">左子树 &lt; 根节点 &lt; 右子树</span><br></div></code></pre></div></div>
<p>示例：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">        8</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       / \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      3   10</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">     / \    \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    1   6    14</span><br></div></code></pre></div></div>
<p>特点：</p>
<ul>
<li class="">查询效率高</li>
<li class="">平均时间复杂度：<strong>O(log n)</strong></li>
</ul>
<p>但如果树退化成链表：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    3</span><br></div></code></pre></div></div>
<p>时间复杂度会退化为：</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">O(n)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结">总结<a href="https://tanzhuo.xyz/2026/03/13/shu-ju-jie-gou-shuang-xiang-lian-biao#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接" translate="no">​</a></h2>
<p>二叉树是最基础也是最重要的数据结构之一，其核心特点是</p>
<ul>
<li class="">每个节点最多 <strong>两个子节点</strong></li>
<li class="">支持 <strong>高效搜索</strong></li>
<li class="">可以扩展为多种高级数据结构</li>
</ul>
<p>常见变种包括：</p>
<ul>
<li class="">二叉搜索树（BST）</li>
<li class="">AVL 树</li>
<li class="">红黑树</li>
<li class="">堆（Heap）</li>
</ul>
<p>理解二叉树是学习 <strong>算法与数据结构</strong> 的重要基础。</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Istio-限流配置]]></title>
            <link>https://tanzhuo.xyz/2025/11/04/istio</link>
            <guid>https://tanzhuo.xyz/2025/11/04/istio</guid>
            <pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Istio Envoy Proxy 在微服务架构中，系统通常会通过 Istio IngressGateway 对外提供统一入口。]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="istio-envoy-proxy">Istio Envoy Proxy<a href="https://tanzhuo.xyz/2025/11/04/istio#istio-envoy-proxy" class="hash-link" aria-label="Istio Envoy Proxy的直接链接" title="Istio Envoy Proxy的直接链接" translate="no">​</a></h2>
<!-- -->
<p>在微服务架构中，系统通常会通过 <strong>Istio IngressGateway</strong> 对外提供统一入口。当系统流量突然增加（例如活动流量、爬虫攻击、接口被刷等情况）时，如果没有限流机制，后端服务可能会出现以下问题：</p>
<ul>
<li class="">接口被高频调用，导致服务 CPU 或数据库压力过大</li>
<li class="">突发流量导致系统雪崩或级联故障</li>
<li class="">某些核心 API 被恶意刷接口，影响正常用户访问</li>
</ul>
<p>因此，需要在 <strong>网关层统一进行限流控制</strong>，在请求进入后端服务之前进行流量治理。</p>
<p>Istio 基于 <strong>Envoy Proxy</strong> 实现流量管理能力，可以通过 <strong>Envoy RateLimit + Redis</strong> 实现全局限流，对特定接口或路径进行访问频率控制。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="什么时候会用到-istio-限流">什么时候会用到 Istio 限流<a href="https://tanzhuo.xyz/2025/11/04/istio#%E4%BB%80%E4%B9%88%E6%97%B6%E5%80%99%E4%BC%9A%E7%94%A8%E5%88%B0-istio-%E9%99%90%E6%B5%81" class="hash-link" aria-label="什么时候会用到 Istio 限流的直接链接" title="什么时候会用到 Istio 限流的直接链接" translate="no">​</a></h2>
<p>通常在以下场景中会配置 Istio 限流</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">/api/login</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/api/send-code</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/api/payment</span><br></div></code></pre></div></div>
<p>这些接口如果被频繁调用，可能会导致系统资源被耗尽。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="istio-envoy-proxy配置文件">Istio Envoy Proxy配置文件<a href="https://tanzhuo.xyz/2025/11/04/istio#istio-envoy-proxy%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6" class="hash-link" aria-label="Istio Envoy Proxy配置文件的直接链接" title="Istio Envoy Proxy配置文件的直接链接" translate="no">​</a></h2>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># --------------------------------------------</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 0) Redis 密码放 Secret（更安全）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    用 Secret 存放敏感信息（如 Redis 密码），避免明文进入镜像或 Pod 环境变量历史</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># --------------------------------------------</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Secret</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ratelimit</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">redis</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">secret          </span><span class="token comment" style="color:#999988;font-style:italic"># Secret 名称，后续 Deployment 通过 secretKeyRef 引用</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> istio</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system               </span><span class="token comment" style="color:#999988;font-style:italic"># 放在与 ratelimit 服务相同的命名空间，便于引用与管理</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Opaque</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">stringData</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">REDIS_AUTH</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"password"</span><span class="token plain">       </span><span class="token comment" style="color:#999988;font-style:italic"># 明文由 K8s 负责 base64 编码存储</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># --------------------------------------------</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 1) Ratelimit 配额配置（Envoy Ratelimit Server 的运行时配置）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    - 该 ConfigMap 被容器以只读方式挂载到 /data/ratelimit/config</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    - domain 必须与 Envoy HTTP 过滤器里的 domain 完全一致，否则不会命中</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    - descriptors 用来描述限流的“维度组合”（actions 组合后形成的描述符）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># --------------------------------------------</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ratelimit</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> istio</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">config.yaml</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    domain: ingress-ratelimit          # 必须与 RateLimit 过滤器的 domain 一致</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">    descriptors:</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">      - key: header_match              # 顶层 key：与 HTTP_ROUTE 中的 header_value_match 对应（actions 1/2）</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">        value: path-api         # 顶层 value：来自路由上 actions 的 descriptor_value</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">        descriptors:                   # 二级描述符：继续细分 (组合成唯一的限流键)</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          - key: generic_key           # 与 HTTP_ROUTE 中 generic_key 对应（actions 2/2）</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">            value: istio-limit-v1      # 对应路由里设置的 descriptor_value</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">            rate_limit:</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">              unit: second             # 时间单位：second / minute / hour / day</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">              requests_per_unit: 5     # 配额：单位时间内允许的请求数（此处为 1 秒 1 次）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># --------------------------------------------</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 2) Ratelimit Service（连接你现有 Redis 单机）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    - 通过 envoyproxy/ratelimit 实现全局滑窗/令牌桶限流的配置服务</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    - replicas=1：测试环境单副本；生产建议至少 2-3 副本并配合 Redis 高可用</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    - readiness/liveness：通过 6070 端口健康检查</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    - 关键环境变量：REDIS_URL / REDIS_AUTH / RUNTIME_ROOT / RUNTIME_SUBDIRECTORY</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># --------------------------------------------</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Service</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ratelimit                         </span><span class="token comment" style="color:#999988;font-style:italic"># 供 Envoy 通过集群名解析 (outbound|8081||ratelimit.istio-system.svc.cluster.local)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> istio</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ratelimit </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 与 Deployment 的 labels 匹配</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> grpc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8081</span><span class="token plain">                          </span><span class="token comment" style="color:#999988;font-style:italic"># gRPC 服务端口（Envoy RateLimit 过滤器将连此端口）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">targetPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8081</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ratelimit</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> istio</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain">                              </span><span class="token comment" style="color:#999988;font-style:italic"># 测试设 1，生产建议 ≥3 并做好 HPA/PodDisruptionBudget</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ratelimit </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ratelimit </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ratelimit</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> envoyproxy/ratelimit</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">875d418c   </span><span class="token comment" style="color:#999988;font-style:italic"># 指定 commit/tag，保证版本可重现；可考虑升级到官方较新 tag</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">imagePullPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> IfNotPresent</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"/bin/ratelimit"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 启动入口</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic"># HTTP Admin（可选：metrics/调试）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8081</span><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic"># gRPC 主服务端口</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6070</span><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic"># 健康检查端口（/healthcheck）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">env</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> REDIS_SOCKET_TYPE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> tcp                         </span><span class="token comment" style="color:#999988;font-style:italic"># 通过 TCP 连接 Redis</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> REDIS_URL</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"redis://1.1.1.1:6379"</span><span class="token comment" style="color:#999988;font-style:italic"># 你的 Redis 地址（生产建议内网域名 + 哨兵或集群）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> REDIS_POOL_SIZE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"20"</span><span class="token plain">                        </span><span class="token comment" style="color:#999988;font-style:italic"># 连接池大小；视并发/副本数调优</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> REDIS_AUTH</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">valueFrom</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">secretKeyRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ratelimit</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">redis</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">secret   </span><span class="token comment" style="color:#999988;font-style:italic"># 从 Secret 注入密码，避免明文</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> REDIS_AUTH</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> USE_STATSD</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"false"</span><span class="token plain">                     </span><span class="token comment" style="color:#999988;font-style:italic"># 如有 statsd/Prometheus sidecar 可打开</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> RUNTIME_ROOT</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /data                       </span><span class="token comment" style="color:#999988;font-style:italic"># 对应挂载点根目录</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> RUNTIME_SUBDIRECTORY</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ratelimit                   </span><span class="token comment" style="color:#999988;font-style:italic"># 子目录，最终配置路径 /data/ratelimit/config</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> RUNTIME_IGNOREDOTFILES</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span><span class="token plain">                      </span><span class="token comment" style="color:#999988;font-style:italic"># 忽略隐藏文件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">volumeMounts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">mountPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /data/ratelimit/config  </span><span class="token comment" style="color:#999988;font-style:italic"># 与上面 runtime 路径一致，确保装载到 config 子目录</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">readinessProbe</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">httpGet</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /healthcheck</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6070</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">initialDelaySeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">               </span><span class="token comment" style="color:#999988;font-style:italic"># 初始延迟，避免冷启动误判</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">periodSeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain">                     </span><span class="token comment" style="color:#999988;font-style:italic"># 探测频率</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">livenessProbe</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">httpGet</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /healthcheck</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6070</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">initialDelaySeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">periodSeconds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">configMap</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ratelimit</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config               </span><span class="token comment" style="color:#999988;font-style:italic"># 装载上面的 ConfigMap</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># --------------------------------------------</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 3) IngressGateway 注入全局 RateLimit 过滤器 + 指向 ratelimit 的 CLUSTER</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    - 通过 EnvoyFilter 在 HTTP Router 之前插入全局 ratelimit HTTP 过滤器</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    - workloadSelector：限定只作用于网关工作负载（label: istio=ingressgateway）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    - rate_limit_service：连到上面定义的 ratelimit gRPC（通过集群名/authority）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    - 追加一个 Lua 响应过滤器：当后端返回 429 时，改写为统一 JSON</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># --------------------------------------------</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> networking.istio.io/v1alpha3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> EnvoyFilter</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gateway</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">global</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">limit</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">filter</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> istio</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">workloadSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">istio</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ingressgateway                 </span><span class="token comment" style="color:#999988;font-style:italic"># 只作用在 IngressGateway 实例</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">configPatches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 3.1 在 router 之前插入 ratelimit HTTP 过滤器（全局生效）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">applyTo</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HTTP_FILTER</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">match</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">context</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> GATEWAY</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">listener</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">filterChain</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">filter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> envoy.filters.network.http_connection_manager    </span><span class="token comment" style="color:#999988;font-style:italic"># HTTP 连接管理器</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">subFilter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> envoy.filters.http.router                      </span><span class="token comment" style="color:#999988;font-style:italic"># 在 Router 之前插入</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">patch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">operation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> INSERT_BEFORE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> envoy.filters.http.ratelimit</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">typed_config</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">"@type"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> type.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimit</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">domain</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ingress</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">ratelimit          </span><span class="token comment" style="color:#999988;font-style:italic"># 必须与 ConfigMap 里的 domain 一致</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">failure_mode_deny</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain">           </span><span class="token comment" style="color:#999988;font-style:italic"># 后端 ratelimit 服务异常时是否拒绝请求；false=放行（推荐）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 10s                       </span><span class="token comment" style="color:#999988;font-style:italic"># 访问 ratelimit 服务的超时</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">rate_limit_service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">grpc_service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">envoy_grpc</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">cluster_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> outbound</span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain">8081</span><span class="token punctuation" style="color:#393A34">|</span><span class="token punctuation" style="color:#393A34">|</span><span class="token plain">ratelimit.istio</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system.svc.cluster.local  </span><span class="token comment" style="color:#999988;font-style:italic"># Istio 自动生成的集群名</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  </span><span class="token key atrule" style="color:#00a4db">authority</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ratelimit.istio</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system.svc.cluster.local                     </span><span class="token comment" style="color:#999988;font-style:italic"># HTTP/2 Host (SNI)，可省略</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">transport_api_version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> V3         </span><span class="token comment" style="color:#999988;font-style:italic"># 使用 v3 API（推荐）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 3.2 基于端口 1035 的 Listener 再插入 Lua 响应过滤器（可选：仅对该监听端口生效）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">applyTo</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HTTP_FILTER</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">match</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">context</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> GATEWAY</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">listener</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">portNumber</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1035</span><span class="token plain">                      </span><span class="token comment" style="color:#999988;font-style:italic"># 仅对 1035 端口的 Listener 生效（你的网关暴露此端口）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">filterChain</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">filter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> envoy.filters.network.http_connection_manager</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">subFilter</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> envoy.filters.http.router</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">patch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">operation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> INSERT_BEFORE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> envoy.filters.http.lua</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">typed_config</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">"@type"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">inlineCode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">              function envoy_on_response(handle)</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">                local s = tonumber(handle:headers():get(":status") or "0")</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">                if s == 429 then</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">                  local body = '{"code":429,"message":"Too many requests. Please try again later."}'</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">                  handle:headers():replace("content-type", "application/json")</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">                  handle:headers():replace("content-length", tostring(#body))</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">                  handle:body(true):setBytes(body)</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">                end</span><br></div><div class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">              end</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic"># 注意：</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic"># - 如果你的网关并非监听 1035（或多端口），请确认此过滤器是否应该扩大到所有端口（去掉 portNumber 条件）</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic"># - 也可用本地速率限制本地拒绝时在本机生成 429，再由该 Lua 统一改写</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># --------------------------------------------</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 4) 给 VirtualHost 注入 per-route 限流动作</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    - 在指定的 Route（或整个 vhost）下配置 actions，从而生成与 ConfigMap 匹配的 descriptors</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    - 这里使用两段 action：</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#        a) header_value_match：当 :path 以 /api 前缀命中时，写入 descriptor_value=path-api</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#        b) generic_key：再追加 descriptor_value=istio-limit-v1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    - 两段组合 =&gt; (key=header_match,value=path-api) + (key=generic_key,value=istio-limit-v1)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#      正好与 ConfigMap 对应，从而激活“1 秒 1 次”的限流</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># --------------------------------------------</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> networking.istio.io/v1alpha3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> EnvoyFilter</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gateway</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">limit</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">descriptor</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">svc</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> istio</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">workloadSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">istio</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ingressgateway                       </span><span class="token comment" style="color:#999988;font-style:italic"># 作用范围限定在网关</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">configPatches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">applyTo</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HTTP_ROUTE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">match</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">context</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> GATEWAY</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">routeConfiguration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">vhost</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">port       </span><span class="token comment" style="color:#999988;font-style:italic"># 注意此 vhost 名：通常为 "&lt;host&gt;:&lt;port&gt;"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">patch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">operation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> MERGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">route</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">rate_limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">actions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">header_value_match</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token key atrule" style="color:#00a4db">headers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">":path"</span><span class="token plain">             </span><span class="token comment" style="color:#999988;font-style:italic"># 匹配伪首部 :path，基于前缀判断</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        </span><span class="token key atrule" style="color:#00a4db">prefix_match</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/api"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token key atrule" style="color:#00a4db">expect_match</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 仅当匹配时才添加该描述符</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token key atrule" style="color:#00a4db">descriptor_value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"path-api"</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic"># 对应 ConfigMap 顶层 key/value</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">generic_key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token key atrule" style="color:#00a4db">descriptor_value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"istio-limit-v1"</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 对应 ConfigMap 二级 key/value</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>K8S</category>
        </item>
        <item>
            <title><![CDATA[阿里云实时数仓]]></title>
            <link>https://tanzhuo.xyz/2024/01/10/a-li-yun-shi-shi-shu-cang</link>
            <guid>https://tanzhuo.xyz/2024/01/10/a-li-yun-shi-shi-shu-cang</guid>
            <pubDate>Wed, 10 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[前言 使用阿里云现有的产品生态体系，可以解决企业自建集群复杂，难维护，部署成本高的问题。基于这些情况我们可以使用目前阿里云已有的产品进行开通，来满足企业业务需求。]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="前言">前言<a href="https://tanzhuo.xyz/2024/01/10/a-li-yun-shi-shi-shu-cang#%E5%89%8D%E8%A8%80" class="hash-link" aria-label="前言的直接链接" title="前言的直接链接" translate="no">​</a></h2>
<!-- -->
<p>使用阿里云现有的产品生态体系，可以解决企业自建集群复杂，难维护，部署成本高的问题。基于这些情况我们可以使用目前阿里云已有的产品进行开通，来满足企业业务需求。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="目前面临痛点">目前面临痛点<a href="https://tanzhuo.xyz/2024/01/10/a-li-yun-shi-shi-shu-cang#%E7%9B%AE%E5%89%8D%E9%9D%A2%E4%B8%B4%E7%97%9B%E7%82%B9" class="hash-link" aria-label="目前面临痛点的直接链接" title="目前面临痛点的直接链接" translate="no">​</a></h2>
<p>1、底层数据库无法承载海量数据，根据后续企业发展，10T，100T，以及PB，EB数据量无法承载，以及无法支撑快速查询响应，数据分析以及数据挖掘等工作。</p>
<p>2、实时计算性能存在一定不足，需要通过可靠计算引擎进行毫秒级实时计算，并且数据质量可靠，可控，可遥测。</p>
<p>3、数据模型调整效率不够快速，不能够非常灵活的调整数据模型结构，快速的提供业务场景报表需求。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="应用场景">应用场景<a href="https://tanzhuo.xyz/2024/01/10/a-li-yun-shi-shi-shu-cang#%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF" class="hash-link" aria-label="应用场景的直接链接" title="应用场景的直接链接" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://yq.aliyun.com/articles/719246?spm=a2c6h.12873639.article-detail.10.35a62292oUX3aq&amp;ref=tanzhuo.xyz" target="_blank" rel="noopener noreferrer" class=""><strong>基于Flink和规则引擎的实时风控解决方案</strong></a></li>
<li class=""><a href="https://yq.aliyun.com/articles/692345?spm=a2c6h.12873639.article-detail.12.35a62292oUX3aq&amp;ref=tanzhuo.xyz" target="_blank" rel="noopener noreferrer" class=""><strong>基于实时计算（Flink）与高斯模型构建实时异常检测系统</strong></a></li>
<li class=""><a href="https://yq.aliyun.com/articles/691497?spm=a2c6h.12873639.article-detail.19.35a62292oUX3aq&amp;ref=tanzhuo.xyz" target="_blank" rel="noopener noreferrer" class="">基于实时计算（Flink）打造一个简单的实时推荐系统</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="实时数仓">实时数仓<a href="https://tanzhuo.xyz/2024/01/10/a-li-yun-shi-shi-shu-cang#%E5%AE%9E%E6%97%B6%E6%95%B0%E4%BB%93" class="hash-link" aria-label="实时数仓的直接链接" title="实时数仓的直接链接" translate="no">​</a></h2>
<p>总体数据开发流程</p>
<p><img decoding="async" loading="lazy" src="https://tanzhuo.xyz/assets/images/2024-03-p301715-260628d991918b4359af348e3a5f2781.webp" width="1162" height="547" class="img_ev3q"></p>
<p>数据拉取-&gt;数据缓冲-&gt;实时计算-&gt;下沉落库</p>
<p><img decoding="async" loading="lazy" src="https://tanzhuo.xyz/assets/images/2024-03-p399558-45f9e637bf9658f8bc0a4901192767fb.png" width="798" height="448" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="组件选型">组件选型<a href="https://tanzhuo.xyz/2024/01/10/a-li-yun-shi-shi-shu-cang#%E7%BB%84%E4%BB%B6%E9%80%89%E5%9E%8B" class="hash-link" aria-label="组件选型的直接链接" title="组件选型的直接链接" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="flink">Flink<a href="https://tanzhuo.xyz/2024/01/10/a-li-yun-shi-shi-shu-cang#flink" class="hash-link" aria-label="Flink的直接链接" title="Flink的直接链接" translate="no">​</a></h3>
<p><a href="https://www.aliyun.com/product/bigdata/sc?spm=a2c4g.11186623.J_4VYgf18xNlTAyFFbOuOQe.115.7cf75c67wmW96D&amp;scm=20140722.S_product%40%40%E4%BA%91%E4%BA%A7%E5%93%81%40%40247054._.ID_product%40%40%E4%BA%91%E4%BA%A7%E5%93%81%40%40247054-RL_flink-LOC_menu%7EUND%7Eproduct-OR_ser-V_3-P0_0&amp;ref=tanzhuo.xyz" target="_blank" rel="noopener noreferrer" class="">阿里云实时计算 Flink 版</a></p>
<p>阿里云全托管Flink实时计算引擎，免去企业自建Yarn，Flink等节点以及繁琐配置，主要对 Datahub 消息总线中的业务数据进行处理计算，根据数据的业务场景合理下发后续数据。使用阿里云生态，元数据管理更加便利。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="datahub">Datahub<a href="https://tanzhuo.xyz/2024/01/10/a-li-yun-shi-shi-shu-cang#datahub" class="hash-link" aria-label="Datahub的直接链接" title="Datahub的直接链接" translate="no">​</a></h3>
<p><a href="https://www.aliyun.com/product/bigdata/datahub?spm=5176.28508143.J_4VYgf18xNlTAyFFbOuOQe.48.6ce5154ajrJlWg&amp;scm=20140722.S_product%40%40%E4%BA%91%E4%BA%A7%E5%93%81%40%40813456._.ID_product%40%40%E4%BA%91%E4%BA%A7%E5%93%81%40%40813456-RL_datahub-LOC_menu%7EUND%7Eproduct-OR_ser-V_3-P0_0&amp;ref=tanzhuo.xyz" target="_blank" rel="noopener noreferrer" class="">数据总线 DataHub</a></p>
<p>Datahub 的作用相当于数据缓冲层，对实时数据流提供高性能的存储与流传输。在 Flink 计算中途的部分 DWD，DWS层临时数据以及下游数据进行任务转发与存储，达到消息总线作用。topic 单日读写可达T级数据量，提供数据流转更高效，稳定的处理，此组件也是全托管，无需关注节点数量。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hologres">Hologres<a href="https://tanzhuo.xyz/2024/01/10/a-li-yun-shi-shi-shu-cang#hologres" class="hash-link" aria-label="Hologres的直接链接" title="Hologres的直接链接" translate="no">​</a></h3>
<p><a href="https://www.aliyun.com/product/bigdata/hologram?spm=5176.28348429.J_4VYgf18xNlTAyFFbOuOQe.86.59056284OdWWsx&amp;ref=tanzhuo.xyz" target="_blank" rel="noopener noreferrer" class="">实时数仓Hologres - 大数据交互式分析 – 分析服务一体化</a></p>
<p>在 Flink 计算完成之后，对应层级数据输出下沉到 Hologres 数仓中，Hologres 可支持行存，列存，以及字段匹配分区存储，解决海量数据存储问题，并实现了PB级数据亚秒级分析。Hologres 的存储使用的是阿里自研的Pangu分布式文件系统（类似HDFS），本身架构属于大数据数仓设计体系，整体采用 Storage Disaggregation（存储计算分离架构）计算节点可以进行横向扩展，提高并行计算能力，解决海量数据查询实效问题。</p>
<p><img decoding="async" loading="lazy" src="https://tanzhuo.xyz/assets/images/2024-03-p431174-3bb38ec6264307fcee5ef97365184050.png" width="1011" height="595" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="处理流程">处理流程<a href="https://tanzhuo.xyz/2024/01/10/a-li-yun-shi-shi-shu-cang#%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B" class="hash-link" aria-label="处理流程的直接链接" title="处理流程的直接链接" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://tanzhuo.xyz/assets/images/2024-01-3-ad3171d5d2d0142e9db892126744680c.webp" width="1530" height="1140" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="数仓分层">数仓分层<a href="https://tanzhuo.xyz/2024/01/10/a-li-yun-shi-shi-shu-cang#%E6%95%B0%E4%BB%93%E5%88%86%E5%B1%82" class="hash-link" aria-label="数仓分层的直接链接" title="数仓分层的直接链接" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://tanzhuo.xyz/assets/images/2024-03-v2-27465cd3ad33b8afaa35e914c7f308cb_r-1130bc39ed4a403069f137fd10db67df.png" width="695" height="466" class="img_ev3q"></p>
<p>在大数据领域，ODS、DWD、DWS和ADS是常见的数据分层概念，用于组织和管理数据。它们在数据处理和使用方面具有不同的功能和目的。</p>
<ol>
<li class="">ODS（Operational Data Store，运营数据存储层）：ODS层是一个面向操作性业务的数据存储层。它通常用于存储源系统的原始数据，保留了数据的完整性和详细性。ODS层的主要目标是支持实时或准实时的操作性需求，例如在线交易处理和实时查询。ODS层的数据通常不进行大规模加工和计算，而是直接用于操作性业务。</li>
<li class="">DWD（Data Warehouse Detail，数据仓库明细层）：DWD层是一个面向数据仓库的数据存储层。它用于存储经过清洗、集成和转换的数据，通常是面向主题的、可查询的数据。DWD层的数据经过ETL（抽取、转换和加载）处理，用于支持数据分析、报表和决策支持等任务。DWD层的数据具有较高的质量和一致性，并且通常以事实表和维度表的形式组织。</li>
<li class="">DWS（Data Warehouse Summary，数据仓库汇总层）：DWS层是一个面向数据仓库的数据存储层。它用于存储经过聚合、汇总和预计算的数据，以提供更高层次的数据摘要和分析性能。DWS层的数据通常以汇总表或预计算的指标为主，用于支持复杂的数据分析、数据挖掘和业务智能需求。</li>
<li class="">ADS（Application Data Service，应用数据服务层）：ADS层是一个面向应用程序的数据存储层。它用于存储经过进一步加工、计算和优化的数据，以满足特定应用程序的需求。ADS层的数据通常是针对具体应用程序的数据视图或数据集，经过适配和优化，以提供更高效的数据访问和处理能力。</li>
</ol>
<p>这些数据分层的区别在于数据的处理方式、目标和使用场景。ODS层主要用于操作性业务，保留原始数据的完整性；DWD层用于数据仓库，提供清洗、集成和转换后的可查询数据；DWS层用于数据仓库的汇总和预计算，提供更高层次的数据摘要和性能；ADS层用于特定应用程序，提供经过加工、计算和优化的数据。</p>
<p>这种分层的设计有以下几个原因和好处：</p>
<ol>
<li class="">数据处理和管理的分离：通过将数据分为不同的层次，可以将数据处理和管理的责任分离开来。DWD 层负责原始数据的提取、清洗和集成，DWS 层负责数据的聚合和汇总，而 ADS 层则提供面向应用的数据服务。这样可以实现数据处理的模块化和灵活性。</li>
<li class="">数据质量和一致性：DWD 层保留了原始数据的完整性和细节，可以用于数据质量分析和数据溯源。DWS 层提供了经过聚合和汇总的数据，可以提供更高效的查询性能和数据分析。ADS 层提供了面向应用的数据服务，保证了数据在不同应用场景下的一致性和准确性。</li>
<li class="">查询性能和应用开发效率：通过将数据进行汇总和预计算，DWS 层可以提供更高效的查询性能，加快数据分析和决策过程。ADS 层提供了面向应用的数据服务和接口，可以简化应用开发过程，提高开发效率和灵活性。</li>
</ol>]]></content:encoded>
            <category>Linux</category>
            <category>Java</category>
        </item>
    </channel>
</rss>