<?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>Rerun on Tarragon</title><link>https://tarrragon.github.io/blog/tags/rerun/</link><description>Recent content in Rerun 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/rerun/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>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>