<?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>Distributed-Systems on Thanh HV's Blog</title><link>https://thanhhv.github.io/tags/distributed-systems/</link><description>Recent content in Distributed-Systems on Thanh HV's Blog</description><generator>Hugo -- 0.146.7</generator><language>en-us</language><lastBuildDate>Thu, 09 Jul 2026 06:00:00 +0700</lastBuildDate><atom:link href="https://thanhhv.github.io/tags/distributed-systems/index.xml" rel="self" type="application/rss+xml"/><item><title>Chương 14 – Case Studies: Ráp toàn bộ kiến thức vào hệ thống thật</title><link>https://thanhhv.github.io/series/distributed-system/14-case-studies/</link><pubDate>Thu, 09 Jul 2026 06:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/14-case-studies/</guid><description>&lt;blockquote>
&lt;p>Mỗi case study dưới đây là một bài tập tổng hợp: kiến trúc → vì sao → trade-off → failure case → bottleneck → cách mở rộng. Số chương trong ngoặc trỏ về lý thuyết tương ứng. Các con số là ước lượng để tập tư duy định lượng — thói quen quan trọng nhất khi thiết kế hệ thống.&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="1-url-shortener--bài-học-vỡ-lòng-nhưng-đủ-cả-trade-off">1. URL Shortener — bài học vỡ lòng nhưng đủ cả trade-off&lt;/h2>
&lt;p>&lt;strong>Bài toán&lt;/strong>: 100M link mới/tháng (~40 write/s), redirect 10K/s — &lt;strong>read:write = 250:1&lt;/strong>, latency redirect phải &amp;lt;50ms.&lt;/p></description></item><item><title>Chương 13 – Multi-region &amp; Disaster Recovery: Bài toán Principal-level</title><link>https://thanhhv.github.io/series/distributed-system/13-multi-region/</link><pubDate>Thu, 09 Jul 2026 05:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/13-multi-region/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Ba lực đẩy một hệ thống ra nhiều region: &lt;strong>(1) Latency&lt;/strong> — tốc độ ánh sáng: Singapore↔Frankfurt ~160ms RTT, không tiền nào mua nhanh hơn được, user xa DC là UX tệ; &lt;strong>(2) Disaster Recovery&lt;/strong> — cả một region &lt;em>có thể&lt;/em> chết (AWS us-east-1 đã nhiều lần chứng minh), và với một số nghiệp vụ/regulator, &amp;ldquo;chúng tôi phụ thuộc một region&amp;rdquo; là câu trả lời không được chấp nhận; &lt;strong>(3) Data residency&lt;/strong> — luật (GDPR, nghị định địa phương hóa dữ liệu) buộc dữ liệu công dân nằm trong biên giới.&lt;/p></description></item><item><title>Chương 12 – Time: "Bây giờ" là một khái niệm nguy hiểm</title><link>https://thanhhv.github.io/series/distributed-system/12-time/</link><pubDate>Thu, 09 Jul 2026 04:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/12-time/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Trên một máy, &lt;code>now()&lt;/code> có một giá trị và các sự kiện có thứ tự hiển nhiên. Trong hệ phân tán, mỗi node có đồng hồ riêng, &lt;strong>trôi khác nhau&lt;/strong>, và câu hỏi tưởng tầm thường — &lt;em>sự kiện A ở node 1 xảy ra trước hay sau sự kiện B ở node 2?&lt;/em> — trở nên không trả lời được bằng timestamp. Trong khi đó, hàng loạt cơ chế lại đang &lt;em>ngầm&lt;/em> dựa vào timestamp: Last-Write-Wins (chương 05), TTL/lease (chương 07), log ordering, cronjob phối hợp, phát hiện timeout, chứng từ giao dịch.&lt;/p></description></item><item><title>Chương 11 – Reliability Patterns: Sống sót giữa những dependency đang hỏng</title><link>https://thanhhv.github.io/series/distributed-system/11-reliability/</link><pubDate>Thu, 09 Jul 2026 03:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/11-reliability/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Chương 01 đã chứng minh: ở quy mô đủ lớn, &lt;strong>luôn có thứ gì đó đang hỏng&lt;/strong>. Chương này trả lời câu hỏi tiếp theo: làm sao để một thành phần hỏng không kéo sập cả hệ — vì trong hệ phân tán, failure mode nguy hiểm nhất không phải là hỏng, mà là &lt;strong>hỏng lan truyền (cascading failure)&lt;/strong>:&lt;/p>
&lt;pre tabindex="0">&lt;code>DB chậm (từ 5ms → 500ms)
→ connection pool của Service B cạn (request giữ connection lâu 100x)
→ thread của Service A chờ B, cạn thread pool
→ A timeout → client RETRY → tải TĂNG GẤP ĐÔI đúng lúc yếu nhất
→ toàn hệ sập, dù thứ hỏng ban đầu chỉ là MỘT query thiếu index
&lt;/code>&lt;/pre>&lt;p>Chuỗi trên là kịch bản sự cố phổ biến nhất trong microservices — mọi pattern của chương này (timeout, retry có kỷ luật, circuit breaker, bulkhead, backpressure, rate limiting) tồn tại để &lt;strong>cắt đứt từng mắt xích&lt;/strong> của nó. Điểm chung của cả chương: &lt;em>hệ thống phải được thiết kế để từ chối bớt việc một cách có chủ đích, thay vì nhận hết rồi chết cùng nhau.&lt;/em>&lt;/p></description></item><item><title>Chương 10 – Distributed Cache: Nhanh hơn, và những cách nó phản bội bạn</title><link>https://thanhhv.github.io/series/distributed-system/10-distributed-cache/</link><pubDate>Thu, 09 Jul 2026 02:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/10-distributed-cache/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Database là thành phần đắt nhất và khó scale nhất (chương 05–06). Trong khi đó read:write điển hình là 100:1 và phần lớn read lặp lại trên một nhóm nhỏ key (power law). Cache khai thác sự lặp lại đó: trả lời từ RAM (~100µs qua mạng nội bộ, ~100ns local) thay vì disk + query planner (~1–50ms), chặn 90–99% read trước khi chạm DB.&lt;/p>
&lt;p>Nếu không có cache ở quy mô lớn: DB cần gấp 10–100 lần capacity — có khi bất khả thi về vật lý chứ không chỉ tiền. Nhưng cache về bản chất là &lt;strong>một replica eventual-consistency tự chế, không có replication protocol tử tế&lt;/strong> — và vì thế toàn bộ chương 03/05 quay lại ám bạn dưới các cái tên mới: stale read, invalidation race, stampede, avalanche. Có câu đùa nghiêm túc: &lt;em>&amp;ldquo;Chỉ có hai bài toán khó trong khoa học máy tính: cache invalidation và đặt tên.&amp;rdquo;&lt;/em>&lt;/p></description></item><item><title>Chương 09 – Event-driven Architecture: Sự kiện là hạng nhất</title><link>https://thanhhv.github.io/series/distributed-system/09-event-driven/</link><pubDate>Thu, 09 Jul 2026 01:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/09-event-driven/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Khi &amp;ldquo;đơn hàng được tạo&amp;rdquo; cần kích hoạt 8 việc (email, tồn kho, loyalty, analytics, fraud, shipping&amp;hellip;), mô hình gọi-trực-tiếp buộc OrderService &lt;strong>biết và gọi&lt;/strong> cả 8 — mỗi consumer mới là một lần sửa OrderService, availability của việc &lt;em>tạo đơn&lt;/em> phụ thuộc cả 8 hệ phụ trợ, và latency cộng dồn. Nghiêm trọng hơn ở tầng tổ chức: team Order thành nút cổ chai của mọi team khác.&lt;/p></description></item><item><title>Chương 08 – Distributed Transactions: Nhiều node, một nghiệp vụ nguyên tử</title><link>https://thanhhv.github.io/series/distributed-system/08-distributed-transactions/</link><pubDate>Thu, 09 Jul 2026 00:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/08-distributed-transactions/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Nghiệp vụ &amp;ldquo;đặt hàng&amp;rdquo; chạm 3 hệ: trừ tồn kho (Inventory DB), tạo đơn (Order DB), trừ tiền (Payment service). Trên một database, &lt;code>BEGIN...COMMIT&lt;/code> cho tất cả-hoặc-không. Khi dữ liệu đã tách (vì sharding — chương 06, vì microservices), &lt;strong>không còn transaction chung&lt;/strong> — và mọi kịch bản dở dang trở nên khả thi: trừ tiền rồi mà không có đơn; giữ chỗ tồn kho rồi mà thanh toán fail và không ai nhả.&lt;/p></description></item><item><title>Chương 07 – Consensus: Làm sao nhiều máy nhất trí một điều</title><link>https://thanhhv.github.io/series/distributed-system/07-consensus/</link><pubDate>Wed, 08 Jul 2026 23:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/07-consensus/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Nhiều bài toán ở các chương trước đều quy về một câu hỏi: &lt;strong>làm sao một nhóm node, trên mạng không đáng tin cậy, nhất trí về MỘT giá trị&lt;/strong> — ai là leader (chương 05 failover), thứ tự các write trong log, bản đồ partition→node (chương 06), ai giữ lock.&lt;/p>
&lt;p>Nếu giải sai: &lt;strong>split brain&lt;/strong> — hai node cùng tin mình là leader, cùng nhận write → hai nhánh sự thật phân kỳ, và không có cách nào hợp nhất tự động dữ liệu ledger đã phân kỳ. Đây là failure mode đắt nhất của hệ phân tán. Giải pháp cũ — &amp;ldquo;để con người quyết&amp;rdquo; — có MTTR hàng giờ; &amp;ldquo;node nào nhanh hơn thì thắng&amp;rdquo; — chính là split brain.&lt;/p></description></item><item><title>Chương 06 – Partitioning / Sharding: Chia dữ liệu để scale write</title><link>https://thanhhv.github.io/series/distributed-system/06-partitioning/</link><pubDate>Wed, 08 Jul 2026 22:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/06-partitioning/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Replication (chương 05) nhân bản &lt;em>toàn bộ&lt;/em> dữ liệu — giải quyết availability và scale read, nhưng &lt;strong>mỗi node vẫn phải chứa hết dữ liệu và nhận hết write&lt;/strong>. Khi dataset vượt dung lượng một máy (chục TB) hoặc write throughput vượt khả năng một leader, con đường duy nhất: &lt;strong>chia dữ liệu thành các partition (shard), mỗi node giữ một phần.&lt;/strong>&lt;/p>
&lt;p>Nếu không partition: disk đầy (hard stop), write throughput chạm trần leader, index không vừa RAM → mọi query chậm dần, backup/restore lâu đến vô dụng. Giải pháp cũ — mua máy to hơn — chạm trần và đắt phi tuyến (chương 01).&lt;/p></description></item><item><title>Chương 05 – Replication: Nhiều bản sao, một sự thật (hoặc không)</title><link>https://thanhhv.github.io/series/distributed-system/05-replication/</link><pubDate>Wed, 08 Jul 2026 21:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/05-replication/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Replication = giữ cùng dữ liệu trên nhiều node. Ba lý do buộc phải làm: &lt;strong>sống sót khi node chết&lt;/strong> (durability + availability), &lt;strong>scale read&lt;/strong> (dàn read ra nhiều replica), &lt;strong>giảm latency theo địa lý&lt;/strong> (bản sao gần user). Nếu không replicate: node chết = mất dữ liệu + downtime đến khi restore từ backup (RPO = từ lần backup cuối, RTO = hàng giờ). Backup không thay thế replication — backup cứu bạn khỏi &lt;em>mất vĩnh viễn&lt;/em>, replication cứu bạn khỏi &lt;em>ngừng phục vụ&lt;/em>.&lt;/p></description></item><item><title>Chương 04 – CAP &amp; PACELC: Hiểu đúng, dùng đúng, và biết giới hạn</title><link>https://thanhhv.github.io/series/distributed-system/04-cap-pacelc/</link><pubDate>Wed, 08 Jul 2026 20:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/04-cap-pacelc/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Khi thiết kế hệ thống có replication, sớm muộn bạn phải trả lời: &lt;strong>khi mạng giữa các replica đứt (network partition), hệ thống làm gì?&lt;/strong> Từ chối phục vụ để giữ dữ liệu đúng, hay tiếp tục phục vụ và chấp nhận dữ liệu phân kỳ? CAP Theorem là công cụ tư duy chuẩn hóa cho câu hỏi đó — nhưng nó cũng là định lý &lt;strong>bị hiểu sai nhiều nhất&lt;/strong> trong ngành, và hiểu sai dẫn đến quyết định kiến trúc sai (&amp;ldquo;chọn 2 trong 3&amp;rdquo; là cách đọc sai phổ biến nhất).&lt;/p></description></item><item><title>Chương 03 – Consistency Models: "Đọc thấy gì" là một hợp đồng</title><link>https://thanhhv.github.io/series/distributed-system/03-consistency/</link><pubDate>Wed, 08 Jul 2026 19:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/03-consistency/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Ngay khi dữ liệu tồn tại ở &lt;strong>hơn một nơi&lt;/strong> (replica, cache), xuất hiện câu hỏi không có ở hệ một máy: &lt;em>đọc ở nơi này có thấy cái vừa ghi ở nơi kia không?&lt;/em> Consistency model là &lt;strong>hợp đồng&lt;/strong> giữa hệ thống lưu trữ và ứng dụng: hệ thống cam kết trả lời câu hỏi đó theo quy tắc nào.&lt;/p>
&lt;p>Nếu không định nghĩa hợp đồng rõ ràng: user đăng comment, refresh trang, comment biến mất (đọc trúng replica trễ) → user đăng lại → duplicate; hệ thống kiểm tra số dư trên replica trễ → cho rút quá tiền; hai người cùng đặt phòng cuối cùng → double booking. Đây không phải bug hiếm — đây là &lt;strong>hành vi mặc định&lt;/strong> khi bạn dùng replication mà không nghĩ về consistency model.&lt;/p></description></item><item><title>Chương 02 – Communication: Các node nói chuyện với nhau như thế nào</title><link>https://thanhhv.github.io/series/distributed-system/02-communication/</link><pubDate>Wed, 08 Jul 2026 18:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/02-communication/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Trên một máy, module A gọi module B bằng một function call: chi phí ~nanosecond, không bao giờ &amp;ldquo;mất&amp;rdquo;, không bao giờ trả về hai lần, và nếu B crash thì A cũng crash cùng (trạng thái nhất quán). Khi B chuyển sang máy khác, function call trở thành &lt;strong>remote call&lt;/strong>: chậm hơn ~10⁶ lần, có thể mất, có thể timeout khi đã thành công, và B chết không kéo A chết theo — nghe như ưu điểm, nhưng nghĩa là A phải &lt;em>tự quyết định&lt;/em> làm gì khi không biết B sống hay chết.&lt;/p></description></item><item><title>Chương 01 – Foundations: Vì sao Distributed Systems tồn tại</title><link>https://thanhhv.github.io/series/distributed-system/01-foundations/</link><pubDate>Wed, 08 Jul 2026 17:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/01-foundations/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Không ai &lt;em>muốn&lt;/em> xây hệ thống phân tán. Hệ phân tán khó debug hơn, đắt hơn, nhiều chế độ lỗi hơn, và đòi hỏi đội ngũ giỏi hơn. Chúng ta xây hệ phân tán vì &lt;strong>bị ép buộc&lt;/strong> bởi ba lực:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Giới hạn vật lý của một máy&lt;/strong> — CPU, RAM, Disk IO, Network bandwidth đều có trần. Một máy 128 core, 4TB RAM vẫn là &lt;em>một&lt;/em> máy.&lt;/li>
&lt;li>&lt;strong>Single Point of Failure (SPOF)&lt;/strong> — một máy có xác suất hỏng khác 0. Khi nó hỏng, toàn bộ nghiệp vụ dừng. Không có cấu hình phần cứng nào loại bỏ được rủi ro này.&lt;/li>
&lt;li>&lt;strong>Địa lý&lt;/strong> — người dùng ở Việt Nam gọi server ở Virginia chịu tối thiểu ~220ms round-trip. Tốc độ ánh sáng là giới hạn cứng, không mua được bằng tiền.&lt;/li>
&lt;/ol>
&lt;p>Nếu không giải quyết: hệ thống sập khi traffic tăng, mất doanh thu khi máy hỏng, và trải nghiệm người dùng tệ ở xa datacenter. Giải pháp cũ (mua máy to hơn — Scale Up) chỉ trì hoãn vấn đề: giá tăng phi tuyến theo cấu hình, và SPOF vẫn nguyên vẹn.&lt;/p></description></item><item><title>Distributed Systems – Từ First Principles đến Production</title><link>https://thanhhv.github.io/series/distributed-system/00-introduction/</link><pubDate>Wed, 08 Jul 2026 16:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/distributed-system/00-introduction/</guid><description>&lt;blockquote>
&lt;p>Bộ tài liệu chuyên sâu về Hệ thống Phân tán, viết cho Backend Engineer, Senior Engineer, Tech Lead và Architect.
Triết lý xuyên suốt: &lt;strong>Business Growth → Single Machine → Single Point of Failure → Scalability Problem → Distributed Systems → New Problems → Trade-off → Solutions → Production.&lt;/strong>&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="cách-đọc-bộ-tài-liệu-này">Cách đọc bộ tài liệu này&lt;/h2>
&lt;p>Distributed Systems &lt;strong>không phải&lt;/strong> là tập hợp các công nghệ như Kafka, Redis hay Kubernetes. Đó là một lĩnh vực nghiên cứu về cách nhiều máy tính phối hợp giải quyết một bài toán chung, trong khi luôn phải đối mặt với: độ trễ mạng không xác định, phần cứng hỏng bất kỳ lúc nào, phần mềm có bug, và sự thật khó chịu nhất — &lt;strong>không node nào biết chắc trạng thái thật của node khác&lt;/strong>.&lt;/p></description></item></channel></rss>