<?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>Data-Pipeline on Tarragon</title><link>https://tarrragon.github.io/blog/tags/data-pipeline/</link><description>Recent content in Data-Pipeline on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Thu, 21 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/data-pipeline/index.xml" rel="self" type="application/rss+xml"/><item><title>Data pipeline backfill、checkpoint 與 rerun 流程</title><link>https://tarrragon.github.io/blog/ci/data-pipeline-deploy/backfill-checkpoint-rerun-flow/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/data-pipeline-deploy/backfill-checkpoint-rerun-flow/</guid><description>&lt;p>Data pipeline 發布流程的核心責任是讓資料處理邏輯變更可驗證、可重跑、可修補。資料任務部署成功不等於資料正確；CI/CD 要同時檢查輸入 schema、輸出契約、&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint&lt;/a> 與異常資料修復路徑。&lt;/p>
&lt;h2 id="流程定位">流程定位&lt;/h2>
&lt;p>Data pipeline 的風險集中在資料副作用。API 發布錯誤通常會表現成 request failure；資料任務錯誤可能把錯誤結果寫進 warehouse、feature store、報表或下游模型，並在很久之後才被看見。發布流程要把 correctness check 放到 deploy 前後。&lt;/p>
&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>Build&lt;/td>
 &lt;td>產生 transform code、DAG、query&lt;/td>
 &lt;td>版本是否可重現&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Validation&lt;/td>
 &lt;td>驗證 input / output schema&lt;/td>
 &lt;td>新舊欄位、型別、nullability 是否相容&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Deploy&lt;/td>
 &lt;td>推進 job、DAG、schedule、trigger&lt;/td>
 &lt;td>新版本是否正確接管&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill&lt;/a>&lt;/td>
 &lt;td>受控補算歷史資料&lt;/td>
 &lt;td>範圍、節流、checkpoint 是否明確&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/rerun/" data-link-title="Rerun" data-link-desc="說明 CI/CD 與 data pipeline 中重跑任務前需要判斷的輸出語意與副作用">Rerun&lt;/a>&lt;/td>
 &lt;td>修復失敗區間或錯誤輸出&lt;/td>
 &lt;td>idempotency、覆寫規則、對帳是否存在&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Recovery&lt;/td>
 &lt;td>rollback、forward fix、資料修補&lt;/td>
 &lt;td>下游是否已消費錯誤資料&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Build 階段負責固定執行邏輯。dbt model、Spark job、Flink processor、Airflow DAG 或 SQL transform 都需要能追到 commit 與 dependency，讓歷史資料重跑時能確認使用哪一版邏輯。&lt;/p>
&lt;p>Validation 階段負責檢查資料契約。Schema check、sample run、contract test、row count、null ratio、distinct count 與 business invariant 都可以作為 gate；重點是讓輸出變更在下游消費前被看見。&lt;/p>
&lt;p>Deploy 階段負責切換任務版本。Scheduler、trigger、checkpoint location 與 credential 都會影響新版本是否真正接管；部署後要確認下一次 run 用的是新版本，並保留舊版本停止或恢復路徑。&lt;/p>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill&lt;/a> 階段負責補算歷史資料。Backfill 應有時間範圍、節流、checkpoint、停損條件與對帳策略，避免一次掃完整個歷史區間壓垮上游或把錯誤大規模寫入下游。&lt;/p>
&lt;p>&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/rerun/" data-link-title="Rerun" data-link-desc="說明 CI/CD 與 data pipeline 中重跑任務前需要判斷的輸出語意與副作用">Rerun&lt;/a> 階段負責修復失敗 run 或錯誤區間。Rerun 要定義輸出覆寫、去重、idempotency 與下游通知；同一段資料被跑兩次時，結果應可預期。&lt;/p>
&lt;p>Recovery 階段負責處理錯誤資料已被消費的情況。資料 pipeline 的 rollback 常常採用 forward fix、重新計算、標記污染區間與通知下游重新讀取。&lt;/p>
&lt;h2 id="backfill-控制面">Backfill 控制面&lt;/h2>
&lt;p>Backfill 控制面的責任是限制歷史補算的影響範圍。歷史資料量通常遠大於日常增量；沒有控制面的 backfill 會同時衝擊計算成本、上游讀取、下游寫入與資料正確性。&lt;/p>
&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>Range&lt;/td>
 &lt;td>補算哪個時間或 partition 區間&lt;/td>
 &lt;td>先小範圍驗證，再擴大區間&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Throttle&lt;/td>
 &lt;td>每批處理多少資料&lt;/td>
 &lt;td>限制 concurrency、batch size&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint&lt;/a>&lt;/td>
 &lt;td>失敗後從哪裡接續&lt;/td>
 &lt;td>記錄 partition、offset、run id&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Stop loss&lt;/td>
 &lt;td>哪些訊號要暫停&lt;/td>
 &lt;td>error rate、成本、row count 異常&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Reconcile&lt;/td>
 &lt;td>補算結果如何確認&lt;/td>
 &lt;td>新舊輸出比對、抽樣、business check&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>這些控制項要寫進 workflow 或 runbook。若 backfill 只能靠工程師現場下 SQL，事故時很難保證每次操作都有相同邏輯。&lt;/p>
&lt;h2 id="rerun-判讀">Rerun 判讀&lt;/h2>
&lt;p>Rerun 判讀的責任是確認重跑是否會造成二次傷害。資料任務失敗後，最危險的動作是未確認輸出語意就直接重跑。&lt;/p>
&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>確認輸入仍可取得&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>部分 partition 已寫入&lt;/td>
 &lt;td>需要去重或覆寫策略&lt;/td>
 &lt;td>檢查 output mode&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>下游已消費錯誤輸出&lt;/td>
 &lt;td>需要通知下游或重算衍生資料&lt;/td>
 &lt;td>標記污染區間&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>input schema 已改&lt;/td>
 &lt;td>舊版本重跑條件可能失效&lt;/td>
 &lt;td>用相容版本或轉換層&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>streaming checkpoint 壞&lt;/td>
 &lt;td>重跑可能重複消費或漏資料&lt;/td>
 &lt;td>評估 checkpoint repair / replay&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>這張表讓 rerun 從「再跑一次」變成有條件的恢復策略。資料正確性比任務綠燈更重要；綠燈只代表 job 完成，不代表輸出可信。&lt;/p></description><content:encoded><![CDATA[<p>Data pipeline 發布流程的核心責任是讓資料處理邏輯變更可驗證、可重跑、可修補。資料任務部署成功不等於資料正確；CI/CD 要同時檢查輸入 schema、輸出契約、<a href="/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill</a>、<a href="/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint</a> 與異常資料修復路徑。</p>
<h2 id="流程定位">流程定位</h2>
<p>Data pipeline 的風險集中在資料副作用。API 發布錯誤通常會表現成 request failure；資料任務錯誤可能把錯誤結果寫進 warehouse、feature store、報表或下游模型，並在很久之後才被看見。發布流程要把 correctness check 放到 deploy 前後。</p>
<table>
  <thead>
      <tr>
          <th>階段</th>
          <th>責任</th>
          <th>判讀訊號</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Build</td>
          <td>產生 transform code、DAG、query</td>
          <td>版本是否可重現</td>
      </tr>
      <tr>
          <td>Validation</td>
          <td>驗證 input / output schema</td>
          <td>新舊欄位、型別、nullability 是否相容</td>
      </tr>
      <tr>
          <td>Deploy</td>
          <td>推進 job、DAG、schedule、trigger</td>
          <td>新版本是否正確接管</td>
      </tr>
      <tr>
          <td><a href="/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill</a></td>
          <td>受控補算歷史資料</td>
          <td>範圍、節流、checkpoint 是否明確</td>
      </tr>
      <tr>
          <td><a href="/blog/ci/knowledge-cards/rerun/" data-link-title="Rerun" data-link-desc="說明 CI/CD 與 data pipeline 中重跑任務前需要判斷的輸出語意與副作用">Rerun</a></td>
          <td>修復失敗區間或錯誤輸出</td>
          <td>idempotency、覆寫規則、對帳是否存在</td>
      </tr>
      <tr>
          <td>Recovery</td>
          <td>rollback、forward fix、資料修補</td>
          <td>下游是否已消費錯誤資料</td>
      </tr>
  </tbody>
</table>
<p>Build 階段負責固定執行邏輯。dbt model、Spark job、Flink processor、Airflow DAG 或 SQL transform 都需要能追到 commit 與 dependency，讓歷史資料重跑時能確認使用哪一版邏輯。</p>
<p>Validation 階段負責檢查資料契約。Schema check、sample run、contract test、row count、null ratio、distinct count 與 business invariant 都可以作為 gate；重點是讓輸出變更在下游消費前被看見。</p>
<p>Deploy 階段負責切換任務版本。Scheduler、trigger、checkpoint location 與 credential 都會影響新版本是否真正接管；部署後要確認下一次 run 用的是新版本，並保留舊版本停止或恢復路徑。</p>
<p><a href="/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill</a> 階段負責補算歷史資料。Backfill 應有時間範圍、節流、checkpoint、停損條件與對帳策略，避免一次掃完整個歷史區間壓垮上游或把錯誤大規模寫入下游。</p>
<p><a href="/blog/ci/knowledge-cards/rerun/" data-link-title="Rerun" data-link-desc="說明 CI/CD 與 data pipeline 中重跑任務前需要判斷的輸出語意與副作用">Rerun</a> 階段負責修復失敗 run 或錯誤區間。Rerun 要定義輸出覆寫、去重、idempotency 與下游通知；同一段資料被跑兩次時，結果應可預期。</p>
<p>Recovery 階段負責處理錯誤資料已被消費的情況。資料 pipeline 的 rollback 常常採用 forward fix、重新計算、標記污染區間與通知下游重新讀取。</p>
<h2 id="backfill-控制面">Backfill 控制面</h2>
<p>Backfill 控制面的責任是限制歷史補算的影響範圍。歷史資料量通常遠大於日常增量；沒有控制面的 backfill 會同時衝擊計算成本、上游讀取、下游寫入與資料正確性。</p>
<table>
  <thead>
      <tr>
          <th>控制項</th>
          <th>判讀問題</th>
          <th>常見做法</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Range</td>
          <td>補算哪個時間或 partition 區間</td>
          <td>先小範圍驗證，再擴大區間</td>
      </tr>
      <tr>
          <td>Throttle</td>
          <td>每批處理多少資料</td>
          <td>限制 concurrency、batch size</td>
      </tr>
      <tr>
          <td><a href="/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint</a></td>
          <td>失敗後從哪裡接續</td>
          <td>記錄 partition、offset、run id</td>
      </tr>
      <tr>
          <td>Stop loss</td>
          <td>哪些訊號要暫停</td>
          <td>error rate、成本、row count 異常</td>
      </tr>
      <tr>
          <td>Reconcile</td>
          <td>補算結果如何確認</td>
          <td>新舊輸出比對、抽樣、business check</td>
      </tr>
  </tbody>
</table>
<p>這些控制項要寫進 workflow 或 runbook。若 backfill 只能靠工程師現場下 SQL，事故時很難保證每次操作都有相同邏輯。</p>
<h2 id="rerun-判讀">Rerun 判讀</h2>
<p>Rerun 判讀的責任是確認重跑是否會造成二次傷害。資料任務失敗後，最危險的動作是未確認輸出語意就直接重跑。</p>
<table>
  <thead>
      <tr>
          <th>訊號</th>
          <th>判讀</th>
          <th>下一步</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>任務失敗但沒有輸出</td>
          <td>可用同版本重跑</td>
          <td>確認輸入仍可取得</td>
      </tr>
      <tr>
          <td>部分 partition 已寫入</td>
          <td>需要去重或覆寫策略</td>
          <td>檢查 output mode</td>
      </tr>
      <tr>
          <td>下游已消費錯誤輸出</td>
          <td>需要通知下游或重算衍生資料</td>
          <td>標記污染區間</td>
      </tr>
      <tr>
          <td>input schema 已改</td>
          <td>舊版本重跑條件可能失效</td>
          <td>用相容版本或轉換層</td>
      </tr>
      <tr>
          <td>streaming checkpoint 壞</td>
          <td>重跑可能重複消費或漏資料</td>
          <td>評估 checkpoint repair / replay</td>
      </tr>
  </tbody>
</table>
<p>這張表讓 rerun 從「再跑一次」變成有條件的恢復策略。資料正確性比任務綠燈更重要；綠燈只代表 job 完成，不代表輸出可信。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>Data pipeline 部署總覽：回 <a href="../">Data Pipeline 部署 CI/CD</a>。</li>
<li>Migration 概念：讀 <a href="/blog/ci/knowledge-cards/migration/" data-link-title="Migration" data-link-desc="說明資料或結構變更如何在服務不中斷前提下受控推進">Migration</a>。</li>
<li>Gate 原理：讀 <a href="../../ci-gate-workflow-boundary/">CI gate 與 workflow 邊界</a>。</li>
</ul>
]]></content:encoded></item><item><title>Data Pipeline 部署 CI/CD</title><link>https://tarrragon.github.io/blog/ci/data-pipeline-deploy/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/data-pipeline-deploy/</guid><description>&lt;p>Data Pipeline 部署 CI/CD 的核心責任是把資料處理邏輯推進到生產環境，同時維持資料正確性與可回復性。它和 API 部署不同，重點在 schema 相容、&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/rerun/" data-link-title="Rerun" data-link-desc="說明 CI/CD 與 data pipeline 中重跑任務前需要判斷的輸出語意與副作用">Rerun&lt;/a> 風險。&lt;/p>
&lt;h2 id="場域定位">場域定位&lt;/h2>
&lt;p>Data pipeline 常包含 batch job、stream processor、dbt model 或 workflow scheduler。部署判斷不只看程式可執行，還要看資料是否可追溯、可對帳、可修復。&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>面向&lt;/th>
 &lt;th>Data pipeline 部署常見責任&lt;/th>
 &lt;th>判讀訊號&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Build&lt;/td>
 &lt;td>transform code、DAG、query model&lt;/td>
 &lt;td>版本是否可重現&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Validation&lt;/td>
 &lt;td>schema check、sample run、contract check&lt;/td>
 &lt;td>輸出是否維持相容&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Deploy&lt;/td>
 &lt;td>job version、schedule、trigger&lt;/td>
 &lt;td>新流程是否正確接管&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill&lt;/a>&lt;/td>
 &lt;td>歷史資料補算與節流&lt;/td>
 &lt;td>是否有 checkpoint 與停損條件&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Recovery&lt;/td>
 &lt;td>rerun、rollback、forward fix&lt;/td>
 &lt;td>異常資料是否可修補&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="常見注意事項">常見注意事項&lt;/h2>
&lt;ul>
&lt;li>schema 變更要先定義相容窗口，再切換 downstream。&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill&lt;/a> 要有節流與 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint&lt;/a>，避免壓垮上游與儲存層。&lt;/li>
&lt;li>部署後需比對新舊輸出一致性，建立 correctness check。&lt;/li>
&lt;li>重跑流程要有 runbook，避免人工臨場判斷失誤。&lt;/li>
&lt;/ul>
&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;a href="backfill-checkpoint-rerun-flow/">Data pipeline backfill、checkpoint 與 rerun 流程&lt;/a>&lt;/td>
 &lt;td>Backfill, checkpoint and rerun&lt;/td>
 &lt;td>控制歷史補算、重跑與資料修復&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;ul>
&lt;li>Data pipeline 發布主流程：讀 &lt;a href="backfill-checkpoint-rerun-flow/">Data pipeline backfill、checkpoint 與 rerun 流程&lt;/a>。&lt;/li>
&lt;li>後端資料遷移概念：讀 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/migration/" data-link-title="Migration" data-link-desc="說明系統如何把資料、流量或結構從舊狀態移到新狀態">Migration&lt;/a>。&lt;/li>
&lt;li>資料修補與比對：讀 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明如何為既有資料補上新欄位、新索引或新衍生狀態">Backfill&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/correctness-check/" data-link-title="Correctness Check" data-link-desc="說明遷移或重構期間如何驗證新舊結果是否符合規則">Correctness Check&lt;/a>。&lt;/li>
&lt;li>Gate 原理：讀 &lt;a href="../ci-gate-workflow-boundary/">CI gate 與 workflow 邊界&lt;/a>。&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>Data Pipeline 部署 CI/CD 的核心責任是把資料處理邏輯推進到生產環境，同時維持資料正確性與可回復性。它和 API 部署不同，重點在 schema 相容、<a href="/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill</a>、<a href="/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint</a> 與 <a href="/blog/ci/knowledge-cards/rerun/" data-link-title="Rerun" data-link-desc="說明 CI/CD 與 data pipeline 中重跑任務前需要判斷的輸出語意與副作用">Rerun</a> 風險。</p>
<h2 id="場域定位">場域定位</h2>
<p>Data pipeline 常包含 batch job、stream processor、dbt model 或 workflow scheduler。部署判斷不只看程式可執行，還要看資料是否可追溯、可對帳、可修復。</p>
<table>
  <thead>
      <tr>
          <th>面向</th>
          <th>Data pipeline 部署常見責任</th>
          <th>判讀訊號</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Build</td>
          <td>transform code、DAG、query model</td>
          <td>版本是否可重現</td>
      </tr>
      <tr>
          <td>Validation</td>
          <td>schema check、sample run、contract check</td>
          <td>輸出是否維持相容</td>
      </tr>
      <tr>
          <td>Deploy</td>
          <td>job version、schedule、trigger</td>
          <td>新流程是否正確接管</td>
      </tr>
      <tr>
          <td><a href="/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill</a></td>
          <td>歷史資料補算與節流</td>
          <td>是否有 checkpoint 與停損條件</td>
      </tr>
      <tr>
          <td>Recovery</td>
          <td>rerun、rollback、forward fix</td>
          <td>異常資料是否可修補</td>
      </tr>
  </tbody>
</table>
<h2 id="常見注意事項">常見注意事項</h2>
<ul>
<li>schema 變更要先定義相容窗口，再切換 downstream。</li>
<li><a href="/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill</a> 要有節流與 <a href="/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint</a>，避免壓垮上游與儲存層。</li>
<li>部署後需比對新舊輸出一致性，建立 correctness check。</li>
<li>重跑流程要有 runbook，避免人工臨場判斷失誤。</li>
</ul>
<h2 id="學習路線">學習路線</h2>
<table>
  <thead>
      <tr>
          <th>章節</th>
          <th>主題</th>
          <th>核心責任</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="backfill-checkpoint-rerun-flow/">Data pipeline backfill、checkpoint 與 rerun 流程</a></td>
          <td>Backfill, checkpoint and rerun</td>
          <td>控制歷史補算、重跑與資料修復</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>Data pipeline 發布主流程：讀 <a href="backfill-checkpoint-rerun-flow/">Data pipeline backfill、checkpoint 與 rerun 流程</a>。</li>
<li>後端資料遷移概念：讀 <a href="/blog/backend/knowledge-cards/migration/" data-link-title="Migration" data-link-desc="說明系統如何把資料、流量或結構從舊狀態移到新狀態">Migration</a>。</li>
<li>資料修補與比對：讀 <a href="/blog/backend/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明如何為既有資料補上新欄位、新索引或新衍生狀態">Backfill</a> 與 <a href="/blog/backend/knowledge-cards/correctness-check/" data-link-title="Correctness Check" data-link-desc="說明遷移或重構期間如何驗證新舊結果是否符合規則">Correctness Check</a>。</li>
<li>Gate 原理：讀 <a href="../ci-gate-workflow-boundary/">CI gate 與 workflow 邊界</a>。</li>
</ul>
]]></content:encoded></item><item><title>Backfill</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/backfill/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/backfill/</guid><description>&lt;p>Backfill 的核心概念是「用新邏輯受控補算既有資料」。它通常和 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/migration/" data-link-title="Migration" data-link-desc="說明資料或結構變更如何在服務不中斷前提下受控推進">Migration&lt;/a> 共享相容窗口，並依賴 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint&lt;/a> 保存進度。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Backfill 位在資料 schema、transform logic 或歷史資料修補之後，常出現在 data pipeline、database migration、search index rebuild 與 feature store 更新。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>新欄位需要從既有資料補值。&lt;/li>
&lt;li>歷史 partition 需要用新版邏輯重新計算。&lt;/li>
&lt;li>補算任務需要節流、停損與對帳。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>訂單報表新增 &lt;code>net_revenue&lt;/code> 欄位時，pipeline 先讓新資料寫入新欄位，再分批 backfill 過去 12 個月的 partition，並用 row count 與金額總和比對結果。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Backfill 要定義補算範圍、批次大小、checkpoint、停損條件與對帳方式，讓歷史資料修補成為可停止、可接續、可驗證的流程。&lt;/p></description><content:encoded><![CDATA[<p>Backfill 的核心概念是「用新邏輯受控補算既有資料」。它通常和 <a href="/blog/ci/knowledge-cards/migration/" data-link-title="Migration" data-link-desc="說明資料或結構變更如何在服務不中斷前提下受控推進">Migration</a> 共享相容窗口，並依賴 <a href="/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint</a> 保存進度。</p>
<h2 id="概念位置">概念位置</h2>
<p>Backfill 位在資料 schema、transform logic 或歷史資料修補之後，常出現在 data pipeline、database migration、search index rebuild 與 feature store 更新。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>新欄位需要從既有資料補值。</li>
<li>歷史 partition 需要用新版邏輯重新計算。</li>
<li>補算任務需要節流、停損與對帳。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>訂單報表新增 <code>net_revenue</code> 欄位時，pipeline 先讓新資料寫入新欄位，再分批 backfill 過去 12 個月的 partition，並用 row count 與金額總和比對結果。</p>
<h2 id="設計責任">設計責任</h2>
<p>Backfill 要定義補算範圍、批次大小、checkpoint、停損條件與對帳方式，讓歷史資料修補成為可停止、可接續、可驗證的流程。</p>
]]></content:encoded></item><item><title>Checkpoint</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/checkpoint/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/checkpoint/</guid><description>&lt;p>Checkpoint 的核心概念是「保存可接續的處理進度」。它讓 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill&lt;/a> 與 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/rerun/" data-link-title="Rerun" data-link-desc="說明 CI/CD 與 data pipeline 中重跑任務前需要判斷的輸出語意與副作用">Rerun&lt;/a> 可以從明確位置恢復，避免每次都從頭開始。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Checkpoint 位在長時間 job、stream processor、batch pipeline 與 migration 任務之間，常以 partition、offset、run id、cursor 或 processed marker 呈現。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>任務執行時間長，失敗後需要接續。&lt;/li>
&lt;li>重跑同一區間可能造成重複寫入。&lt;/li>
&lt;li>streaming consumer 需要保存 offset 或 event position。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>資料回填每次處理一個日期 partition，完成後寫入 &lt;code>backfill_runs&lt;/code> 表。任務中斷時，下一次從最後成功 partition 的下一段開始。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Checkpoint 要定義進度格式、提交時機、失敗恢復、重跑覆寫與觀測欄位，讓長時間任務具備可恢復性。&lt;/p></description><content:encoded><![CDATA[<p>Checkpoint 的核心概念是「保存可接續的處理進度」。它讓 <a href="/blog/ci/knowledge-cards/backfill/" data-link-title="Backfill" data-link-desc="說明資料處理與 migration 中如何受控補算歷史資料">Backfill</a> 與 <a href="/blog/ci/knowledge-cards/rerun/" data-link-title="Rerun" data-link-desc="說明 CI/CD 與 data pipeline 中重跑任務前需要判斷的輸出語意與副作用">Rerun</a> 可以從明確位置恢復，避免每次都從頭開始。</p>
<h2 id="概念位置">概念位置</h2>
<p>Checkpoint 位在長時間 job、stream processor、batch pipeline 與 migration 任務之間，常以 partition、offset、run id、cursor 或 processed marker 呈現。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>任務執行時間長，失敗後需要接續。</li>
<li>重跑同一區間可能造成重複寫入。</li>
<li>streaming consumer 需要保存 offset 或 event position。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>資料回填每次處理一個日期 partition，完成後寫入 <code>backfill_runs</code> 表。任務中斷時，下一次從最後成功 partition 的下一段開始。</p>
<h2 id="設計責任">設計責任</h2>
<p>Checkpoint 要定義進度格式、提交時機、失敗恢復、重跑覆寫與觀測欄位，讓長時間任務具備可恢復性。</p>
]]></content:encoded></item><item><title>Rerun</title><link>https://tarrragon.github.io/blog/ci/knowledge-cards/rerun/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/ci/knowledge-cards/rerun/</guid><description>&lt;p>Rerun 的核心概念是「用明確條件重新執行同一段流程」。它和 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/flaky-test/" data-link-title="Flaky Test" data-link-desc="說明非決定性測試如何降低 CI gate 信任度與治理方式">Flaky Test&lt;/a> 的治理有關，也常依賴 &lt;a href="https://tarrragon.github.io/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint&lt;/a> 判斷接續位置。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>Rerun 位在測試失敗、部署預演失敗、資料任務失敗或 pipeline repair 之後，負責判斷重新執行是否會改變輸出或擴大副作用。&lt;/p>
&lt;h2 id="可觀察訊號">可觀察訊號&lt;/h2>
&lt;ul>
&lt;li>同一 commit 的測試結果前後不一致。&lt;/li>
&lt;li>資料任務部分成功、部分失敗。&lt;/li>
&lt;li>部署 dry run 失敗後需要確認是否可安全再跑。&lt;/li>
&lt;/ul>
&lt;h2 id="接近真實服務的例子">接近真實服務的例子&lt;/h2>
&lt;p>每日營收 pipeline 第三個 partition 寫入失敗。團隊先確認前兩個 partition 已完成且輸出可覆寫，再指定 run id 與 partition 範圍 rerun，避免重複計算全部歷史資料。&lt;/p>
&lt;h2 id="設計責任">設計責任&lt;/h2>
&lt;p>Rerun 要定義可重跑條件、輸出覆寫規則、idempotency、觀測結果與人工審核門檻，讓「再跑一次」成為受控恢復策略。&lt;/p></description><content:encoded><![CDATA[<p>Rerun 的核心概念是「用明確條件重新執行同一段流程」。它和 <a href="/blog/ci/knowledge-cards/flaky-test/" data-link-title="Flaky Test" data-link-desc="說明非決定性測試如何降低 CI gate 信任度與治理方式">Flaky Test</a> 的治理有關，也常依賴 <a href="/blog/ci/knowledge-cards/checkpoint/" data-link-title="Checkpoint" data-link-desc="說明長時間任務如何記錄進度以支援接續、重跑與事故修復">Checkpoint</a> 判斷接續位置。</p>
<h2 id="概念位置">概念位置</h2>
<p>Rerun 位在測試失敗、部署預演失敗、資料任務失敗或 pipeline repair 之後，負責判斷重新執行是否會改變輸出或擴大副作用。</p>
<h2 id="可觀察訊號">可觀察訊號</h2>
<ul>
<li>同一 commit 的測試結果前後不一致。</li>
<li>資料任務部分成功、部分失敗。</li>
<li>部署 dry run 失敗後需要確認是否可安全再跑。</li>
</ul>
<h2 id="接近真實服務的例子">接近真實服務的例子</h2>
<p>每日營收 pipeline 第三個 partition 寫入失敗。團隊先確認前兩個 partition 已完成且輸出可覆寫，再指定 run id 與 partition 範圍 rerun，避免重複計算全部歷史資料。</p>
<h2 id="設計責任">設計責任</h2>
<p>Rerun 要定義可重跑條件、輸出覆寫規則、idempotency、觀測結果與人工審核門檻，讓「再跑一次」成為受控恢復策略。</p>
]]></content:encoded></item></channel></rss>