[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-crdts-keep-replicas-in-sync-without-locks-zh":3,"article-related-crdts-keep-replicas-in-sync-without-locks-zh":34,"series-research-f374155a-c29e-478c-b7a5-679cad1c51e4":84},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":25,"views":30,"created_at":31,"published_at":32,"topic_cluster_id":33},"f374155a-c29e-478c-b7a5-679cad1c51e4","crdts-keep-replicas-in-sync-without-locks-zh","CRDT 讓副本不用鎖也能同步","\u003Cp data-speakable=\"summary\">CRDT 讓\u003Ca href=\"\u002Fnews\u002Fpost-deterministic-systems-autonomous-infra-zh\">分散\u003C\u002Fa>式應用能同時接受多方寫入，之後再自動收斂成一致結果。\u003C\u002Fp>\u003Cp>說真的，這東西很適合\u003Ca href=\"\u002Ftag\u002F分散式系統\">分散式系統\u003C\u002Fa>。你不用每次寫入都先問伺服器。副本先收資料，之後再合併就好。\u003C\u002Fp>\u003Cp>這篇講的是 \u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FConflict-free_replicated_data_type\" target=\"_blank\" rel=\"noopener\">CRDT\u003C\u002Fa>。它是 Conflict-free Replicated Data Type 的縮寫。概念在 2011 年正式整理出來。作者是 Marc Shapiro、Nuno Preguiça、Carlos Baquero 和 Marek Zawirski。\u003C\u002Fp>\u003Cp>實務上，\u003Ca href=\"https:\u002F\u002Fredis.io\u002Fdocs\u002Flatest\u002Fdevelop\u002Fdata-types\u002Fcrdt\u002F\" target=\"_blank\" rel=\"noopener\">Redis\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fwww.ibm.com\u002Fdocs\u002Fen\u002Friac?topic=overview-crdts\" target=\"_blank\" rel=\"noopener\">Riak\u003C\u002Fa>，還有 \u003Ca href=\"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fcosmos-db\u002Fconsistency-levels\" target=\"_blank\" rel=\"noopener\">Azure Cosmos DB\u003C\u002Fa> 都碰過這套路。講白了，它不是論文玩具，是真的進過生產環境。\u003C\u002Fp>\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Fact\u003C\u002Fth>\u003Cth>Value\u003C\u002Fth>\u003Cth>Why it matters\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>Formal definition\u003C\u002Ftd>\u003Ctd>2011\u003C\u002Ftd>\u003Ctd>CRDT 變成正式研究主題\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Core property\u003C\u002Ftd>\u003Ctd>Eventual convergence\u003C\u002Ftd>\u003Ctd>副本可短暫不同，最後仍一致\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Two main families\u003C\u002Ftd>\u003Ctd>State-based and operation-based\u003C\u002Ftd>\u003Ctd>團隊可在簡單合併與省流量間選擇\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Example systems\u003C\u002Ftd>\u003Ctd>Redis, Riak, Cosmos DB\u003C\u002Ftd>\u003Ctd>它已進入實際資料庫與服務\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003Ch2>CRDT 為什麼重要\u003C\u002Fh2>\u003Cp>分散式軟體最煩的，就是大家同時改同一份資料。兩個使用者一起編輯，兩台伺服器同時收寫入，結果就會撞車。傳統作法是加鎖、做協調、跑共識。能解，但延遲會上來，服務也更脆。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781011086259-4p4k.png\" alt=\"CRDT 讓副本不用鎖也能同步\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>CRDT 的想法比較直白。先讓每個副本本地接受\u003Ca href=\"\u002Fnews\u002Fgemini-1-5-pro-002-flash-002-2-0-flash-update-zh\">更新\u003C\u002Fa>。之後再用固定規則合併。只要資料型別設計對了，副本就算先分歧，最後也會收斂到同一份結果。\u003C\u002Fp>\u003Cp>這對離線優先 app 很有用。像協作編輯、聊天、筆記同步、手機離線回寫，都很吃這套。你不想因為網路慢，就卡住每一次輸入。\u003C\u002Fp>\u003Cul>\u003Cli>每個副本都能先本地寫入。\u003C\u002Fli>\u003Cli>不需要每次都做跨節點協調。\u003C\u002Fli>\u003Cli>合併規則寫在資料型別裡。\u003C\u002Fli>\u003Cli>副本最後會收斂成一致狀態。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>兩大類型，兩種取捨\u003C\u002Fh2>\u003Cp>CRDT 大致分成兩種。第一種是 state-based CRDT，也叫 CvRDT。第二種是 operation-based CRDT，也叫 CmRDT。兩者都追求 strong eventual consistency，但資料傳輸方式不同。\u003C\u002Fp>\u003Cp>state-based CRDT 會把整個狀態送出去。接收端再用 merge function 合併。這個 merge 必須滿足 commutative、associative、idempotent。翻成白話就是，順序亂掉、重複送一次，都不能把結果弄壞。\u003C\u002Fp>\u003Cp>operation-based CRDT 則是送操作，不送整包狀態。這樣通常比較省頻寬。代價是傳輸層要更可靠。操作要避免重複，還要維持 causal order。網路層沒做好，資料就會亂。\u003C\u002Fp>\u003Cblockquote>“The merge function should compute the join for any pair of replica states, and should form a semilattice with the initial state as the neutral element.”\u003C\u002Fblockquote>\u003Cp>這句話很硬，但意思很單純。合併函式要能把兩個副本狀態接起來，而且不怕晚到、重送、亂序。這就是 CRDT 的核心約束。沒有這條，整套設計就會翻車。\u003C\u002Fp>\u003Cul>\u003Cli>state-based CRDT 比較好設計。\u003C\u002Fli>\u003Cli>它常搭配 gossip 傳播。\u003C\u002Fli>\u003Cli>operation-based CRDT 比較省流量。\u003C\u002Fli>\u003Cli>它更吃訊息系統品質。\u003C\u002Fli>\u003Cli>兩者都要保證最後收斂。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>幾個經典例子最好懂\u003C\u002Fh2>\u003Cp>先看 \u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCounter#Distributed_counters\" target=\"_blank\" rel=\"noopener\">G-Counter\u003C\u002Fa>。它是只增不減的計數器。每個節點只改自己的槽位。合併時取每個槽位的最大值。最後再把整個陣列加總。這樣就不怕兩邊同時加 1。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781011084073-m3vx.png\" alt=\"CRDT 讓副本不用鎖也能同步\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>再看 \u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCounter#Distributed_counters\" target=\"_blank\" rel=\"noopener\">PN-Counter\u003C\u002Fa>。它把增和減拆成兩個 G-Counter。對外看起來可以加減，內部其實還是單向遞增。這種設計很 CRDT。外表像一般資料結構，底層卻很克制。\u003C\u002Fp>\u003Cp>集合類型也很經典。\u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSet_(abstract_data_type)\" target=\"_blank\" rel=\"noopener\">G-Set\u003C\u002Fa> 只能新增。\u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTwo-phase_set\" target=\"_blank\" rel=\"noopener\">2P-Set\u003C\u002Fa> 加上 tombstone，刪除後就不能再回來。\u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLast-write-wins_element_set\" target=\"_blank\" rel=\"noopener\">LWW-Element-Set\u003C\u002Fa> 用時間戳決勝負。\u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FObserved-remove_set\" target=\"_blank\" rel=\"noopener\">OR-Set\u003C\u002Fa> 則更細膩，能保留更多並行意圖。\u003C\u002Fp>\u003Cul>\u003Cli>G-Counter：分散式累加。\u003C\u002Fli>\u003Cli>PN-Counter：可加可減，但內部仍單向成長。\u003C\u002Fli>\u003Cli>G-Set：只允許新增。\u003C\u002Fli>\u003Cli>2P-Set：刪除有墓碑。\u003C\u002Fli>\u003Cli>LWW-Element-Set：靠 timestamp 決定勝負。\u003C\u002Fli>\u003Cli>OR-Set：更適合多人協作。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>跟傳統一致性方案比，差在哪\u003C\u002Fh2>\u003Cp>先講結論。CRDT 不是拿來取代所有一致性方案。它比較像一把專用\u003Ca href=\"\u002Fnews\u002Ffigma-release-notes-mcp-agent-qa-tools-zh\">工具\u003C\u002Fa>。適合的地方很好用，不適合的地方就會很卡。你如果硬拿去做複雜交易，通常只會把自己搞累。\u003C\u002Fp>\u003Cp>跟鎖、兩階段提交、共識協定比，CRDT 最大的好處是少協調。少協調代表延遲低，跨區也比較不怕。代價是資料型別要先設計好，不能隨便亂塞任意邏輯。\u003C\u002Fp>\u003Cp>從系統角度看，CRDT 很適合 counters、flags、sets、協作註記。這些資料有個共通點。它們常常只需要「最後能對上」，不一定要每一步都同步到完全一致。\u003C\u002Fp>\u003Cul>\u003Cli>CRDT 適合離線優先與多區部署。\u003C\u002Fli>\u003Cli>鎖和共識適合強一致交易。\u003C\u002Fli>\u003Cli>CRDT 對資料模型有要求。\u003C\u002Fli>\u003Cli>不是每種狀態都能輕鬆改成 CRDT。\u003C\u002Fli>\u003Cli>設計好時，延遲和阻塞會少很多。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>產業脈絡其實很現實\u003C\u002Fh2>\u003Cp>CRDT 最早是為了協作編輯和行動裝置。這很合理。手機常常斷線。多人又會同時改同一份文件。你不可能每打一個字，就等遠端確認。那體驗會爛到爆。\u003C\u002Fp>\u003Cp>後來，聊天系統、媒體分發、遊戲狀態、地理分散資料庫也開始碰它。\u003Ca href=\"https:\u002F\u002Fsoundcloud.com\" target=\"_blank\" rel=\"noopener\">SoundCloud\u003C\u002Fa> 就是常被拿來提的例子之一。它提醒大家，CRDT 不只是學術名詞。它真的能處理分散式寫入的髒活。\u003C\u002Fp>\u003Cp>如果你在做多區服務，CRDT 會出現在幾個地方。像是計數、通知已讀、線上狀態、協作標記。這些欄位看起來小，卻常常是系統最容易吵架的地方。把它們改成可收斂資料型別，通常比硬上全域鎖更實際。\u003C\u002Fp>\u003Cp>你也可以先看另一篇 \u003Ca href=\"\u002Fnews\u002Feventual-consistency-vs-strong-consistency\" target=\"_blank\" rel=\"noopener\">eventual consistency vs. strong consistency\u003C\u002Fa>。先搞懂一致性光譜，再回來看 CRDT，會比較有感。\u003C\u002Fp>\u003Cp>講白了，CRDT 解的是一個很工程的問題。不是要你相信某種理論。是要你少踩同步地雷。\u003C\u002Fp>\u003Ch2>下一步怎麼看待 CRDT\u003C\u002Fh2>\u003Cp>CRDT 很強，但不是萬能。它最適合的是單調成長、可合併、可收斂的狀態。像任意刪除、複雜交易、嚴格排序，這些就沒那麼順。\u003C\u002Fp>\u003Cp>如果你是開發者，我會建議先挑一個功能來看。像是計數器、草稿同步、協作註解，或線上狀態。問自己一句話：這個狀態能不能改成 monotonic？如果可以，你就有機會少掉很多 coordination 成本。\u003C\u002Fp>\u003Cp>我自己的判斷很直接。CRDT 不是拿來炫技的。它是拿來救分散式系統的手感。當你的產品開始跨區、離線、多人同寫時，這套東西就會變得很值錢。下一步最實際的做法，就是把一個功能畫成狀態圖，看看能不能先從 CRDT 化開始。\u003C\u002Fp>","CRDT 讓分散式應用能同時接受多方寫入，之後再自動收斂成一致結果，適合離線優先、協作編輯與多區部署。","en.wikipedia.org","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FConflict-free_replicated_data_type",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781011086259-4p4k.png","research","zh","850449f2-e75b-4dbf-97c0-3590c6cbf097",[17,18,19,20,21,22,23,24],"CRDT","分散式系統","eventual consistency","協作編輯","資料同步","Redis","Riak","Azure Cosmos DB",[26,27,28,29],"CRDT 讓副本先本地寫入，再用可收斂的規則合併。","state-based 與 operation-based 是兩種主要設計，取捨在簡單性與傳輸成本。","G-Counter、PN-Counter、OR-Set 是理解 CRDT 的經典例子。","CRDT 適合離線優先、多區部署與協作場景，不適合任意交易邏輯。",2,"2026-06-09T13:17:34.493426+00:00","2026-06-09T13:17:34.466+00:00","0c35a120-52fc-41fc-afa3-d404eb934158",{"tags":35,"relatedLang":43,"relatedPosts":47},[36,38,39,41,42],{"name":19,"slug":37},"eventual-consistency",{"name":20,"slug":20},{"name":17,"slug":40},"crdt",{"name":21,"slug":21},{"name":18,"slug":18},{"id":15,"slug":44,"title":45,"language":46},"crdts-keep-replicas-in-sync-without-locks-en","CRDTs keep replicas in sync without locks","en",[48,54,60,66,72,78],{"id":49,"slug":50,"title":51,"cover_image":52,"image_url":52,"created_at":53,"category":13},"4b3b5a50-45b7-4238-a38b-160f82e323ff","post-deterministic-systems-autonomous-infra-zh","後決定性分散系：自治基礎設施新框架","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781010194792-5ogb.png","2026-06-09T13:02:32.717551+00:00",{"id":55,"slug":56,"title":57,"cover_image":58,"image_url":58,"created_at":59,"category":13},"04e45398-9814-4907-b416-fcb5b8d69508","causal-learnability-formal-language-tasks-zh","用因果法量化任務可學性","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780987696075-l4g0.png","2026-06-09T06:47:34.438642+00:00",{"id":61,"slug":62,"title":63,"cover_image":64,"image_url":64,"created_at":65,"category":13},"75bcc569-5e89-45c8-b809-6f169e929f4b","rl-training-hands-off-control-gradually-zh","RL 先接管再放手","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780986786312-03yo.png","2026-06-09T06:32:32.849589+00:00",{"id":67,"slug":68,"title":69,"cover_image":70,"image_url":70,"created_at":71,"category":13},"e3ecab4b-7cc7-4246-baf6-e1c170d86ca5","omnigamearena-vlm-game-agent-benchmark-zh","OmniGameArena 讓 VLM 遊戲代理更好比","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780985893022-70pl.png","2026-06-09T06:17:32.189729+00:00",{"id":73,"slug":74,"title":75,"cover_image":76,"image_url":76,"created_at":77,"category":13},"6f25a29c-cbb8-4f53-9af7-1656b394333a","turboquant-cuts-kv-cache-memory-6x-google-tests-zh","TurboQuant 在 Google 測試中省下 6x KV 快取","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780906682236-sqe2.png","2026-06-08T08:17:21.878314+00:00",{"id":79,"slug":80,"title":81,"cover_image":82,"image_url":82,"created_at":83,"category":13},"0e9f2d34-1873-4c6f-bdec-5d89fbaab037","memdreamer-long-video-understanding-memory-retrieval-zh","MemDreamer 用記憶拆解長影片","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780902187207-ilt0.png","2026-06-08T07:02:32.374349+00:00",[85,90,95,100,105,110,115,120,125,130],{"id":86,"slug":87,"title":88,"created_at":89},"f18dbadb-8c59-4723-84a4-6ad22746c77a","deepmind-bets-on-continuous-learning-ai-2026-zh","DeepMind 押注 2026 連續學習 AI","2026-03-26T08:16:02.367355+00:00",{"id":91,"slug":92,"title":93,"created_at":94},"f4a106cb-02a6-4508-8f39-9720a0a93cee","ml-papers-of-the-week-github-research-desk-zh","每週 ML 論文清單，為何紅到 GitHub","2026-03-27T01:11:39.284175+00:00",{"id":96,"slug":97,"title":98,"created_at":99},"c4f807ca-4e5f-47f1-a48c-961cf3fc44dc","ai-ml-conferences-to-watch-in-2026-zh","2026 AI 研討會投稿時程整理","2026-03-27T01:51:53.874432+00:00",{"id":101,"slug":102,"title":103,"created_at":104},"cf046742-efb2-4753-aef9-caed5da5e32e","adaptive-block-scaled-data-types-zh","IF4：神經網路量化的聰明選擇","2026-03-31T06:00:36.990273+00:00",{"id":106,"slug":107,"title":108,"created_at":109},"53a0dc54-0371-4e40-8d5e-74e94a73840c","geometry-aware-similarity-metrics-for-neural-representations-zh","超越距離測量：用微分幾何重新理解神經網路","2026-03-31T06:01:01.241968+00:00",{"id":111,"slug":112,"title":113,"created_at":114},"fee7d472-a775-4b1d-bbc2-1e8bca1bbf8b","on-the-fly-repulsion-in-the-contextual-space-for-rich-divers-zh","讓AI繪圖更有創意：用排斥力提升生成多樣性","2026-03-31T06:01:25.439673+00:00",{"id":116,"slug":117,"title":118,"created_at":119},"a9901203-d69b-447b-8854-15d14eab32b4","vision-aided-beam-prediction-cnn-eca-zh","影像輔助波束預測升級 CNN","2026-04-01T10:00:25.8073+00:00",{"id":121,"slug":122,"title":123,"created_at":124},"b55e7dd4-0a24-4b3d-804d-b0309a03f498","triple-band-fss-mimo-antenna-sub-6-ghz-zh","三頻 FSS MIMO 天線瞄準 sub-6 GHz","2026-04-01T13:18:36.857305+00:00",{"id":126,"slug":127,"title":128,"created_at":129},"f68290bd-e7f3-4b30-ba22-dcd4e0130a66","openclaw-1299-repos-eight-weeks-analysis-zh","OpenClaw 1299 個 Repo 的資料解讀","2026-04-02T05:03:45.208411+00:00",{"id":131,"slug":132,"title":133,"created_at":134},"ed9f80eb-eb02-4d35-8ad4-0ddf428751dd","beam-coherence-aware-combining-mmwave-mimo-zh","毫米波 MIMO 的雙階合併法","2026-04-02T05:27:26.897188+00:00"]