<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Control Plane on Tarragon</title><link>https://tarrragon.github.io/blog/tags/control-plane/</link><description>Recent content in Control Plane on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Tue, 23 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/control-plane/index.xml" rel="self" type="application/rss+xml"/><item><title>5.7 Traffic、Config 與 Control Plane Boundary</title><link>https://tarrragon.github.io/blog/backend/05-deployment-platform/traffic-config-control-plane-boundary/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/05-deployment-platform/traffic-config-control-plane-boundary/</guid><description>&lt;p>Traffic、config 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/control-plane/" data-link-title="Control Plane" data-link-desc="負責下發策略、配置與路由決策的控制層">control plane&lt;/a> boundary 的核心責任是把平台切換中的資料面與控制面分開。進入 Kubernetes、ELB、Envoy、Consul 或 Terraform 前，讀者需要先知道流量、設定、secret、service discovery 與管理面各自有不同風險與回退方式。&lt;/p>
&lt;h2 id="traffic-boundary">Traffic Boundary&lt;/h2>
&lt;p>Traffic boundary 的責任是決定 request 如何進入服務、如何分流、如何回退。它包含 load balancer、routing rule、health check、sticky session、timeout 與 drain。&lt;/p>
&lt;p>流量切換要能回答三個問題：哪一批 request 會到新版本、失敗時如何停止擴批、舊版本是否仍能承接回退流量。這三個答案明確後，&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/canary-release/" data-link-title="Canary Release" data-link-desc="分批把流量導向新版本、用 stop condition 控制 blast radius 的部署策略">canary&lt;/a> 才能從比例設定變成可回退策略。&lt;/p>
&lt;p>Traffic boundary 的判讀重點是 customer impact 如何被分批限制。小比例 canary、區域切流、tenant 切流與 route rule 都是不同切換單位；切換單位越清楚，&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rollback-window/" data-link-title="Rollback Window" data-link-desc="說明變更進入 production 後還能用哪種方式回退或改路線的時間與條件">rollback window&lt;/a> 越容易被驗證。&lt;/p>
&lt;h3 id="切換單位的選擇">切換單位的選擇&lt;/h3>
&lt;p>切換單位決定故障的 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/blast-radius/" data-link-title="Blast Radius" data-link-desc="說明事故影響面如何估算與隔離">blast radius&lt;/a> 與回退的精準度。常見切換單位各有不同操作特性：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>切換單位&lt;/th>
 &lt;th>blast radius&lt;/th>
 &lt;th>回退精準度&lt;/th>
 &lt;th>操作複雜度&lt;/th>
 &lt;th>適用場景&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>比例（%）&lt;/td>
 &lt;td>按流量比例&lt;/td>
 &lt;td>粗（全域）&lt;/td>
 &lt;td>低&lt;/td>
 &lt;td>通用 canary&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>區域 / AZ&lt;/td>
 &lt;td>限定地理範圍&lt;/td>
 &lt;td>中&lt;/td>
 &lt;td>中&lt;/td>
 &lt;td>跨區部署的服務&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>租戶 / 組織&lt;/td>
 &lt;td>限定特定客戶&lt;/td>
 &lt;td>高&lt;/td>
 &lt;td>高&lt;/td>
 &lt;td>多租戶 SaaS&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>路由規則&lt;/td>
 &lt;td>限定特定路徑&lt;/td>
 &lt;td>高&lt;/td>
 &lt;td>高&lt;/td>
 &lt;td>API 版本切換、功能漸進上線&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>比例切換最簡單但 blast radius 不可控——5% 的流量中可能包含大客戶的關鍵路徑。租戶切換精準度最高但操作複雜度也最高——需要在 routing 層維護租戶到版本的映射。穩定做法是從比例切換開始，遇到需要精準控制 impact 時再升級到租戶或路由規則切換。&lt;/p>
&lt;h2 id="config-boundary">Config Boundary&lt;/h2>
&lt;p>設定如何下發、如何生效、如何回退——Config boundary 回答這三個問題。&lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/config-rollout/" data-link-title="Config Rollout" data-link-desc="說明設定如何安全下發到正在運作的服務實例">config rollout&lt;/a> 和應用版本不一定同步，因此要保留相容窗口。&lt;/p>
&lt;p>高風險設定包含 payment provider endpoint、feature flag、rate limit、routing rule、timeout 與 fallback policy。這些設定變更可能不需要新 image，卻能改變 production 行為，因此要進 release gate。&lt;/p>
&lt;h3 id="config-變更的風險分級">Config 變更的風險分級&lt;/h3>
&lt;p>設定變更的風險不一致——有些設定改了只影響 log level，有些設定改了直接影響付款路徑。分級後才能對不同風險的設定套用對應的 review 與 rollout 強度。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>風險等級&lt;/th>
 &lt;th>設定類型&lt;/th>
 &lt;th>review 與 rollout 要求&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>高&lt;/td>
 &lt;td>payment endpoint、auth provider URL、encryption key&lt;/td>
 &lt;td>等同 code review + staged rollout + rollback 驗證&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>中&lt;/td>
 &lt;td>rate limit、timeout、feature flag、CORS 設定&lt;/td>
 &lt;td>變更 review + 觀測窗口&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>低&lt;/td>
 &lt;td>log level、debug flag、非關鍵 UI 文案&lt;/td>
 &lt;td>變更紀錄即可&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>風險分級的判讀依據是「這個設定改錯時、使用者會看到什麼」。改錯 payment endpoint 會讓付款打到錯誤目標；改錯 rate limit 可能讓合法流量被擋；改錯 log level 最多是 log 太吵或太安靜。設定的注入方式與版本追蹤見 &lt;a href="https://tarrragon.github.io/blog/backend/05-deployment-platform/container-runtime/" data-link-title="5.1 container 與 runtime" data-link-desc="整理 image、resource limit 與啟動行為">5.1 配置注入方式與取捨&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>Traffic、config 與 <a href="/blog/backend/knowledge-cards/control-plane/" data-link-title="Control Plane" data-link-desc="負責下發策略、配置與路由決策的控制層">control plane</a> boundary 的核心責任是把平台切換中的資料面與控制面分開。進入 Kubernetes、ELB、Envoy、Consul 或 Terraform 前，讀者需要先知道流量、設定、secret、service discovery 與管理面各自有不同風險與回退方式。</p>
<h2 id="traffic-boundary">Traffic Boundary</h2>
<p>Traffic boundary 的責任是決定 request 如何進入服務、如何分流、如何回退。它包含 load balancer、routing rule、health check、sticky session、timeout 與 drain。</p>
<p>流量切換要能回答三個問題：哪一批 request 會到新版本、失敗時如何停止擴批、舊版本是否仍能承接回退流量。這三個答案明確後，<a href="/blog/backend/knowledge-cards/canary-release/" data-link-title="Canary Release" data-link-desc="分批把流量導向新版本、用 stop condition 控制 blast radius 的部署策略">canary</a> 才能從比例設定變成可回退策略。</p>
<p>Traffic boundary 的判讀重點是 customer impact 如何被分批限制。小比例 canary、區域切流、tenant 切流與 route rule 都是不同切換單位；切換單位越清楚，<a href="/blog/backend/knowledge-cards/rollback-window/" data-link-title="Rollback Window" data-link-desc="說明變更進入 production 後還能用哪種方式回退或改路線的時間與條件">rollback window</a> 越容易被驗證。</p>
<h3 id="切換單位的選擇">切換單位的選擇</h3>
<p>切換單位決定故障的 <a href="/blog/backend/knowledge-cards/blast-radius/" data-link-title="Blast Radius" data-link-desc="說明事故影響面如何估算與隔離">blast radius</a> 與回退的精準度。常見切換單位各有不同操作特性：</p>
<table>
  <thead>
      <tr>
          <th>切換單位</th>
          <th>blast radius</th>
          <th>回退精準度</th>
          <th>操作複雜度</th>
          <th>適用場景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>比例（%）</td>
          <td>按流量比例</td>
          <td>粗（全域）</td>
          <td>低</td>
          <td>通用 canary</td>
      </tr>
      <tr>
          <td>區域 / AZ</td>
          <td>限定地理範圍</td>
          <td>中</td>
          <td>中</td>
          <td>跨區部署的服務</td>
      </tr>
      <tr>
          <td>租戶 / 組織</td>
          <td>限定特定客戶</td>
          <td>高</td>
          <td>高</td>
          <td>多租戶 SaaS</td>
      </tr>
      <tr>
          <td>路由規則</td>
          <td>限定特定路徑</td>
          <td>高</td>
          <td>高</td>
          <td>API 版本切換、功能漸進上線</td>
      </tr>
  </tbody>
</table>
<p>比例切換最簡單但 blast radius 不可控——5% 的流量中可能包含大客戶的關鍵路徑。租戶切換精準度最高但操作複雜度也最高——需要在 routing 層維護租戶到版本的映射。穩定做法是從比例切換開始，遇到需要精準控制 impact 時再升級到租戶或路由規則切換。</p>
<h2 id="config-boundary">Config Boundary</h2>
<p>設定如何下發、如何生效、如何回退——Config boundary 回答這三個問題。<a href="/blog/backend/knowledge-cards/config-rollout/" data-link-title="Config Rollout" data-link-desc="說明設定如何安全下發到正在運作的服務實例">config rollout</a> 和應用版本不一定同步，因此要保留相容窗口。</p>
<p>高風險設定包含 payment provider endpoint、feature flag、rate limit、routing rule、timeout 與 fallback policy。這些設定變更可能不需要新 image，卻能改變 production 行為，因此要進 release gate。</p>
<h3 id="config-變更的風險分級">Config 變更的風險分級</h3>
<p>設定變更的風險不一致——有些設定改了只影響 log level，有些設定改了直接影響付款路徑。分級後才能對不同風險的設定套用對應的 review 與 rollout 強度。</p>
<table>
  <thead>
      <tr>
          <th>風險等級</th>
          <th>設定類型</th>
          <th>review 與 rollout 要求</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>高</td>
          <td>payment endpoint、auth provider URL、encryption key</td>
          <td>等同 code review + staged rollout + rollback 驗證</td>
      </tr>
      <tr>
          <td>中</td>
          <td>rate limit、timeout、feature flag、CORS 設定</td>
          <td>變更 review + 觀測窗口</td>
      </tr>
      <tr>
          <td>低</td>
          <td>log level、debug flag、非關鍵 UI 文案</td>
          <td>變更紀錄即可</td>
      </tr>
  </tbody>
</table>
<p>風險分級的判讀依據是「這個設定改錯時、使用者會看到什麼」。改錯 payment endpoint 會讓付款打到錯誤目標；改錯 rate limit 可能讓合法流量被擋；改錯 log level 最多是 log 太吵或太安靜。設定的注入方式與版本追蹤見 <a href="/blog/backend/05-deployment-platform/container-runtime/" data-link-title="5.1 container 與 runtime" data-link-desc="整理 image、resource limit 與啟動行為">5.1 配置注入方式與取捨</a>。</p>
<h2 id="secret-boundary">Secret Boundary</h2>
<p>Credential、token、certificate 與 machine identity 需要可輪替、可稽核、可回退——Secret boundary 管理這組生命週期。Secret 變更同時影響平台、應用與外部依賴，應使用比普通 config 更嚴格的 evidence 與 rollback window。</p>
<p>Secret rollout 要回答版本相容、雙軌驗證、舊 secret 撤除時間與失敗回退。這裡要接到 <a href="/blog/backend/07-security-data-protection/credential-rotation-scoped-evidence/" data-link-title="7.27 Credential Rotation with Scoped Evidence 實作示範" data-link-desc="以 webhook/API credential 輪替示範 scope map、證據欄位與回退窗口如何一起設計。">7.27 Credential Rotation with Scoped Evidence</a>。</p>
<h3 id="secret-rollout-的雙軌驗證">Secret Rollout 的雙軌驗證</h3>
<p>Secret 輪替跟應用版本部署有本質差異：rollback secret 不是「換回舊版本」那麼單純——舊 secret 可能已經被撤銷、過期、或在外部系統中標記為失效。Secret rollout 的安全做法是雙軌驗證：</p>
<ol>
<li><strong>新 secret 先加入、舊 secret 暫不移除</strong>：應用先驗證能用新 secret 正常運作。</li>
<li><strong>觀測窗口確認新 secret 穩定</strong>：auth 成功率、API 呼叫成功率、certificate handshake 成功率都在 baseline 內。</li>
<li><strong>確認後移除舊 secret</strong>：舊 secret 的撤除要有明確時間點，而且要在撤除前確認沒有服務還在用舊 secret。</li>
</ol>
<p>這個流程的風險點是第 3 步：撤除舊 secret 後發現某個遺漏的服務或 job 還在用、導致該服務認證失敗。盤點覆蓋率的做法是在觀測窗口內搜尋 audit log，確認所有 secret 使用都已切到新版本。</p>
<h2 id="service-discovery-boundary">Service Discovery Boundary</h2>
<p>Service discovery 的責任是維持可用 endpoint 集合。它回答服務應該連到哪些實例；業務設定與版本正確性則分別交給 config boundary 與 rollout gate。Discovery 的 DNS / registry 運作模式與註冊時序見 <a href="/blog/backend/05-deployment-platform/service-discovery/" data-link-title="5.4 service discovery" data-link-desc="整理 endpoint discovery 與 DNS">5.4 Service Discovery</a>。</p>
<p>Discovery 失準常見於 rollout、擴縮容與區域故障。判讀時要拆成註冊時序、健康判斷、DNS/registry 新鮮度與 fallback 存活時間。</p>
<h2 id="control-plane-boundary">Control Plane Boundary</h2>
<p>設定、策略、部署與路由規則的管理落在 <a href="/blog/backend/knowledge-cards/management-plane/" data-link-title="Management Plane" data-link-desc="說明管理平面如何與業務流量平面分離，避免高權限入口擴散">management plane</a>。Control plane 變更會影響大量服務，因此需要更嚴格的 evidence、gate 與 decision log。</p>
<p>Control plane 事故常見於規則推送、routing 誤配、secret 下發失敗與 registry 異常。這類事故要先保留 decision timeline，避免事後只看到資料面錯誤率。</p>
<h3 id="control-plane-變更的-blast-radius-控制">Control Plane 變更的 Blast Radius 控制</h3>
<p>Control plane 變更的 blast radius 跟 data plane 變更不同——一條 routing rule 推送錯誤可能同時影響所有服務的流量。控制 blast radius 的做法：</p>
<ol>
<li><strong>分批推送</strong>：規則變更先推到 staging / canary namespace、驗證後再推到 production。推送結果的觀測應包含受影響服務的 error rate 與 latency。</li>
<li><strong>approval gate</strong>：高影響變更（network policy、admission webhook、RBAC binding）需要多人 review。變更的 blast radius 估算（影響多少 namespace / service）應在 review 時可見。</li>
<li><strong>decision log</strong>：所有 control plane 變更記入 <a href="/blog/backend/08-incident-response/control-plane-decision-log-write-back/" data-link-title="8.23 Control Plane Decision Log and Write-back 實作示範" data-link-desc="以 rule/config rollout 事故示範 decision log 與 write-back 如何形成可回放閉環。">8.23 Control Plane Decision Log</a>，包含時間、操作者、受影響範圍、預期效果與回退條件。事故時對照 decision log 跟 data plane 症狀的時間序列，可以快速判斷因果。</li>
</ol>
<h2 id="平台元件升級的可重播流程">平台元件升級的可重播流程</h2>
<p>平台基礎元件升級是 control plane 風險最高的場景。Service mesh、ingress controller、CNI、API server 這類元件影響面廣、單次升級可能形成全域風險放大器。</p>
<p>對應 <a href="/blog/backend/05-deployment-platform/cases/airbnb-istio-upgrade-governance/" data-link-title="5.C7 Airbnb：Istio 升級治理" data-link-desc="service mesh 升級在大規模環境下如何保持高可用。">5.C7 Airbnb Istio 升級治理</a>：揭露 1 個判讀（基礎平台元件升級缺乏分批治理會形成全域風險放大器）+ 3 條策略（分批升級 + 回退窗口、升級驗證標準固定化、升級事件接入 incident command 節奏）。以下基於通用工程知識展開、「升級事件進 timeline」是從 case「接入 incident command」策略進一步推到具體操作。</p>
<p>可重複套用的升級流程：</p>
<ol>
<li><strong>分批升級單位</strong>：先在開發 / staging 叢集驗證、再選低流量 production 叢集 / namespace 作為先導、之後分批擴大。分批單位可以是叢集、namespace、region、tenant，依風險面選擇。</li>
<li><strong>回退窗口跟驗證標準同時設</strong>：每批升級前定義「驗證通過」的具體訊號（SLI 維持、特定 metric 不偏移、無新告警），跟「回退窗口」（多久內可以回退）。沒有驗證標準的分批等於連續高風險動作。</li>
<li><strong>升級流程紀錄到 incident-style 文件</strong>：升級期間的決策、觀察、停止點都用 incident decision log 格式紀錄。下次升級可重播、不依賴執行者個人經驗。</li>
<li><strong>升級事件進 timeline</strong>：升級本身產生的短暫錯誤、reconnect、配置同步延遲，要在事故 timeline 上可見、避免被誤判成事故。</li>
</ol>
<p>平台元件升級的核心治理價值是把「一次性高風險作業」變成「可重複的低風險作業」。第一次升級用流程，第二次升級用同樣流程，第三次升級流程已經穩定到可以委派、不再需要資深工程師親自執行。</p>
<h2 id="managed-平台跟團隊職責邊界">Managed 平台跟團隊職責邊界</h2>
<p>平台託管化（self-managed → managed）改變維運責任跟團隊精力的分配。本段聚焦團隊職責邊界；流量跟依賴的分段切換流程見 <a href="/blog/backend/05-deployment-platform/kubernetes-deployment/#%e5%88%86%e9%9a%8e%e6%ae%b5%e5%b9%b3%e5%8f%b0%e9%81%b7%e7%a7%bb" data-link-title="5.2 Kubernetes 部署策略" data-link-desc="整理 deployment、probe 與 rolling update">5.2 分階段平台遷移</a>、紅隊視角的攻擊面變動見 <a href="/blog/backend/05-deployment-platform/attacker-view-platform-entry-risks/#%e5%b9%b3%e5%8f%b0%e9%81%b7%e7%a7%bb%e6%9c%9f%e7%9a%84%e6%94%bb%e6%93%8a%e9%9d%a2%e8%ae%8a%e5%8b%95" data-link-title="5.5 平台與入口威脅建模（Threat Modeling）" data-link-desc="以概念層判讀部署平台弱點，聚焦入口、生命週期、設定與交付節奏">5.5 平台遷移期的攻擊面變動</a>、三者組合才完整。</p>
<p>Platform team 從「維持 Kubernetes 跑起來」轉向「定義 release flow、observability convention、cost governance」。managed 平台採用後第一個治理動作是顯式重新定義職責邊界、讓 platform team 從 cluster ops 轉到 release flow / observability convention / cost governance。重新定義缺位、組織轉型紅利容易被誤判為純技術升級。</p>
<p>對應 <a href="/blog/backend/05-deployment-platform/cases/miro-managed-eks-migration/" data-link-title="5.C5 Miro：Managed EKS 遷移" data-link-desc="從自維運平台轉向 managed EKS 的組織與技術協同案例。">5.C5 Miro Managed EKS 遷移</a>：揭露 1 個判讀（平台託管化的價值在讓團隊把心力從底層維護轉到交付效率與可靠性策略）+ 3 條策略（先定義遷移後的平台責任邊界、自動化流程取代手動平台操作、incident 跟 release policy 接回平台治理）。對應 <a href="/blog/backend/09-performance-capacity/cases/maersk-bosch-azure-aks/" data-link-title="9.C33 Maersk &#43; Bosch：傳統產業在 Azure AKS 上的微服務治理" data-link-desc="全球海運 Maersk 跟 Bosch 智慧建築把 AKS 當微服務治理基礎、釋放工程資源做業務功能">9.C33 Maersk + Bosch Azure AKS</a>：揭露 Maersk 工程訴求引語「focus on things that makes the most business impact」、傳統產業 K8s 動機是治理一致性 + 釋放工程資源到業務功能（後者屬作者判讀）。以下基於通用工程知識展開。</p>
<p>managed 平台採用後的職責邊界重訂可以分四層：</p>
<ol>
<li><strong>Cluster 層</strong>：control plane 上游接管（API server、etcd、scheduler、controller-manager）、platform team 從 cluster ops 退到 cluster policy。CIS benchmark、network policy、admission controller 配置仍是 platform 責任。</li>
<li><strong>Cluster-internal 層</strong>：CNI、ingress controller、service mesh、cluster DNS、storage CSI 通常仍由 platform team own。這層是 managed 服務沒覆蓋的 grey zone、需要明確 ownership。</li>
<li><strong>Application 層</strong>：deployment、service、HPA、PDB 由 service team own、platform 提供 convention 跟 review process。</li>
<li><strong>跨層議題</strong>：cost governance、observability convention、release flow、incident response 是 platform / service / SRE / finance 跨層協作、需要 operating model 明確化。</li>
</ol>
<p>managed 採用後 day-1 治理項目有兩件事：明確界定 grey zone ownership（避免「以為 managed 服務什麼都管了」的心智模型）、把 platform team 心力從 cluster ops 轉到組織轉型紅利（release flow、observability convention、cost governance）。把重新定義職責當 day-2 議題、會錯失組織轉型紅利。</p>
<h2 id="選型前判準">選型前判準</h2>
<p>平台選型前要先回答：</p>
<ol>
<li>哪些變更屬於 traffic，哪些屬於 config，哪些屬於 secret。</li>
<li>每種變更是否能分批、暫停與回退。</li>
<li>Discovery 失準時是否有可控 fallback。</li>
<li>Control plane 變更是否有 audit、owner 與 <a href="/blog/backend/knowledge-cards/blast-radius/" data-link-title="Blast Radius" data-link-desc="說明事故影響面如何估算與隔離">blast radius</a> 限制。</li>
<li>基礎元件升級是否有可重播流程跟回退窗口。</li>
<li>Managed 平台採用後團隊職責邊界是否重新定義。</li>
</ol>
<p>這些答案決定後續要比較 load balancer、service mesh、secret manager、service registry 或 deployment controller 的能力。</p>
<h2 id="實體服務討論承接點">實體服務討論承接點</h2>
<p>實體平台文章要承接本篇的 traffic、config 與 control plane boundary。ELB、nginx、Envoy、service mesh、Consul、Kubernetes controller、secret manager 或 Terraform 的比較，要先分清它們是在資料面接流量、在控制面改規則，還是在設定面下發狀態。</p>
<p>若主問題是流量切換，後續文章要比較 routing rule、weight、health check、drain 與 rollback。若主問題是設定與 secret，後續文章要比較 rollout、audit、rotation 與相容窗口。若主問題是 control plane 風險，後續文章要比較 blast radius、approval、observability 與 incident decision log。</p>
<h2 id="下一步路由">下一步路由</h2>
<p>要把流量邊界接到實際 LB 合約，接著讀 <a href="/blog/backend/05-deployment-platform/load-balancer-contract/" data-link-title="5.3 load balancer 合約" data-link-desc="整理 idle timeout、draining 與 health check">5.3 load balancer 合約</a>。要把 control plane 決策寫入事故流程，接著讀 <a href="/blog/backend/08-incident-response/control-plane-decision-log-write-back/" data-link-title="8.23 Control Plane Decision Log and Write-back 實作示範" data-link-desc="以 rule/config rollout 事故示範 decision log 與 write-back 如何形成可回放閉環。">8.23 Control Plane Decision Log and Write-back</a>。</p>
]]></content:encoded></item><item><title>6.24 規則推送安全閘門</title><link>https://tarrragon.github.io/blog/backend/06-reliability/rule-rollout-safety-gate/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/06-reliability/rule-rollout-safety-gate/</guid><description>&lt;h2 id="概念定位">概念定位&lt;/h2>
&lt;p>規則推送安全閘門（rule rollout safety gate）的核心責任是防止控制面錯誤快速擴散到資料面。這個閘門是補上「規則與配置類變更」特有風險，跟既有 release gate 互補而非取代：變更體積小、覆蓋範圍大、擴散速度快。&lt;/p>
&lt;p>當變更屬於 WAF rule、routing policy、token/policy、或 Addressing API 相關設定時，判讀重點從程式碼正確性轉為擴散控制。這類變更即使 diff 很短，也可能在數十秒內影響跨區域流量與多產品控制面。&lt;/p>
&lt;h2 id="適用場景">適用場景&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>場景&lt;/th>
 &lt;th>典型風險&lt;/th>
 &lt;th>為何需要獨立 gate&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>WAF / regex 規則更新&lt;/td>
 &lt;td>高計算成本規則拖垮 edge runtime&lt;/td>
 &lt;td>CI 綠燈無法代表 runtime 成本安全&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Routing / BYOIP 相關設定變更&lt;/td>
 &lt;td>prefix withdrawal 造成服務不可達&lt;/td>
 &lt;td>單一 API 查詢語意錯誤可全網擴散&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Token / policy 控制面變更&lt;/td>
 &lt;td>多產品授權連鎖失效&lt;/td>
 &lt;td>shared dependency 失效會誤導排障路徑&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>共享控制面批次清理任務&lt;/td>
 &lt;td>批量誤刪或批量撤告&lt;/td>
 &lt;td>需要數量閘門與緊急停機機制&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="產業情境遊戲服務的規則推送安全">產業情境：遊戲服務的規則推送安全&lt;/h2>
&lt;p>遊戲的規則推送（平衡性調整、反作弊規則、賽季設定、經濟系統參數）有特殊的擴散特性：影響面是全體玩家、生效時機即時、且玩家行為會立刻適應規則變更。&lt;/p>
&lt;p>規則推送的 blast radius 預設是全體在線玩家。一次平衡性調整會立刻改變所有正在進行的比賽的角色強度、裝備數值或技能效果。跟一般 feature flag 的 percentage rollout 不同，遊戲平衡性需要所有玩家看到相同規則，否則同場比賽的公平性會被破壞。&lt;/p>
&lt;p>推送時機需要跟 match lifecycle 對齊。在進行中的比賽套用新規則會造成不公平 — 某隊在舊規則下建立的優勢可能在新規則下消失。安全做法是在 match boundary（比賽開始或結束時）切換，讓新規則只套用到新開始的比賽。這要求規則推送系統能區分「已開始的 match」和「即將開始的 match」。&lt;/p>
&lt;p>回退條件需要綁定遊戲特有的 KPI。active player count 下降超過門檻、match completion rate 異常降低（玩家中途離開）、player report rate 上升（玩家回報異常體驗）、in-game economy anomaly（虛擬貨幣或道具流通量異常）都是規則推送出問題的訊號。這些 KPI 的 feedback loop 比一般服務長 — 玩家行為的適應需要數小時到數天才會穩定，短窗觀察可能漏掉延遲暴露的問題。&lt;/p>
&lt;p>反作弊規則的推送有額外約束：規則內容本身是機密的，推送失敗後不能在 log 或 alert 中暴露規則細節，回退也必須在不洩漏偵測邏輯的前提下進行。&lt;/p>
&lt;h2 id="gate-檢查層">Gate 檢查層&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>層級&lt;/th>
 &lt;th>Gate 問題&lt;/th>
 &lt;th>不通過訊號&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Query / API 語意&lt;/td>
 &lt;td>查詢參數有沒有安全預設與錯誤拒絕策略&lt;/td>
 &lt;td>空參數回傳全量、模糊布林語意&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Rule 計算成本&lt;/td>
 &lt;td>規則是否通過代表性 payload 成本檢查&lt;/td>
 &lt;td>單一規則可造成 CPU 熱點&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>推送策略&lt;/td>
 &lt;td>是否採分群 rollout 並設即時回退條件&lt;/td>
 &lt;td>一次推全域、無分區觀測閘門&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Withdrawal 限速&lt;/td>
 &lt;td>批次撤告 / 刪除是否有數量與速率限制&lt;/td>
 &lt;td>單次操作可影響大量 prefixes 或 bindings&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Shared dependency&lt;/td>
 &lt;td>是否識別跨產品共享控制點&lt;/td>
 &lt;td>多產品同時異常卻無 shared root 判讀&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Evidence 與回寫&lt;/td>
 &lt;td>事故後是否可回放決策、查證恢復路徑與狀態差異&lt;/td>
 &lt;td>決策只留結論，缺假設與驗證證據&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="判讀訊號">判讀訊號&lt;/h2>
&lt;ul>
&lt;li>控制面變更後，多區域同時出現 5xx / timeout / auth 失敗&lt;/li>
&lt;li>指標在秒級惡化，且與最新規則或 policy 變更高度同時&lt;/li>
&lt;li>回退後短時間明顯回穩，顯示變更與故障高度關聯&lt;/li>
&lt;li>部分服務可自助恢復、部分服務需人工修復，代表狀態損壞分層&lt;/li>
&lt;li>事故中出現「每個產品都在修自己的症狀」，代表 shared dependency 沒被先識別&lt;/li>
&lt;/ul>
&lt;h2 id="最低可執行-gate">最低可執行 Gate&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>變更分類&lt;/strong>：將規則/配置/控制面 API 變更標為 &lt;code>high-blast-radius change&lt;/code>。&lt;/li>
&lt;li>&lt;strong>語意檢查&lt;/strong>：對 query 參數、空值與預設行為做拒絕式驗證。&lt;/li>
&lt;li>&lt;strong>成本檢查&lt;/strong>：用代表性 payload 跑 rule-level CPU / latency 測試。&lt;/li>
&lt;li>&lt;strong>分批推送&lt;/strong>：至少分成小流量群組與全量兩階段，且每階段有回退條件。&lt;/li>
&lt;li>&lt;strong>撤告保護&lt;/strong>：對 withdrawal / delete 設速率與數量上限，超限自動中止。&lt;/li>
&lt;li>&lt;strong>決策紀錄&lt;/strong>：事故期間保留假設、證據、回退門檻、owner 與狀態差異。&lt;/li>
&lt;/ol>
&lt;h2 id="反模式">反模式&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>反模式&lt;/th>
 &lt;th>風險結果&lt;/th>
 &lt;th>修法&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>把規則推送當一般配置&lt;/td>
 &lt;td>低估擴散速度與影響面&lt;/td>
 &lt;td>強制走高風險變更 gate&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>只看 CI / lint&lt;/td>
 &lt;td>無法捕捉 runtime 計算成本風險&lt;/td>
 &lt;td>補 rule replay 與成本基線&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>全域一次推送&lt;/td>
 &lt;td>擴散太快，回退窗口太短&lt;/td>
 &lt;td>改 staged rollout + 即時回退閘門&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>事故後只寫事後摘要&lt;/td>
 &lt;td>無法復盤決策與恢復路徑&lt;/td>
 &lt;td>補 decision log + evidence package&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>未分離 desired/actual state&lt;/td>
 &lt;td>壞狀態難以回到已知穩定點&lt;/td>
 &lt;td>引入 snapshot 與 staged state restore&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="案例回扣">案例回扣&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/backend/08-incident-response/cases/cloudflare/2019-regex-cpu-outage/" data-link-title="Cloudflare 2019 Regex CPU Outage" data-link-desc="2019-07-02 Cloudflare WAF 規則更新導致全球 CPU 飆升的事故解析：觸發條件、擴散機制、止血決策與可回寫控制面。">Cloudflare 2019 Regex CPU Outage&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/backend/08-incident-response/cases/cloudflare/2023-control-plane-token-incident/" data-link-title="Cloudflare 2023 Control Plane Token Incident" data-link-desc="2023-01-24 Cloudflare service token 錯誤變更導致多產品連鎖影響的事故解析：信任邊界、擴散機制、止血策略與流程回寫。">Cloudflare 2023 Control Plane Token Incident&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/backend/08-incident-response/cases/cloudflare/2026-byoip-bgp-withdrawal/" data-link-title="Cloudflare 2026 BYOIP BGP Withdrawal" data-link-desc="2026-02-20 Cloudflare BYOIP prefixes 被非預期撤告的事故解析：Addressing API bug、BGP withdrawal、狀態恢復與控制面回寫。">Cloudflare 2026 BYOIP BGP Withdrawal&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>這三個案例對應同一個上位問題：控制面小變更如何在短時間擴散成全網事故。不同事故只是擴散路徑不同，gate 核心都是「先限制擴散、再修復功能」。&lt;/p></description><content:encoded><![CDATA[<h2 id="概念定位">概念定位</h2>
<p>規則推送安全閘門（rule rollout safety gate）的核心責任是防止控制面錯誤快速擴散到資料面。這個閘門是補上「規則與配置類變更」特有風險，跟既有 release gate 互補而非取代：變更體積小、覆蓋範圍大、擴散速度快。</p>
<p>當變更屬於 WAF rule、routing policy、token/policy、或 Addressing API 相關設定時，判讀重點從程式碼正確性轉為擴散控制。這類變更即使 diff 很短，也可能在數十秒內影響跨區域流量與多產品控制面。</p>
<h2 id="適用場景">適用場景</h2>
<table>
  <thead>
      <tr>
          <th>場景</th>
          <th>典型風險</th>
          <th>為何需要獨立 gate</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>WAF / regex 規則更新</td>
          <td>高計算成本規則拖垮 edge runtime</td>
          <td>CI 綠燈無法代表 runtime 成本安全</td>
      </tr>
      <tr>
          <td>Routing / BYOIP 相關設定變更</td>
          <td>prefix withdrawal 造成服務不可達</td>
          <td>單一 API 查詢語意錯誤可全網擴散</td>
      </tr>
      <tr>
          <td>Token / policy 控制面變更</td>
          <td>多產品授權連鎖失效</td>
          <td>shared dependency 失效會誤導排障路徑</td>
      </tr>
      <tr>
          <td>共享控制面批次清理任務</td>
          <td>批量誤刪或批量撤告</td>
          <td>需要數量閘門與緊急停機機制</td>
      </tr>
  </tbody>
</table>
<h2 id="產業情境遊戲服務的規則推送安全">產業情境：遊戲服務的規則推送安全</h2>
<p>遊戲的規則推送（平衡性調整、反作弊規則、賽季設定、經濟系統參數）有特殊的擴散特性：影響面是全體玩家、生效時機即時、且玩家行為會立刻適應規則變更。</p>
<p>規則推送的 blast radius 預設是全體在線玩家。一次平衡性調整會立刻改變所有正在進行的比賽的角色強度、裝備數值或技能效果。跟一般 feature flag 的 percentage rollout 不同，遊戲平衡性需要所有玩家看到相同規則，否則同場比賽的公平性會被破壞。</p>
<p>推送時機需要跟 match lifecycle 對齊。在進行中的比賽套用新規則會造成不公平 — 某隊在舊規則下建立的優勢可能在新規則下消失。安全做法是在 match boundary（比賽開始或結束時）切換，讓新規則只套用到新開始的比賽。這要求規則推送系統能區分「已開始的 match」和「即將開始的 match」。</p>
<p>回退條件需要綁定遊戲特有的 KPI。active player count 下降超過門檻、match completion rate 異常降低（玩家中途離開）、player report rate 上升（玩家回報異常體驗）、in-game economy anomaly（虛擬貨幣或道具流通量異常）都是規則推送出問題的訊號。這些 KPI 的 feedback loop 比一般服務長 — 玩家行為的適應需要數小時到數天才會穩定，短窗觀察可能漏掉延遲暴露的問題。</p>
<p>反作弊規則的推送有額外約束：規則內容本身是機密的，推送失敗後不能在 log 或 alert 中暴露規則細節，回退也必須在不洩漏偵測邏輯的前提下進行。</p>
<h2 id="gate-檢查層">Gate 檢查層</h2>
<table>
  <thead>
      <tr>
          <th>層級</th>
          <th>Gate 問題</th>
          <th>不通過訊號</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Query / API 語意</td>
          <td>查詢參數有沒有安全預設與錯誤拒絕策略</td>
          <td>空參數回傳全量、模糊布林語意</td>
      </tr>
      <tr>
          <td>Rule 計算成本</td>
          <td>規則是否通過代表性 payload 成本檢查</td>
          <td>單一規則可造成 CPU 熱點</td>
      </tr>
      <tr>
          <td>推送策略</td>
          <td>是否採分群 rollout 並設即時回退條件</td>
          <td>一次推全域、無分區觀測閘門</td>
      </tr>
      <tr>
          <td>Withdrawal 限速</td>
          <td>批次撤告 / 刪除是否有數量與速率限制</td>
          <td>單次操作可影響大量 prefixes 或 bindings</td>
      </tr>
      <tr>
          <td>Shared dependency</td>
          <td>是否識別跨產品共享控制點</td>
          <td>多產品同時異常卻無 shared root 判讀</td>
      </tr>
      <tr>
          <td>Evidence 與回寫</td>
          <td>事故後是否可回放決策、查證恢復路徑與狀態差異</td>
          <td>決策只留結論，缺假設與驗證證據</td>
      </tr>
  </tbody>
</table>
<h2 id="判讀訊號">判讀訊號</h2>
<ul>
<li>控制面變更後，多區域同時出現 5xx / timeout / auth 失敗</li>
<li>指標在秒級惡化，且與最新規則或 policy 變更高度同時</li>
<li>回退後短時間明顯回穩，顯示變更與故障高度關聯</li>
<li>部分服務可自助恢復、部分服務需人工修復，代表狀態損壞分層</li>
<li>事故中出現「每個產品都在修自己的症狀」，代表 shared dependency 沒被先識別</li>
</ul>
<h2 id="最低可執行-gate">最低可執行 Gate</h2>
<ol>
<li><strong>變更分類</strong>：將規則/配置/控制面 API 變更標為 <code>high-blast-radius change</code>。</li>
<li><strong>語意檢查</strong>：對 query 參數、空值與預設行為做拒絕式驗證。</li>
<li><strong>成本檢查</strong>：用代表性 payload 跑 rule-level CPU / latency 測試。</li>
<li><strong>分批推送</strong>：至少分成小流量群組與全量兩階段，且每階段有回退條件。</li>
<li><strong>撤告保護</strong>：對 withdrawal / delete 設速率與數量上限，超限自動中止。</li>
<li><strong>決策紀錄</strong>：事故期間保留假設、證據、回退門檻、owner 與狀態差異。</li>
</ol>
<h2 id="反模式">反模式</h2>
<table>
  <thead>
      <tr>
          <th>反模式</th>
          <th>風險結果</th>
          <th>修法</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>把規則推送當一般配置</td>
          <td>低估擴散速度與影響面</td>
          <td>強制走高風險變更 gate</td>
      </tr>
      <tr>
          <td>只看 CI / lint</td>
          <td>無法捕捉 runtime 計算成本風險</td>
          <td>補 rule replay 與成本基線</td>
      </tr>
      <tr>
          <td>全域一次推送</td>
          <td>擴散太快，回退窗口太短</td>
          <td>改 staged rollout + 即時回退閘門</td>
      </tr>
      <tr>
          <td>事故後只寫事後摘要</td>
          <td>無法復盤決策與恢復路徑</td>
          <td>補 decision log + evidence package</td>
      </tr>
      <tr>
          <td>未分離 desired/actual state</td>
          <td>壞狀態難以回到已知穩定點</td>
          <td>引入 snapshot 與 staged state restore</td>
      </tr>
  </tbody>
</table>
<h2 id="案例回扣">案例回扣</h2>
<ul>
<li><a href="/blog/backend/08-incident-response/cases/cloudflare/2019-regex-cpu-outage/" data-link-title="Cloudflare 2019 Regex CPU Outage" data-link-desc="2019-07-02 Cloudflare WAF 規則更新導致全球 CPU 飆升的事故解析：觸發條件、擴散機制、止血決策與可回寫控制面。">Cloudflare 2019 Regex CPU Outage</a></li>
<li><a href="/blog/backend/08-incident-response/cases/cloudflare/2023-control-plane-token-incident/" data-link-title="Cloudflare 2023 Control Plane Token Incident" data-link-desc="2023-01-24 Cloudflare service token 錯誤變更導致多產品連鎖影響的事故解析：信任邊界、擴散機制、止血策略與流程回寫。">Cloudflare 2023 Control Plane Token Incident</a></li>
<li><a href="/blog/backend/08-incident-response/cases/cloudflare/2026-byoip-bgp-withdrawal/" data-link-title="Cloudflare 2026 BYOIP BGP Withdrawal" data-link-desc="2026-02-20 Cloudflare BYOIP prefixes 被非預期撤告的事故解析：Addressing API bug、BGP withdrawal、狀態恢復與控制面回寫。">Cloudflare 2026 BYOIP BGP Withdrawal</a></li>
</ul>
<p>這三個案例對應同一個上位問題：控制面小變更如何在短時間擴散成全網事故。不同事故只是擴散路徑不同，gate 核心都是「先限制擴散、再修復功能」。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li><code>04</code>： <a href="/blog/backend/04-observability/telemetry-data-quality/" data-link-title="4.17 Telemetry Data Quality" data-link-desc="把 missing signal、schema drift、sampling bias 與 timestamp skew 變成資料品質問題">4.17 Telemetry Data Quality</a></li>
<li><code>06</code>： <a href="/blog/backend/06-reliability/release-gate/" data-link-title="6.8 Release Gate 與變更節奏" data-link-desc="把驗證、migration、相容性納入放行判準">6.8 Release Gate</a></li>
<li><code>06</code>： <a href="/blog/backend/06-reliability/experiment-safety-boundary/" data-link-title="6.20 Experiment Safety Boundary" data-link-desc="定義 chaos、load test、DR drill 的 [blast radius](/backend/knowledge-cards/blast-radius/)、停止條件與權限約束">6.20 Experiment Safety Boundary</a></li>
<li><code>06</code>： <a href="/blog/backend/06-reliability/verification-evidence-handoff/" data-link-title="6.23 Verification Evidence Handoff" data-link-desc="把 SLO、load、chaos、DR 與 readiness 結果包成 release / incident 可用證據">6.23 Verification Evidence Handoff</a></li>
<li><code>08</code>： <a href="/blog/backend/08-incident-response/incident-decision-log/" data-link-title="8.19 Incident Decision Log" data-link-desc="把事中假設、決策、證據、回退條件與責任人留下可復盤紀錄">8.19 Incident Decision Log</a></li>
<li><code>08</code>： <a href="/blog/backend/08-incident-response/incident-evidence-write-back/" data-link-title="8.22 Incident Evidence Write-back" data-link-desc="把事故證據、決策與復盤結論回寫到 observability、reliability 與 runbook">8.22 Incident Evidence Write-back</a></li>
</ul>
]]></content:encoded></item><item><title>Static Stability</title><link>https://tarrragon.github.io/blog/backend/knowledge-cards/static-stability/</link><pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/knowledge-cards/static-stability/</guid><description>&lt;p>Static stability 的核心概念是「資料面在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/control-plane/" data-link-title="Control Plane" data-link-desc="負責下發策略、配置與路由決策的控制層">control plane&lt;/a> 失效時仍能維持服務」。設計約束是資料面必須快取控制面最後已知的好配置，並在控制面不可用時用快取繼續運作，不依賴控制面即時回應。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Static stability 位在 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/control-plane/" data-link-title="Control Plane" data-link-desc="負責下發策略、配置與路由決策的控制層">control plane&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/blast-radius/" data-link-title="Blast Radius" data-link-desc="說明事故影響面如何估算與隔離">blast radius&lt;/a> 之間。它把控制面失效的影響限制在「新配置無法推送」，而非「現有服務中斷」。跟 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/steady-state/" data-link-title="Steady State" data-link-desc="說明可靠性實驗與事故恢復如何定義系統應維持的可接受狀態">steady state&lt;/a> 的關係是：static stability 定義了控制面失效期間的 degraded steady state — 服務能力受限但仍在可接受範圍。&lt;/p>
&lt;h2 id="核心機制">核心機制&lt;/h2>
&lt;p>Static stability 依賴三個機制：快取最後已知好配置（控制面失效時不嘗試重新取得）、預計算 fallback 路徑（控制面在線時就 build 好備用配置）、constant work pattern（失敗模式下的工作量跟正常時相同，避免 retry storm 放大負載）。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>需要 static stability 設計的訊號是控制面重啟或網路隔離時，資料面同時不可用。典型例子是 service mesh 的 control plane 掛掉後 sidecar 無法取得路由表、導致所有服務間通訊中斷；static stability 設計讓 sidecar 用快取的路由表繼續服務。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Static stability 的責任是讓 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/rto/" data-link-title="RTO" data-link-desc="說明恢復時間目標如何約束事故回復策略">DR&lt;/a> 設計不依賴已故障的控制面。它跟 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/readiness/" data-link-title="Readiness" data-link-desc="說明 instance 何時可以安全接收流量，以及 readiness 如何和部署平台協作">readiness&lt;/a> 的關係是：static stability 是 readiness review 的前置項 — 若資料面沒有控制面失效時的自主能力，readiness 就有結構性缺口。&lt;/p></description><content:encoded><![CDATA[<p>Static stability 的核心概念是「資料面在 <a href="/blog/backend/knowledge-cards/control-plane/" data-link-title="Control Plane" data-link-desc="負責下發策略、配置與路由決策的控制層">control plane</a> 失效時仍能維持服務」。設計約束是資料面必須快取控制面最後已知的好配置，並在控制面不可用時用快取繼續運作，不依賴控制面即時回應。</p>
<h2 id="概念位置">概念位置</h2>
<p>Static stability 位在 <a href="/blog/backend/knowledge-cards/control-plane/" data-link-title="Control Plane" data-link-desc="負責下發策略、配置與路由決策的控制層">control plane</a> 與 <a href="/blog/backend/knowledge-cards/blast-radius/" data-link-title="Blast Radius" data-link-desc="說明事故影響面如何估算與隔離">blast radius</a> 之間。它把控制面失效的影響限制在「新配置無法推送」，而非「現有服務中斷」。跟 <a href="/blog/backend/knowledge-cards/steady-state/" data-link-title="Steady State" data-link-desc="說明可靠性實驗與事故恢復如何定義系統應維持的可接受狀態">steady state</a> 的關係是：static stability 定義了控制面失效期間的 degraded steady state — 服務能力受限但仍在可接受範圍。</p>
<h2 id="核心機制">核心機制</h2>
<p>Static stability 依賴三個機制：快取最後已知好配置（控制面失效時不嘗試重新取得）、預計算 fallback 路徑（控制面在線時就 build 好備用配置）、constant work pattern（失敗模式下的工作量跟正常時相同，避免 retry storm 放大負載）。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>需要 static stability 設計的訊號是控制面重啟或網路隔離時，資料面同時不可用。典型例子是 service mesh 的 control plane 掛掉後 sidecar 無法取得路由表、導致所有服務間通訊中斷；static stability 設計讓 sidecar 用快取的路由表繼續服務。</p>
<h2 id="設計責任">設計責任</h2>
<p>Static stability 的責任是讓 <a href="/blog/backend/knowledge-cards/rto/" data-link-title="RTO" data-link-desc="說明恢復時間目標如何約束事故回復策略">DR</a> 設計不依賴已故障的控制面。它跟 <a href="/blog/backend/knowledge-cards/readiness/" data-link-title="Readiness" data-link-desc="說明 instance 何時可以安全接收流量，以及 readiness 如何和部署平台協作">readiness</a> 的關係是：static stability 是 readiness review 的前置項 — 若資料面沒有控制面失效時的自主能力，readiness 就有結構性缺口。</p>
]]></content:encoded></item></channel></rss>