<?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>System Design — Tư Duy Thiết Kế Hệ Thống on Thanh HV's Blog</title><link>https://thanhhv.github.io/series/system-design/</link><description>Recent content in System Design — Tư Duy Thiết Kế Hệ Thống on Thanh HV's Blog</description><generator>Hugo -- 0.146.7</generator><language>en-us</language><lastBuildDate>Mon, 13 Jul 2026 18:50:00 +0700</lastBuildDate><atom:link href="https://thanhhv.github.io/series/system-design/index.xml" rel="self" type="application/rss+xml"/><item><title>14.10. Search System — Phần 9 trong hành động</title><link>https://thanhhv.github.io/series/system-design/14-case-studies/10-search-system/</link><pubDate>Mon, 13 Jul 2026 18:50:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/14-case-studies/10-search-system/</guid><description>&lt;blockquote>
&lt;p>Case study cuối cùng có vai trò đặc biệt: &lt;a href="https://thanhhv.github.io/series/system-design/09-search/00-tong-quan/">Phần 9&lt;/a> đã cho đủ lý thuyết — bài này là &lt;strong>bài tập tổng hợp có lời giải&lt;/strong>, đi qua đúng trình tự một team thật sẽ đi, để bạn đối chiếu với cách tự mình sẽ làm. Đọc theo cách của &lt;a href="https://thanhhv.github.io/series/system-design/14-case-studies/00-tong-quan/">README Phần 14&lt;/a>: dừng sau mỗi mục, tự trả lời trước, rồi so.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-business-requirement--constraint">1. Business Requirement &amp;amp; Constraint&lt;/h2>
&lt;p>VietShop (&lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/00-tong-quan/">Phần 12&lt;/a>) ở giai đoạn 6+: 2M user, 800K SKU từ 10K seller. Search hiện tại là PostgreSQL &lt;code>ILIKE&lt;/code> từ thời MVP — zero-result rate 22%, CTR search 11%, và đội data chỉ ra: &lt;strong>phiên có search chuyển đổi gấp 2.3 lần phiên duyệt&lt;/strong> — nhưng search đang tệ. Bài toán được duyệt ngân sách như một &lt;em>dự án doanh thu&lt;/em>, không phải dự án hạ tầng: đó là cách đúng để bài search được sinh ra.&lt;/p></description></item><item><title>14.9. AI Platform — GPU đắt và hai chế độ phục vụ</title><link>https://thanhhv.github.io/series/system-design/14-case-studies/09-ai-platform/</link><pubDate>Mon, 13 Jul 2026 18:40:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/14-case-studies/09-ai-platform/</guid><description>&lt;blockquote>
&lt;p>Bài toán định hình: tài nguyên tính toán đắt nhất từng xuất hiện trong tài liệu này (GPU inference đắt hơn CPU serving 10–100×), thời gian xử lý một request dài nhất (giây, không phải mili-giây), và output &lt;strong>không tất định&lt;/strong>. Ba đặc điểm đó bẻ cong nhiều phản xạ đã học — nhưng phần lớn bộ công cụ cũ vẫn đúng, chỉ cần vặn lại hệ số.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-business-requirement--constraint">1. Business Requirement &amp;amp; Constraint&lt;/h2>
&lt;p>Nền tảng AI nội bộ cho một tập đoàn bán lẻ: các team sản phẩm gọi chung một cửa để dùng LLM (chatbot CSKH, tóm tắt đánh giá, sinh mô tả sản phẩm) và các model nội bộ (phân loại ảnh, dự báo). Kết hợp &lt;strong>API bên ngoài&lt;/strong> (OpenAI/Claude-class) và &lt;strong>model tự host trên GPU&lt;/strong> (model tiếng Việt fine-tune, dữ liệu nhạy cảm không được rời hạ tầng). Team 8 dev/ML. Ràng buộc thống trị: &lt;strong>ngân sách GPU + API bill&lt;/strong> — đây là hệ thống đầu tiên trong tài liệu mà &lt;em>chi phí biến đổi theo từng request&lt;/em> đủ lớn để thành NFR số một.&lt;/p></description></item><item><title>14.8. SaaS Platform — multi-tenancy và noisy neighbor</title><link>https://thanhhv.github.io/series/system-design/14-case-studies/08-saas-platform/</link><pubDate>Mon, 13 Jul 2026 18:30:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/14-case-studies/08-saas-platform/</guid><description>&lt;blockquote>
&lt;p>Bài toán định hình: &lt;strong>một hạ tầng, nghìn khách hàng, và hai lời hứa mâu thuẫn&lt;/strong> — &amp;ldquo;dữ liệu của bạn cách ly tuyệt đối&amp;rdquo; và &amp;ldquo;giá rẻ nhờ dùng chung&amp;rdquo;. Multi-tenancy là nghệ thuật giữ cả hai lời hứa cùng lúc — và tenant lớn nhất luôn lớn hơn tenant nhỏ nhất &lt;em>bốn bậc độ lớn&lt;/em> (&lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/02-database-failures/">13.2 — luật lũy thừa, lần thứ n&lt;/a>).&lt;/p>&lt;/blockquote>
&lt;h2 id="1-business-requirement--constraint">1. Business Requirement &amp;amp; Constraint&lt;/h2>
&lt;p>SaaS quản lý bán hàng đa kênh cho SME Việt Nam (đơn hàng, kho, khách hàng, báo cáo — kết nối sàn TMĐT): 5.000 tenant từ shop 2 người đến chuỗi bán lẻ 200 cửa hàng. Doanh thu theo gói (freemium → enterprise). Team 12 dev. Ràng buộc sống còn của mô hình SaaS: &lt;strong>chi phí phục vụ mỗi tenant phải giảm theo quy mô&lt;/strong> — nếu mỗi khách mới cần thêm người vận hành, đó là công ty outsourcing đội lốt SaaS.&lt;/p></description></item><item><title>14.7. Ride Hailing — geo real-time và dữ liệu phù du</title><link>https://thanhhv.github.io/series/system-design/14-case-studies/07-ride-hailing/</link><pubDate>Mon, 13 Jul 2026 18:20:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/14-case-studies/07-ride-hailing/</guid><description>&lt;blockquote>
&lt;p>Bài toán định hình: dữ liệu trung tâm (vị trí tài xế) &lt;strong>mất giá trị sau vài giây&lt;/strong> — lần đầu trong tài liệu này, ta gặp dữ liệu mà &lt;em>không lưu&lt;/em> mới là thiết kế đúng. Cộng với matching thời gian thực theo không gian — bài toán mà index truyền thống bó tay.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-business-requirement--constraint">1. Business Requirement &amp;amp; Constraint&lt;/h2>
&lt;p>App gọi xe khu vực (xe máy + ô tô, 3 thành phố lớn VN): khách đặt xe, hệ tìm tài xế gần, khớp lệnh, theo dõi chuyến, tính cước, surge giờ cao điểm. 50K tài xế hoạt động, 500K khách; team 15 dev. Ràng buộc nghiệp vụ khắc nghiệt: &lt;strong>matching chậm 5 giây = khách mở app đối thủ&lt;/strong> — thị trường hai chiều, cả hai phía đều có lựa chọn khác trong túi.&lt;/p></description></item><item><title>14.6. Video Streaming — băng thông là kiến trúc</title><link>https://thanhhv.github.io/series/system-design/14-case-studies/06-video-streaming/</link><pubDate>Mon, 13 Jul 2026 18:10:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/14-case-studies/06-video-streaming/</guid><description>&lt;blockquote>
&lt;p>Bài toán định hình: video là dữ liệu nặng hơn mọi thứ khác &lt;strong>ba bậc độ lớn&lt;/strong> — một giờ video 1080p ≈ 2–4GB, bằng vài triệu bản ghi DB. Khi dữ liệu nặng đến thế, &lt;strong>chi phí băng thông và vị trí đặt byte quyết định kiến trúc&lt;/strong> nhiều hơn mọi lựa chọn framework.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-business-requirement--constraint">1. Business Requirement &amp;amp; Constraint&lt;/h2>
&lt;p>Nền tảng video học tập Việt Nam (khóa học quay sẵn + livestream lớp học): giảng viên upload bài giảng, học viên xem theo gói đăng ký. 500K học viên, mục tiêu 2M. Doanh thu theo subscription → &lt;strong>trải nghiệm xem (không giật, tua nhanh) là sản phẩm&lt;/strong>; và chi phí băng thông là dòng chi phí lớn nhất của công ty — tối ưu nó không phải tối ưu kỹ thuật mà là tối ưu biên lợi nhuận.&lt;/p></description></item><item><title>14.5. Banking &amp; FinTech — khi sai một đồng là sai tất cả</title><link>https://thanhhv.github.io/series/system-design/14-case-studies/05-banking-fintech/</link><pubDate>Mon, 13 Jul 2026 18:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/14-case-studies/05-banking-fintech/</guid><description>&lt;blockquote>
&lt;p>Bài toán định hình: &lt;strong>đúng tuyệt đối, chứng minh được, và kiểm toán được&lt;/strong> — trong khi throughput lại &lt;em>thấp một cách đáng ngạc nhiên&lt;/em>. Banking đảo ngược trực giác của mọi case trước: đây là bài mà scale là chuyện phụ, còn từng đồng là chuyện chính.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-business-requirement--constraint">1. Business Requirement &amp;amp; Constraint&lt;/h2>
&lt;p>Ví điện tử Việt Nam: nạp/rút qua ngân hàng, chuyển tiền P2P, thanh toán QR tại quầy. Ràng buộc đặc thù không case nào trước có: &lt;strong>pháp lý là kiến trúc sư trưởng vô hình&lt;/strong> — giấy phép trung gian thanh toán của NHNN, đối soát bắt buộc với ngân hàng đối tác, audit trail nhiều năm, dữ liệu tại Việt Nam (&lt;a href="https://thanhhv.github.io/series/system-design/01-foundations/01-requirements/">1.1 §3.2&lt;/a>). Sai lệch tiền không phải bug — là sự kiện phải báo cáo. Team 20 dev, trong đó có compliance officer ngồi &lt;em>trong&lt;/em> các design review — một vị trí nói lên tất cả.&lt;/p></description></item><item><title>14.4. Notification System — fan-out đa kênh qua những bên không tin được</title><link>https://thanhhv.github.io/series/system-design/14-case-studies/04-notification-system/</link><pubDate>Mon, 13 Jul 2026 17:50:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/14-case-studies/04-notification-system/</guid><description>&lt;blockquote>
&lt;p>Bài toán định hình: hệ thống &lt;strong>không sở hữu chặng cuối&lt;/strong> — mọi kênh giao (APNs/FCM, SMS, email, Zalo ZNS) đều là bên thứ ba với rate limit, sự cố và hóa đơn của họ. Notification system là bài tổng hợp đẹp nhất của &lt;a href="https://thanhhv.github.io/series/system-design/06-communication/00-tong-quan/">Phần 6&lt;/a> và &lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/03-messaging-failures/">13.3/13.5&lt;/a>.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-business-requirement--constraint">1. Business Requirement &amp;amp; Constraint&lt;/h2>
&lt;p>VietShop (&lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/00-tong-quan/">Phần 12&lt;/a>) đến lúc cần một &lt;strong>nền tảng thông báo dùng chung&lt;/strong>: trước giờ mỗi team tự gửi (order gửi email kiểu này, marketing bắn push kiểu kia) — kết quả là user nhận 14 thông báo/ngày, không tắt được thứ mình ghét, và một chiến dịch marketing từng làm nghẽn luôn đường OTP. Bài toán thật: &lt;strong>gom mọi thông báo về một cửa, có luật&lt;/strong> — ưu tiên, tần suất, sở thích user — và gửi tin cậy qua các kênh không tin được. Team 5 dev, phục vụ 15 team nội bộ như khách hàng.&lt;/p></description></item><item><title>14.3. Chat Application — triệu kết nối sống</title><link>https://thanhhv.github.io/series/system-design/14-case-studies/03-chat-application/</link><pubDate>Mon, 13 Jul 2026 17:40:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/14-case-studies/03-chat-application/</guid><description>&lt;blockquote>
&lt;p>Bài toán định hình: &lt;strong>connection dài là state không dọn đi được&lt;/strong> — chat là nơi nguyên tắc &amp;ldquo;stateless hóa tầng app&amp;rdquo; (&lt;a href="https://thanhhv.github.io/series/system-design/02-scalability/01-vertical-horizontal-scaling/">2.1&lt;/a>) gặp giới hạn của nó, và phải thiết kế &lt;em>có&lt;/em> state một cách kỷ luật.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-business-requirement--constraint">1. Business Requirement &amp;amp; Constraint&lt;/h2>
&lt;p>Nền tảng chat cho thương mại (người mua ↔ shop, như chat của sàn TMĐT): hỏi hàng, trả giá, chăm sóc sau bán. Chat tốt = chốt đơn — độ trễ và độ tin của tin nhắn ảnh hưởng trực tiếp GMV. 2M user, 100K shop; team 6 dev. Ràng buộc đặc thù: shop dùng &lt;strong>nhiều thiết bị đồng thời&lt;/strong> (app + web + nhân viên chung tài khoản), lịch sử chat là hồ sơ giao dịch — &lt;strong>không được mất&lt;/strong>.&lt;/p></description></item><item><title>14.2. Social Network — fan-out và celebrity problem</title><link>https://thanhhv.github.io/series/system-design/14-case-studies/02-social-network/</link><pubDate>Mon, 13 Jul 2026 17:30:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/14-case-studies/02-social-network/</guid><description>&lt;blockquote>
&lt;p>Bài toán định hình: &lt;strong>một hành động của một người phải đến với N người theo dõi&lt;/strong> — và N trải từ 3 đến 10 triệu trên cùng một hệ thống. Không có phân bố nào lệch hơn thế trong toàn bộ tài liệu này.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-business-requirement--constraint">1. Business Requirement &amp;amp; Constraint&lt;/h2>
&lt;p>Mạng xã hội theo sở thích (cộng đồng thể thao/ẩm thực) tại Việt Nam: user đăng bài, theo dõi nhau, xem &lt;strong>feed&lt;/strong> — dòng nội dung từ những người mình theo. Doanh thu: quảng cáo trong feed → &lt;strong>feed là sản phẩm&lt;/strong>; nghẽn feed = nghẽn doanh thu. Team 8 dev, đã có 200K user sau viral, đang tăng 30%/tháng — bài toán không phải &amp;ldquo;thiết kế từ zero&amp;rdquo; mà là &amp;ldquo;monolith hiện tại bắt đầu oằn ở đâu&amp;rdquo;.&lt;/p></description></item><item><title>14.1. URL Shortener — bài tập khởi động hoàn hảo</title><link>https://thanhhv.github.io/series/system-design/14-case-studies/01-url-shortener/</link><pubDate>Mon, 13 Jul 2026 17:20:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/14-case-studies/01-url-shortener/</guid><description>&lt;blockquote>
&lt;p>Bài &amp;ldquo;nhỏ mà thâm&amp;rdquo;: đủ đơn giản để đi trọn chuỗi tư duy trong một chương, đủ sâu để lộ ra các quyết định thật. Đọc chương này như một bài tập mẫu về &lt;strong>cách áp dụng &lt;a href="https://thanhhv.github.io/series/system-design/00-tu-duy-thiet-ke/">chương 00&lt;/a>&lt;/strong> — giá trị nằm ở trình tự ra quyết định, không ở sơ đồ cuối.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-business-requirement--constraint">1. Business Requirement &amp;amp; Constraint&lt;/h2>
&lt;p>Công ty martech Việt Nam cần rút gọn link cho các chiến dịch SMS/social của khách hàng doanh nghiệp: link ngắn tiết kiệm ký tự SMS, đo được lượt bấm, gắn được nhãn chiến dịch. Ràng buộc: team 2 dev, ra mắt trong 6 tuần, chi phí hạ tầng &amp;lt; $200/tháng năm đầu. Doanh thu đến từ gói SaaS theo số link + analytics — nghĩa là &lt;strong>đếm click là tính năng ăn tiền, không phải phụ kiện&lt;/strong>.&lt;/p></description></item><item><title>Phần 14 — Case Studies</title><link>https://thanhhv.github.io/series/system-design/14-case-studies/00-tong-quan/</link><pubDate>Mon, 13 Jul 2026 17:10:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/14-case-studies/00-tong-quan/</guid><description>&lt;h2 id="mục-lục">Mục lục&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/14-case-studies/01-url-shortener/">14.1. URL Shortener — bài tập khởi động hoàn hảo&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/14-case-studies/02-social-network/">14.2. Social Network — fan-out và celebrity problem&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/14-case-studies/03-chat-application/">14.3. Chat Application — triệu kết nối sống&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/14-case-studies/04-notification-system/">14.4. Notification System — fan-out đa kênh qua những bên không tin được&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/14-case-studies/05-banking-fintech/">14.5. Banking &amp;amp; FinTech — khi sai một đồng là sai tất cả&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/14-case-studies/06-video-streaming/">14.6. Video Streaming — băng thông là kiến trúc&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/14-case-studies/07-ride-hailing/">14.7. Ride Hailing — geo real-time và dữ liệu phù du&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/14-case-studies/08-saas-platform/">14.8. SaaS Platform — multi-tenancy và noisy neighbor&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/14-case-studies/09-ai-platform/">14.9. AI Platform — GPU đắt và hai chế độ phục vụ&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/14-case-studies/10-search-system/">14.10. Search System — Phần 9 trong hành động&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;em>(E-commerce — case lớn nhất — là toàn bộ &lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/00-tong-quan/">Phần 12&lt;/a>; Search System đóng vai case tổng hợp của &lt;a href="https://thanhhv.github.io/series/system-design/09-search/00-tong-quan/">Phần 9&lt;/a>.)&lt;/em>&lt;/p></description></item><item><title>13.5. Infrastructure Failures</title><link>https://thanhhv.github.io/series/system-design/13-production-failure-cases/05-infrastructure-failures/</link><pubDate>Mon, 13 Jul 2026 17:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/13-production-failure-cases/05-infrastructure-failures/</guid><description>&lt;blockquote>
&lt;p>Năm tình huống: GC Pause, Out of Memory, DNS Failure, Region Outage, Third-party API Down. Nhóm này nhắc một sự thật hay bị quên: dưới mọi kiến trúc đẹp là máy thật, mạng thật, và những công ty khác — tất cả đều hỏng theo lịch của riêng chúng.&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="case-17--gc-pause">Case 17 — GC Pause&lt;/h2>
&lt;h3 id="triệu-chứng">Triệu chứng&lt;/h3>
&lt;p>Latency p99/p999 có &lt;strong>răng cưa chu kỳ&lt;/strong> trong khi p50 đẹp; service &amp;ldquo;đứng hình&amp;rdquo; 0.5–30 giây rồi sống lại như chưa có gì; hệ quả dây chuyền đặc trưng: bị văng khỏi consumer group (rebalance), mất leadership (không kịp gia hạn lease), health check fail → bị restart oan — node &lt;em>sống&lt;/em> nhưng bị cả cụm đối xử như &lt;em>chết&lt;/em> trong đúng khoảng pause (&lt;a href="https://thanhhv.github.io/series/system-design/04-distributed-systems/04-clock-partition-split-brain/">chương 4.4&lt;/a> — &amp;ldquo;chậm-như-đứt&amp;rdquo;).&lt;/p></description></item><item><title>13.4. Distributed Failures</title><link>https://thanhhv.github.io/series/system-design/13-production-failure-cases/04-distributed-failures/</link><pubDate>Mon, 13 Jul 2026 16:50:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/13-production-failure-cases/04-distributed-failures/</guid><description>&lt;blockquote>
&lt;p>Ba tình huống: Cascading Failure, Split Brain, Leader Election Failure. Đây là các sự cố &amp;ldquo;cấp hệ thống&amp;rdquo; — không thành phần nào hỏng nặng, nhưng tương tác giữa chúng giết cả hệ thống. Nền lý thuyết: &lt;a href="https://thanhhv.github.io/series/system-design/04-distributed-systems/01-cap-pacelc/">Phần 4&lt;/a>.&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="case-14--cascading-failure">Case 14 — Cascading Failure&lt;/h2>
&lt;h3 id="triệu-chứng">Triệu chứng&lt;/h3>
&lt;p>Bắt đầu bằng một sự cố &lt;em>nhỏ, cục bộ&lt;/em> (một service chậm, một node chết, một deploy xấu) → lan như domino: service A chậm → upstream B cạn thread chờ A → B chậm → C cạn theo&amp;hellip; → trong 5–15 phút, &lt;strong>toàn hệ thống đỏ&lt;/strong>, kể cả những service không liên quan gì đến điểm khởi phát. Dashboard nhìn đâu cũng cháy — chính điều đó làm mất phương hướng.&lt;/p></description></item><item><title>13.3. Messaging Failures</title><link>https://thanhhv.github.io/series/system-design/13-production-failure-cases/03-messaging-failures/</link><pubDate>Mon, 13 Jul 2026 16:40:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/13-production-failure-cases/03-messaging-failures/</guid><description>&lt;blockquote>
&lt;p>Bốn tình huống: Kafka Lag, Message Duplication, Queue Backlog, Retry Storm. Hệ messaging đổi &amp;ldquo;fail ngay trước mặt&amp;rdquo; lấy &amp;ldquo;fail âm thầm phía sau&amp;rdquo; — sự cố của nó vì thế thường được phát hiện muộn, khi backlog đã thành núi.&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="case-10--kafka-lag-consumer-lag">Case 10 — Kafka Lag (Consumer Lag)&lt;/h2>
&lt;h3 id="triệu-chứng">Triệu chứng&lt;/h3>
&lt;p>Dữ liệu downstream &amp;ldquo;cũ dần&amp;rdquo;: dashboard analytics trễ 40 phút, projection CQRS lệch nguồn sự thật, email gửi sau sự kiện 2 giờ. Metric &lt;code>consumer group lag&lt;/code> tăng — quan trọng nhất là &lt;strong>tăng đơn điệu không hồi&lt;/strong>.&lt;/p></description></item><item><title>13.2. Database Failures</title><link>https://thanhhv.github.io/series/system-design/13-production-failure-cases/02-database-failures/</link><pubDate>Mon, 13 Jul 2026 16:30:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/13-production-failure-cases/02-database-failures/</guid><description>&lt;blockquote>
&lt;p>Sáu tình huống: Database Hotspot, N+1 Query, Deadlock, Replica Lag, Connection Pool Exhaustion, Hot Partition. Database là nơi bottleneck ghé thăm thường xuyên nhất (&lt;a href="https://thanhhv.github.io/series/system-design/01-foundations/05-bottleneck-analysis/">chương 1.5&lt;/a>) — và cũng là nơi sự cố khó scale-out thoát thân nhất.&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="case-4--database-hotspot">Case 4 — Database Hotspot&lt;/h2>
&lt;h3 id="triệu-chứng">Triệu chứng&lt;/h3>
&lt;p>DB tổng thể &amp;ldquo;khỏe&amp;rdquo; (CPU trung bình 40%) nhưng một nhóm thao tác cụ thể chậm bất thường; lock wait tăng; các query chạm vào &lt;em>một hàng/một trang&lt;/em> cụ thể xếp hàng dài.&lt;/p></description></item><item><title>13.1. Caching Failures</title><link>https://thanhhv.github.io/series/system-design/13-production-failure-cases/01-caching-failures/</link><pubDate>Mon, 13 Jul 2026 16:20:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/13-production-failure-cases/01-caching-failures/</guid><description>&lt;blockquote>
&lt;p>Ba tình huống anh em: Cache Stampede, Cache Avalanche, Thundering Herd. Chung một mô hình gốc — &lt;strong>đồng bộ hóa ngẫu nhiên + khuếch đại&lt;/strong> — khác nhau ở phạm vi và ngòi nổ.&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="case-1--cache-stampede-dogpile-trên-một-key-nóng">Case 1 — Cache Stampede (dogpile trên MỘT key nóng)&lt;/h2>
&lt;h3 id="triệu-chứng">Triệu chứng&lt;/h3>
&lt;p>Hệ thống êm ả, rồi đúng một khoảnh khắc: DB CPU dựng đứng trong vài giây, latency một nhóm endpoint tăng vọt, sau đó &lt;em>có thể&lt;/em> tự hồi phục — lặp lại theo chu kỳ đúng bằng TTL của một key nào đó. Trong slow query log: hàng trăm bản sao &lt;em>của cùng một query&lt;/em> trong cùng một giây.&lt;/p></description></item><item><title>Phần 13 — Production Failure Cases</title><link>https://thanhhv.github.io/series/system-design/13-production-failure-cases/00-tong-quan/</link><pubDate>Mon, 13 Jul 2026 16:10:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/13-production-failure-cases/00-tong-quan/</guid><description>&lt;blockquote>
&lt;p>21 tình huống sự cố production kinh điển. Mục tiêu không phải ghi nhớ từng ca — mà là nhận ra &lt;strong>các mô hình lặp lại&lt;/strong> để khi gặp biến thể thứ 22, bạn đã có phản xạ đúng.&lt;/p>&lt;/blockquote>
&lt;h2 id="cấu-trúc-phân-tích-mỗi-tình-huống">Cấu trúc phân tích mỗi tình huống&lt;/h2>
&lt;p>Mỗi failure case được phân tích theo khung 10 điểm:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Triệu chứng&lt;/strong> — những gì dashboard/user cho thấy&lt;/li>
&lt;li>&lt;strong>Root cause&lt;/strong> — nguyên nhân gốc&lt;/li>
&lt;li>&lt;strong>Tại sao xảy ra&lt;/strong> — cơ chế vật lý/logic đằng sau&lt;/li>
&lt;li>&lt;strong>Kiến trúc nào bị ảnh hưởng&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Metric cần theo dõi&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Dashboard&lt;/strong> — nhìn gì&lt;/li>
&lt;li>&lt;strong>Alert&lt;/strong> — ngưỡng nào&lt;/li>
&lt;li>&lt;strong>Quy trình điều tra&lt;/strong> — làm gì, theo thứ tự nào&lt;/li>
&lt;li>&lt;strong>Cách khắc phục&lt;/strong> — cầm máu ngay + chữa gốc&lt;/li>
&lt;li>&lt;strong>Cách phòng tránh&lt;/strong>&lt;/li>
&lt;/ol>
&lt;h2 id="danh-mục">Danh mục&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Nhóm&lt;/th>
&lt;th>File&lt;/th>
&lt;th>Các case&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Caching&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/01-caching-failures/">13.1&lt;/a>&lt;/td>
&lt;td>Cache Stampede · Cache Avalanche · Thundering Herd&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Database&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/02-database-failures/">13.2&lt;/a>&lt;/td>
&lt;td>Database Hotspot · N+1 Query · Deadlock · Replica Lag · Connection Pool Exhaustion · Hot Partition&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Messaging&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/03-messaging-failures/">13.3&lt;/a>&lt;/td>
&lt;td>Kafka Lag · Message Duplication · Queue Backlog · Retry Storm&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Distributed&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/04-distributed-failures/">13.4&lt;/a>&lt;/td>
&lt;td>Cascading Failure · Split Brain · Leader Election Failure&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Infrastructure&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/05-infrastructure-failures/">13.5&lt;/a>&lt;/td>
&lt;td>GC Pause · Out of Memory · DNS Failure · Region Outage · Third-party API Down&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="bốn-mô-hình-gốc-đằng-sau-21-tình-huống">Bốn mô hình gốc đằng sau 21 tình huống&lt;/h2>
&lt;p>Đọc xong cả phần, bạn sẽ thấy hầu hết sự cố quy về bốn cơ chế:&lt;/p></description></item><item><title>Giai đoạn 10 — Disaster Recovery</title><link>https://thanhhv.github.io/series/system-design/12-evolution/10-disaster-recovery/</link><pubDate>Mon, 13 Jul 2026 16:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/12-evolution/10-disaster-recovery/</guid><description>&lt;h2 id="1-vấn-đề-gì-xuất-hiện">1. Vấn đề gì xuất hiện?&lt;/h2>
&lt;p>VietShop giờ xử lý GMV mà mỗi giờ downtime = tiền tỷ + tổn hại thương hiệu + điều khoản phạt hợp đồng enterprise. Câu hỏi chuyển từ &amp;ldquo;làm sao để không sập&amp;rdquo; (không thể đảm bảo tuyệt đối) sang: &lt;strong>&amp;ldquo;khi thảm họa xảy ra, chúng ta quay lại trong bao lâu, mất bao nhiêu dữ liệu, và ai làm gì?&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>Thảm họa ở đây không chỉ là region cloud sập. Thống kê ngành nhiều năm cho thấy các nguyên nhân &lt;em>thường gặp hơn&lt;/em>: kỹ sư chạy nhầm lệnh xóa trên production, migration hỏng dữ liệu âm thầm suốt 3 ngày, ransomware, tài khoản cloud bị khóa/xâm nhập, bug ứng dụng ghi rác lan qua replication. Lưu ý điểm chung: &lt;strong>replication không cứu được bất kỳ ca nào trong số đó&lt;/strong> — nó trung thành nhân bản cả thảm họa.&lt;/p></description></item><item><title>Giai đoạn 9 — Multi-region</title><link>https://thanhhv.github.io/series/system-design/12-evolution/09-multi-region/</link><pubDate>Mon, 13 Jul 2026 15:50:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/12-evolution/09-multi-region/</guid><description>&lt;h2 id="1-vấn-đề-gì-xuất-hiện">1. Vấn đề gì xuất hiện?&lt;/h2>
&lt;p>VietShop mở thị trường Indonesia và Thái Lan; đồng thời ký hợp đồng enterprise có cam kết availability cao. Ba áp lực:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Vật lý:&lt;/strong> user Jakarta gọi API đặt tại VN/Singapore: mỗi round-trip +30–70ms; một trang cần 5 round-trip là +350ms — conversion giảm đo được theo từng 100ms.&lt;/li>
&lt;li>&lt;strong>Pháp lý:&lt;/strong> một số loại dữ liệu người dùng Indonesia phải lưu tại Indonesia. Không phải bài toán hiệu năng — bài toán &lt;em>ranh giới dữ liệu&lt;/em>.&lt;/li>
&lt;li>&lt;strong>Rủi ro tập trung:&lt;/strong> sự cố lớn của một cloud region (đã từng xảy ra với mọi cloud lớn) = 100% hệ thống chết. Board hỏi câu không né được: &amp;ldquo;nếu region Singapore sập một ngày thì sao?&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;h2 id="2-vì-sao-kiến-trúc-cũ-không-còn-phù-hợp">2. Vì sao kiến trúc cũ không còn phù hợp?&lt;/h2>
&lt;p>Kiến trúc một region đứng trên giả định &amp;ldquo;mọi thành phần gần nhau, round-trip ~0.5ms&amp;rdquo; — giả định thấm vào mọi thiết kế: sync replication rẻ, gọi chéo service thoải mái, một nguồn sự thật cho mọi dữ liệu. Bước ra đa region, tốc độ ánh sáng đập vỡ giả định đó: &lt;strong>không thể có đồng thời (1) ghi latency thấp ở mọi region, (2) strong consistency toàn cầu, (3) sống sót khi mất một region&lt;/strong> — đây là PACELC (&lt;a href="https://thanhhv.github.io/series/system-design/04-distributed-systems/01-cap-pacelc/">chương 4.1&lt;/a>) hiện hình bằng tiền và mili-giây. Multi-region không phải &amp;ldquo;nhân đôi hạ tầng&amp;rdquo; — nó là &lt;strong>chọn lại vị trí trên tam giác đó cho từng loại dữ liệu&lt;/strong>.&lt;/p></description></item><item><title>Giai đoạn 8 — CQRS</title><link>https://thanhhv.github.io/series/system-design/12-evolution/08-cqrs/</link><pubDate>Mon, 13 Jul 2026 15:40:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/12-evolution/08-cqrs/</guid><description>&lt;h2 id="1-vấn-đề-gì-xuất-hiện">1. Vấn đề gì xuất hiện?&lt;/h2>
&lt;ul>
&lt;li>Seller dashboard (&amp;ldquo;doanh thu hôm nay, top sản phẩm, đơn chờ xử lý&amp;rdquo;) join 9 bảng, chạy 3 giây, và &lt;strong>chạy trên cùng DB đang phục vụ checkout&lt;/strong> — mỗi lần seller F5, khách mua hàng chậm đi.&lt;/li>
&lt;li>Search + filter đa chiều (giá, đánh giá, khoảng cách, khuyến mãi) là loại query mà B-tree index của OLTP không bao giờ phục vụ tốt.&lt;/li>
&lt;li>Cùng một dữ liệu đơn hàng, giờ có 4 &amp;ldquo;hình dạng đọc&amp;rdquo; khác nhau: chi tiết đơn cho user, dashboard cho seller, phân tích cho ops, feature cho ML. Một schema chuẩn hóa không thể tối ưu cho cả 4 — chuẩn hóa vốn được thiết kế để tối ưu cho &lt;strong>ghi đúng&lt;/strong>, không phải cho &lt;strong>đọc nhanh&lt;/strong>.&lt;/li>
&lt;li>Tỷ lệ đọc:ghi đo được trên các luồng này: &amp;gt; 100:1.&lt;/li>
&lt;/ul>
&lt;h2 id="2-vì-sao-kiến-trúc-cũ-không-còn-phù-hợp">2. Vì sao kiến trúc cũ không còn phù hợp?&lt;/h2>
&lt;p>Một model duy nhất phục vụ hai ông chủ có yêu cầu ngược nhau: bên ghi cần chuẩn hóa, constraint, transaction, ít index (index làm chậm ghi); bên đọc cần denormalize, nhiều index, cấu trúc theo đúng hình dạng màn hình. Tối ưu cho bên này là làm hại bên kia — trên cùng một schema, cuộc giằng co này không có lời giải, chỉ có thỏa hiệp ngày càng tệ ở cả hai phía.&lt;/p></description></item><item><title>Giai đoạn 7 — Kafka &amp; Event-driven Architecture</title><link>https://thanhhv.github.io/series/system-design/12-evolution/07-kafka-event-driven/</link><pubDate>Mon, 13 Jul 2026 15:30:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/12-evolution/07-kafka-event-driven/</guid><description>&lt;h2 id="1-vấn-đề-gì-xuất-hiện">1. Vấn đề gì xuất hiện?&lt;/h2>
&lt;p>Sau 1 năm microservices, một dạng coupling mới mọc lên — &lt;strong>coupling tích hợp&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>Khi đơn hàng được tạo, Order service phải &lt;em>biết và gọi&lt;/em>: Email, Inventory, Analytics, Loyalty, Fraud, Recommendation. Thêm consumer thứ 7 = sửa code + deploy Order service. Producer lệ thuộc vào danh sách người nghe — ngược đời.&lt;/li>
&lt;li>Availability của &amp;ldquo;tạo đơn&amp;rdquo; = tích availability của 6 downstream (hoặc code retry/degrade cho từng cái, ×6).&lt;/li>
&lt;li>Team Analytics muốn &lt;em>đi lại lịch sử&lt;/em> đơn hàng để tính lại metric — không thể: các lời gọi HTTP đã bay hơi, dữ liệu chỉ còn trạng thái cuối trong DB.&lt;/li>
&lt;li>RabbitMQ hiện tại: message tiêu thụ xong là biến mất — không phục vụ được nhu cầu &amp;ldquo;nhiều consumer độc lập, mỗi bên đọc theo nhịp riêng, replay được&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;h2 id="2-vì-sao-kiến-trúc-cũ-không-còn-phù-hợp">2. Vì sao kiến trúc cũ không còn phù hợp?&lt;/h2>
&lt;p>Mô hình &amp;ldquo;A gọi B&amp;rdquo; (dù sync HTTP hay qua work queue) mã hóa cứng &lt;strong>ai cần biết điều gì&lt;/strong> vào producer. Số tuyến tích hợp tăng như N×M. First principles: sự kiện nghiệp vụ (&amp;ldquo;đơn #123 đã tạo&amp;rdquo;) là một &lt;strong>sự thật&lt;/strong> — sự thật nên được &lt;em>công bố một lần&lt;/em> và ai quan tâm thì &lt;em>tự đến đọc&lt;/em>, thay vì được &lt;em>giao tận tay&lt;/em> từng người. Đảo ngược hướng phụ thuộc: producer không biết consumer tồn tại.&lt;/p></description></item><item><title>Giai đoạn 6 — Tách Microservices</title><link>https://thanhhv.github.io/series/system-design/12-evolution/06-microservices/</link><pubDate>Mon, 13 Jul 2026 15:20:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/12-evolution/06-microservices/</guid><description>&lt;h2 id="1-vấn-đề-gì-xuất-hiện">1. Vấn đề gì xuất hiện?&lt;/h2>
&lt;p>VietShop: 1M+ user, 60 dev / 8 team, modular monolith kỷ luật tốt. Ba áp lực mới mà &amp;ldquo;một deployable&amp;rdquo; không giải được:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Nhịp deploy xung đột:&lt;/strong> team Search muốn deploy 5 lần/ngày để tune ranking; team Payments bị ràng buộc quy trình kiểm soát thay đổi nghiêm ngặt. Chung một deployable = Search bị Payments ghìm, Payments bị Search làm rủi ro.&lt;/li>
&lt;li>&lt;strong>Nhu cầu tài nguyên xung đột:&lt;/strong> Search cần máy RAM lớn + Elasticsearch; xử lý ảnh cần CPU; API thường cần nhiều instance nhỏ. Một deployable = mọi instance mang mọi thứ.&lt;/li>
&lt;li>&lt;strong>Bán kính sự cố chung:&lt;/strong> memory leak ở module khuyến mãi làm OOM cả app — gồm cả checkout. Một bug của team này đánh sập doanh thu của mọi team.&lt;/li>
&lt;/ul>
&lt;h2 id="2-vì-sao-kiến-trúc-cũ-không-còn-phù-hợp">2. Vì sao kiến trúc cũ không còn phù hợp?&lt;/h2>
&lt;p>Modular monolith đã giải bài toán &lt;em>ranh giới code&lt;/em> nhưng ba tài nguyên vẫn dùng chung không tách được: &lt;strong>tiến trình runtime&lt;/strong> (crash chung, GC chung, leak chung), &lt;strong>pipeline deploy&lt;/strong> (nhịp chung, rollback chung), &lt;strong>cụm hạ tầng&lt;/strong> (shape máy chung). Khi các module cần khác nhau &lt;em>về runtime, nhịp deploy, hình dạng hạ tầng&lt;/em> — chỉ tách tiến trình mới giải được. Đó chính xác là (và chỉ là) điều microservices mang lại: &lt;strong>ranh giới deploy độc lập&lt;/strong>.&lt;/p></description></item><item><title>Giai đoạn 5 — Modular Monolith</title><link>https://thanhhv.github.io/series/system-design/12-evolution/05-modular-monolith/</link><pubDate>Mon, 13 Jul 2026 15:10:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/12-evolution/05-modular-monolith/</guid><description>&lt;h2 id="1-vấn-đề-gì-xuất-hiện">1. Vấn đề gì xuất hiện?&lt;/h2>
&lt;p>Công ty 25 dev, 4 nhóm tính năng. Hệ thống &lt;em>chạy&lt;/em> ổn — vấn đề nằm ở việc &lt;em>phát triển&lt;/em> nó:&lt;/p>
&lt;ul>
&lt;li>Build + test 25 phút; deploy 2 lần/tuần theo &amp;ldquo;chuyến tàu&amp;rdquo;, ai lỡ thì chờ.&lt;/li>
&lt;li>Thay đổi module khuyến mãi làm gãy checkout — vì code checkout &lt;code>import&lt;/code> thẳng vào class nội bộ của khuyến mãi từ 2 năm trước.&lt;/li>
&lt;li>Không ai dám nói &amp;ldquo;tôi hiểu toàn bộ hệ thống&amp;rdquo;. Onboarding dev mới: 2 tháng.&lt;/li>
&lt;li>Ranh giới thư mục từ giai đoạn 1 đã xói mòn: 400 điểm import chéo giữa các &amp;ldquo;module&amp;rdquo;, 60 bảng DB mà module nào cũng đọc của nhau.&lt;/li>
&lt;/ul>
&lt;p>Bottleneck bây giờ là &lt;strong>coupling&lt;/strong> — đo bằng tốc độ ra feature và tỷ lệ regression liên-module, không phải bằng CPU.&lt;/p></description></item><item><title>Giai đoạn 4 — Thêm Message Queue</title><link>https://thanhhv.github.io/series/system-design/12-evolution/04-message-queue/</link><pubDate>Mon, 13 Jul 2026 15:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/12-evolution/04-message-queue/</guid><description>&lt;h2 id="1-vấn-đề-gì-xuất-hiện">1. Vấn đề gì xuất hiện?&lt;/h2>
&lt;p>~200K user, GMV bắt đầu có ý nghĩa, flash sale đầu tiên sắp chạy. Ba vấn đề với queue-trên-Redis hiện tại:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Đảm bảo mỏng manh:&lt;/strong> một sự cố Redis đã làm mất ~2000 job trong 30 giây, trong đó có job cập nhật trạng thái thanh toán — team mất 2 ngày đối soát tay với cổng thanh toán.&lt;/li>
&lt;li>&lt;strong>Thiếu công cụ xử lý lỗi trưởng thành:&lt;/strong> job fail 5 lần thì đi đâu? Ai xem? Retry với backoff + dead letter + đánh chỉ mục lỗi phải tự chế.&lt;/li>
&lt;li>&lt;strong>Flash sale sắp tới:&lt;/strong> ước 10× peak vào endpoint đặt hàng trong 5 phút. Web + DB không nên (và không cần) được scale cho đỉnh 5 phút đó — cần một tầng &lt;strong>hấp thụ&lt;/strong> spike và cho phép xử lý với tốc độ của hệ thống.&lt;/li>
&lt;/ul>
&lt;h2 id="2-vì-sao-kiến-trúc-cũ-không-còn-phù-hợp">2. Vì sao kiến trúc cũ không còn phù hợp?&lt;/h2>
&lt;p>Redis-queue là cache được nhờ vả làm broker. Nó thiếu các thuộc tính mà bài toán mới đòi: &lt;strong>durability có cam kết&lt;/strong> (ghi disk, replicate trước khi ack), &lt;strong>acknowledgement chuẩn&lt;/strong> (consumer chết giữa chừng → message quay lại queue), &lt;strong>dead letter queue&lt;/strong>, routing, priority, và backpressure rõ ràng. Vá từng thiếu hụt bằng code tự chế = tự viết một message broker tồi.&lt;/p></description></item><item><title>Giai đoạn 3 — Tách Background Worker</title><link>https://thanhhv.github.io/series/system-design/12-evolution/03-background-worker/</link><pubDate>Mon, 13 Jul 2026 14:50:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/12-evolution/03-background-worker/</guid><description>&lt;h2 id="1-vấn-đề-gì-xuất-hiện">1. Vấn đề gì xuất hiện?&lt;/h2>
&lt;p>~100K user. Triệu chứng:&lt;/p>
&lt;ul>
&lt;li>Endpoint đặt hàng p99 = 4 giây. Tracing bóc ra: logic đơn hàng 150ms, &lt;strong>gửi email xác nhận 800ms, gọi API đối tác vận chuyển 1.2s, bắn thông báo 500ms&lt;/strong> — 2.5s là việc user không cần chờ.&lt;/li>
&lt;li>Upload ảnh sản phẩm của seller treo 8–15 giây (resize 5 kích cỡ trong request).&lt;/li>
&lt;li>Khi SMTP provider chậm (chuyện của họ, không phải của ta), &lt;strong>toàn bộ&lt;/strong> endpoint đặt hàng chậm theo — độ khả dụng của ta bị xích vào bên thứ ba.&lt;/li>
&lt;li>Thread/worker pool của web app cạn vào giờ peak vì bị chiếm bởi các request &amp;ldquo;treo chờ bên ngoài&amp;rdquo; → cả những endpoint nhanh cũng chờ (&lt;a href="https://thanhhv.github.io/series/system-design/01-foundations/03-throughput-latency/">Little&amp;rsquo;s Law, chương 1.3&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h2 id="2-vì-sao-kiến-trúc-cũ-không-còn-phù-hợp">2. Vì sao kiến trúc cũ không còn phù hợp?&lt;/h2>
&lt;p>Kiến trúc cũ trộn hai loại công việc có bản chất khác nhau vào một đường xử lý:&lt;/p></description></item><item><title>Giai đoạn 2 — Thêm Redis</title><link>https://thanhhv.github.io/series/system-design/12-evolution/02-them-redis/</link><pubDate>Mon, 13 Jul 2026 14:40:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/12-evolution/02-them-redis/</guid><description>&lt;h2 id="1-vấn-đề-gì-xuất-hiện">1. Vấn đề gì xuất hiện?&lt;/h2>
&lt;p>VietShop đạt ~50K user, chạy quảng cáo tối. Triệu chứng đo được:&lt;/p>
&lt;ul>
&lt;li>DB CPU 85% vào 20–22h; p99 trang chủ từ 200ms lên 2.5s đúng khung giờ đó.&lt;/li>
&lt;li>&lt;code>pg_stat_statements&lt;/code> chỉ mặt: 70% thời gian DB dành cho &lt;strong>~20 query đọc lặp lại&lt;/strong> — trang chủ, danh mục, top sản phẩm — kết quả gần như không đổi giữa hai lần chạy liên tiếp.&lt;/li>
&lt;li>Tỷ lệ đọc:ghi đo được ~60:1.&lt;/li>
&lt;/ul>
&lt;h2 id="2-vì-sao-kiến-trúc-cũ-không-còn-phù-hợp">2. Vì sao kiến trúc cũ không còn phù hợp?&lt;/h2>
&lt;p>DB đang &lt;strong>tính lại hàng nghìn lần mỗi phút một kết quả không đổi&lt;/strong>. Vấn đề không phải PostgreSQL yếu — vấn đề là dùng công cụ đắt (query engine + disk) cho việc rẻ (nhớ lại một kết quả đã biết). Scale-up DB mua thêm thời gian nhưng đốt tiền vào đúng sự lãng phí đó; thêm read replica cũng vậy (nhân bản sự lãng phí ra N máy). First principles: dữ liệu đọc nhiều-ghi ít-chịu được trễ vài giây thuộc về &lt;strong>RAM&lt;/strong>, nơi truy cập rẻ hơn disk 3 bậc độ lớn.&lt;/p></description></item><item><title>Giai đoạn 1 — Monolith + PostgreSQL</title><link>https://thanhhv.github.io/series/system-design/12-evolution/01-monolith-postgresql/</link><pubDate>Mon, 13 Jul 2026 14:30:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/12-evolution/01-monolith-postgresql/</guid><description>&lt;h2 id="bối-cảnh">Bối cảnh&lt;/h2>
&lt;p>VietShop ngày 0: 3 founder (2 dev), vốn đủ sống 12 tháng, mục tiêu ra thị trường trong 2 tháng. FR: đăng ký/đăng nhập, danh mục sản phẩm, giỏ hàng, đặt hàng COD, quản trị đơn giản. NFR thật sự chỉ có hai: &lt;strong>ra tính năng nhanh&lt;/strong> và &lt;strong>không mất dữ liệu đơn hàng&lt;/strong>.&lt;/p>
&lt;h2 id="1-vấn-đề-cần-giải">1. Vấn đề cần giải&lt;/h2>
&lt;p>Không phải scale — là &lt;strong>tồn tại&lt;/strong>. Xác suất sản phẩm chết vì không có user cao gấp trăm lần chết vì quá nhiều user. Kiến trúc phù hợp là kiến trúc tối đa hóa tốc độ học từ thị trường trên mỗi đồng vốn.&lt;/p></description></item><item><title>Phần 12 — System Design Evolution</title><link>https://thanhhv.github.io/series/system-design/12-evolution/00-tong-quan/</link><pubDate>Mon, 13 Jul 2026 14:20:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/12-evolution/00-tong-quan/</guid><description>&lt;blockquote>
&lt;p>Chương quan trọng nhất của tài liệu. Mọi khái niệm ở các phần trước được đặt vào một câu chuyện duy nhất, kể từ đầu đến cuối.&lt;/p>&lt;/blockquote>
&lt;h2 id="hệ-thống-xuyên-suốt-sàn-e-commerce-vietshop">Hệ thống xuyên suốt: sàn E-commerce &amp;ldquo;VietShop&amp;rdquo;&lt;/h2>
&lt;p>Chúng ta theo chân một sàn thương mại điện tử Việt Nam từ ngày đầu tiên đến khi phục vụ hàng chục triệu người dùng. Chọn e-commerce vì nó chứa đủ các bài toán kinh điển: read-heavy (duyệt sản phẩm), tranh chấp ghi (tồn kho), tiền bạc (không được sai), spike cực đoan (flash sale), tác vụ nền (email, ảnh), tìm kiếm, và báo cáo.&lt;/p></description></item><item><title>11.3. Biên phòng thủ — API Gateway, Rate Limiting, WAF</title><link>https://thanhhv.github.io/series/system-design/11-security/03-gateway-ratelimit-waf/</link><pubDate>Mon, 13 Jul 2026 14:10:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/11-security/03-gateway-ratelimit-waf/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Internet là môi trường thù địch mặc định: bot chiếm phần lớn traffic của nhiều site, credential stuffing chạy 24/7, scraper hút catalog, và thi thoảng một chiến dịch DDoS thật sự. Nếu mỗi service tự xử lý các mối lo này, ta có N bản cài đặt lệch nhau của cùng các phòng thủ (&lt;a href="https://thanhhv.github.io/series/system-design/11-security/01-authn-authz/">11.1 §2 — cùng lý do tập trung AuthN&lt;/a>). Biên (edge) tồn tại để &lt;strong>gom các mối quan tâm cắt ngang về một tuyến phòng thủ có tầng&lt;/strong> — để service phía sau tập trung vào nghiệp vụ, và để &amp;ldquo;một chỗ vá&amp;rdquo; khi có chuyện.&lt;/p></description></item><item><title>11.2. OAuth2, OIDC &amp; JWT — ủy quyền và token trong hệ phân tán</title><link>https://thanhhv.github.io/series/system-design/11-security/02-oauth2-jwt/</link><pubDate>Mon, 13 Jul 2026 14:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/11-security/02-oauth2-jwt/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Ba bài toán token của mọi hệ hiện đại: app bên thứ ba cần truy cập dữ liệu user &lt;em>mà không cầm mật khẩu của user&lt;/em> (ủy quyền — OAuth2); nhiều ứng dụng cần &lt;em>cùng một&lt;/em> đăng nhập (SSO — OIDC); và N service cần xác minh danh tính người gọi &lt;em>mà không gọi về trung tâm mỗi request&lt;/em> (token tự xác minh — JWT). Ba bài, một họ chuẩn — và một bãi mìn thuật ngữ nơi &amp;ldquo;dùng JWT&amp;rdquo; và &amp;ldquo;dùng OAuth&amp;rdquo; bị nói như thể là quyết định một chữ, trong khi mỗi lựa chọn con bên trong (flow nào, token sống bao lâu, thu hồi thế nào) mới là nơi an toàn được quyết định.&lt;/p></description></item><item><title>11.1. Authentication &amp; Authorization — bạn là ai, bạn được làm gì</title><link>https://thanhhv.github.io/series/system-design/11-security/01-authn-authz/</link><pubDate>Mon, 13 Jul 2026 13:50:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/11-security/01-authn-authz/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Mọi request chạm hệ thống phải được trả lời hai câu &lt;strong>khác nhau về bản chất&lt;/strong>: &lt;em>bạn là ai&lt;/em> (Authentication — xác thực danh tính) và &lt;em>bạn được làm gì&lt;/em> (Authorization — kiểm tra quyền). Trộn hai câu này — hoặc trả lời câu hai bằng niềm tin &amp;ldquo;đã qua cửa là được tất&amp;rdquo; — là gốc của lớp lỗ hổng phổ biến và tàn phá nhất trong thực tế: &lt;strong>broken access control&lt;/strong> (nhiều năm liền đứng đầu OWASP Top 10), mà điển hình là IDOR — user A đổi &lt;code>order_id&lt;/code> trên URL và đọc được đơn của user B, vì hệ chỉ hỏi &amp;ldquo;đã đăng nhập chưa&amp;rdquo; mà quên hỏi &amp;ldquo;đơn này &lt;em>của&lt;/em> ai&amp;rdquo;.&lt;/p></description></item><item><title>Phần 11 — Security</title><link>https://thanhhv.github.io/series/system-design/11-security/00-tong-quan/</link><pubDate>Mon, 13 Jul 2026 13:40:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/11-security/00-tong-quan/</guid><description>&lt;blockquote>
&lt;p>Chủ đề: Authentication, Authorization, OAuth2, JWT, Rate Limiting, WAF, API Gateway.&lt;/p>&lt;/blockquote>
&lt;h2 id="luận-điểm-trung-tâm-của-phần-này">Luận điểm trung tâm của phần này&lt;/h2>
&lt;p>Security là &lt;strong>thuộc tính kiến trúc, không phải tính năng gắn sau&lt;/strong> — và giống durability (&lt;a href="https://thanhhv.github.io/series/system-design/01-foundations/01-requirements/">1.1 §9&lt;/a>), lỗi của nó không sửa được bằng refactor: dữ liệu đã rò là đã rò. Ba nguyên tắc gốc chi phối mọi chương:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Defense in depth:&lt;/strong> nhiều lớp, không lớp nào được tin là đủ — kẻ tấn công phải vượt &lt;em>tất cả&lt;/em>, còn bạn chỉ cần &lt;em>một&lt;/em> lớp bắt được.&lt;/li>
&lt;li>&lt;strong>Least privilege:&lt;/strong> mọi thành phần (người, service, token) chỉ có quyền tối thiểu cho việc của nó — blast radius của một credential bị lộ tỷ lệ thuận với quyền nó mang.&lt;/li>
&lt;li>&lt;strong>Không tự chế crypto/auth:&lt;/strong> dùng chuẩn đã được soi (OAuth2/OIDC, JWT ký chuẩn, thư viện đã kiểm toán) — sáng tạo trong security là sáng tạo cách thua.&lt;/li>
&lt;/ol>
&lt;h2 id="mục-lục">Mục lục&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/11-security/01-authn-authz/">11.1. Authentication &amp;amp; Authorization — bạn là ai, bạn được làm gì&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/11-security/02-oauth2-jwt/">11.2. OAuth2, OIDC &amp;amp; JWT — ủy quyền và token trong hệ phân tán&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/11-security/03-gateway-ratelimit-waf/">11.3. Biên phòng thủ — API Gateway, Rate Limiting, WAF&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="bản-đồ-security-trong-toàn-tài-liệu">Bản đồ security trong toàn tài liệu&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Mảnh&lt;/th>
&lt;th>Ở đâu&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Compliance là NFR (Nghị định 13, PCI-DSS)&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/01-foundations/01-requirements/">1.1 §3.2&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Che PII trong log/tín hiệu&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/10-observability/01-ba-tru/">10.1 §3&lt;/a>, &lt;a href="https://thanhhv.github.io/series/system-design/10-observability/02-opentelemetry-pipeline/">10.2 §6&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Backup mã hóa, immutable, chống ransomware&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/03-availability-reliability/02-backup-recovery/">3.2&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ACL cho topic/queue — ai được phát/nghe&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/06-communication/05-kafka/">6.5 §6&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Idempotency chống replay nghiệp vụ&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/03-messaging-failures/">13.3&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Rate limiting như công cụ reliability&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/01-caching-failures/">13.1 — thundering herd&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Phần này đứng ở góc &lt;strong>kiến trúc sư hệ backend&lt;/strong> — identity, token, và biên — không thay thế được chuyên môn AppSec/PenTest; nó bảo đảm phần &lt;em>thiết kế&lt;/em> không tạo ra những lỗ mà không PenTest nào vá nổi.&lt;/p></description></item><item><title>10.3. Dashboard, Alerting &amp; On-call — từ tín hiệu đến con người</title><link>https://thanhhv.github.io/series/system-design/10-observability/03-dashboard-alerting-oncall/</link><pubDate>Mon, 13 Jul 2026 13:30:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/10-observability/03-dashboard-alerting-oncall/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Tín hiệu hoàn hảo (&lt;a href="https://thanhhv.github.io/series/system-design/10-observability/01-ba-tru/">10.1&lt;/a>) chảy qua pipeline chuẩn (&lt;a href="https://thanhhv.github.io/series/system-design/10-observability/02-opentelemetry-pipeline/">10.2&lt;/a>) vẫn chưa cứu được ai — khâu cuối là &lt;strong>con người ra quyết định dưới áp lực lúc 3h sáng&lt;/strong>. Khâu này hỏng theo hai cách đối xứng: alert quá nhiều (người trực tê liệt, tắt thông báo, bỏ lỡ cái thật — &lt;em>alert fatigue&lt;/em> là nguyên nhân gốc của nhiều sự cố kéo dài hơn là thiếu monitoring) và alert quá ít/quá trễ (khách hàng là người phát hiện sự cố). Thiết kế giao diện máy–người này là một bài thiết kế hệ thống đúng nghĩa — có SLO, có failure mode, có evolution.&lt;/p></description></item><item><title>10.2. OpenTelemetry &amp; pipeline tín hiệu — thu, xử lý, lưu, trả tiền</title><link>https://thanhhv.github.io/series/system-design/10-observability/02-opentelemetry-pipeline/</link><pubDate>Mon, 13 Jul 2026 13:20:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/10-observability/02-opentelemetry-pipeline/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Ba trụ (&lt;a href="https://thanhhv.github.io/series/system-design/10-observability/01-ba-tru/">10.1&lt;/a>) sinh ra một dòng dữ liệu khổng lồ chảy liên tục từ mọi process — và ba câu hỏi hạ tầng: &lt;strong>thu bằng chuẩn nào&lt;/strong> (để không viết lại instrumentation khi đổi backend), &lt;strong>vận chuyển và xử lý ở đâu&lt;/strong> (lọc, sample, làm giàu, che nhạy cảm — trước khi trả tiền lưu), &lt;strong>lưu vào đâu với chi phí nào&lt;/strong>. Trả lời tùy hứng ba câu này là cách các công ty tỉnh dậy với hóa đơn observability ngang hóa đơn compute và một mớ agent chồng chéo không ai dám tắt.&lt;/p></description></item><item><title>10.1. Ba trụ — Logging, Metrics, Tracing</title><link>https://thanhhv.github.io/series/system-design/10-observability/01-ba-tru/</link><pubDate>Mon, 13 Jul 2026 13:10:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/10-observability/01-ba-tru/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>2h37 sáng, alert: &amp;ldquo;checkout error budget đang cháy&amp;rdquo;. Người trực cần trả lời ba câu theo thứ tự: &lt;strong>có chuyện gì / ở đâu&lt;/strong> (metrics — 30 giây), &lt;strong>chặng nào trong chuỗi 8 service&lt;/strong> (trace — 2 phút), &lt;strong>chính xác chuyện gì đã xảy ra ở chặng đó&lt;/strong> (logs — 5 phút). Thiếu trụ nào, thời gian ở bước đó nhân 10 — MTTR là hàm trực tiếp của chất lượng ba trụ (&lt;a href="https://thanhhv.github.io/series/system-design/03-availability-reliability/01-ha-failover/">3.1 §5 — MTTR quan trọng hơn MTBF&lt;/a>). Chương này mổ cấu trúc từng trụ và cách chúng &lt;strong>nối vào nhau&lt;/strong> — vì ba trụ rời rạc chỉ là ba đống dữ liệu.&lt;/p></description></item><item><title>Phần 10 — Observability</title><link>https://thanhhv.github.io/series/system-design/10-observability/00-tong-quan/</link><pubDate>Mon, 13 Jul 2026 13:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/10-observability/00-tong-quan/</guid><description>&lt;blockquote>
&lt;p>Chủ đề: Logging, Metrics, Tracing, OpenTelemetry, Dashboard, Alerting.&lt;/p>&lt;/blockquote>
&lt;h2 id="luận-điểm-trung-tâm-của-phần-này">Luận điểm trung tâm của phần này&lt;/h2>
&lt;p>Observability là khả năng &lt;strong>trả lời câu hỏi chưa biết trước&lt;/strong> về hệ thống từ tín hiệu nó phát ra — khác monitoring (canh các câu hỏi đã biết). Trong hệ phân tán, nó không phải tiện nghi mà là điều kiện vận hành: toàn bộ &lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/00-tong-quan/">Phần 13&lt;/a> — mọi mục Metric/Dashboard/Alert/Điều tra — chính là phần này trong hành động.&lt;/p></description></item><item><title>9.3. Lựa chọn công nghệ search — khung quyết định</title><link>https://thanhhv.github.io/series/system-design/09-search/03-lua-chon-cong-nghe/</link><pubDate>Mon, 13 Jul 2026 12:50:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/09-search/03-lua-chon-cong-nghe/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>&amp;ldquo;Cần search&amp;rdquo; không tự động nghĩa là &amp;ldquo;cần Elasticsearch&amp;rdquo;. Phổ lựa chọn trải từ một câu &lt;code>tsvector&lt;/code> trong DB đang có, đến cụm phân tán nhiều node với nghề vận hành riêng — chênh nhau hai bậc độ lớn về chi phí trọn đời. Chọn theo thói quen (&amp;ldquo;ai cũng dùng ES&amp;rdquo;) hoặc theo sợ hãi (&amp;ldquo;PG sao làm search được&amp;rdquo;) đều bỏ qua câu hỏi đúng: &lt;strong>workload này cần gì, và mức khiêm tốn nhất đáp ứng được là gì&lt;/strong> (&lt;a href="https://thanhhv.github.io/series/system-design/05-data-layer/07-so-sanh-lua-chon/">5.7 §2 — cửa kiểm tra câu 3&lt;/a>).&lt;/p></description></item><item><title>9.2. Kiến trúc hệ search hoàn chỉnh — indexing pipeline, query side, vận hành</title><link>https://thanhhv.github.io/series/system-design/09-search/02-search-architecture/</link><pubDate>Mon, 13 Jul 2026 12:40:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/09-search/02-search-architecture/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Engine tốt + analyzer tốt (&lt;a href="https://thanhhv.github.io/series/system-design/09-search/01-full-text-search/">9.1&lt;/a>) chưa thành hệ search: còn phải trả lời — dữ liệu từ nguồn sự thật &lt;em>đến&lt;/em> index bằng đường nào, trễ bao nhiêu, sót thì sao? Autocomplete, facet, filter — mỗi thứ cần cấu trúc gì? Reindex 50 triệu document giữa production như thế nào? Đây là phần &amp;ldquo;hệ thống&amp;rdquo; của search — nơi các bài học outbox, projection, backlog của toàn tài liệu hội tụ vào một use case.&lt;/p></description></item><item><title>9.1. Full-text Search — nguyên lý: inverted index, analyzer, relevance</title><link>https://thanhhv.github.io/series/system-design/09-search/01-full-text-search/</link><pubDate>Mon, 13 Jul 2026 12:30:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/09-search/01-full-text-search/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>User gõ &lt;code>ao khoac nam gia re&lt;/code>; kho có 2 triệu sản phẩm. Yêu cầu: kết quả &lt;em>liên quan&lt;/em> trả trong &amp;lt; 100ms, khớp được dù thiếu dấu, sai chính tả nhẹ, đảo trật tự từ; và &amp;ldquo;liên quan&amp;rdquo; phải gần với &amp;ldquo;thứ user muốn mua&amp;rdquo; chứ không chỉ &amp;ldquo;chuỗi giống nhau&amp;rdquo;. &lt;code>LIKE '%áo khoác%'&lt;/code> thất bại toàn tập: quét toàn bảng (không index nào giúp wildcard hai đầu), yêu cầu khớp &lt;em>chuỗi liên tục&lt;/em> (đảo từ là mất), không hiểu dấu, và không có khái niệm xếp hạng. Cần một cấu trúc dữ liệu và một bộ máy ngôn ngữ sinh ra cho đúng bài này.&lt;/p></description></item><item><title>Phần 9 — Search</title><link>https://thanhhv.github.io/series/system-design/09-search/00-tong-quan/</link><pubDate>Mon, 13 Jul 2026 12:20:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/09-search/00-tong-quan/</guid><description>&lt;blockquote>
&lt;p>Chủ đề: Full-text Search, Elasticsearch, OpenSearch — và kiến trúc của một hệ search hoàn chỉnh.&lt;/p>&lt;/blockquote>
&lt;h2 id="luận-điểm-trung-tâm-của-phần-này">Luận điểm trung tâm của phần này&lt;/h2>
&lt;p>Search tồn tại vì một khoảng trống cấu trúc: B-tree trả lời &amp;ldquo;bằng/trong khoảng&amp;rdquo;, columnar trả lời &amp;ldquo;tổng theo nhóm&amp;rdquo; — không cấu trúc nào trả lời &lt;strong>&amp;ldquo;chứa khái niệm X, xếp theo độ liên quan&amp;rdquo;&lt;/strong> (&lt;a href="https://thanhhv.github.io/series/system-design/05-data-layer/07-so-sanh-lua-chon/">5.7 §1 — bảng quyết định gốc&lt;/a>). Và một sự thật nghiệp vụ: với e-commerce/marketplace/content, &lt;strong>search là cỗ máy doanh thu&lt;/strong> — khác biệt giữa search tốt và tồi đo được bằng conversion, không phải bằng ms.&lt;/p></description></item><item><title>8.3. Resharding &amp; vận hành hệ đã shard</title><link>https://thanhhv.github.io/series/system-design/08-data-partitioning/03-resharding-van-hanh/</link><pubDate>Mon, 13 Jul 2026 12:10:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/08-data-partitioning/03-resharding-van-hanh/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Mọi quyết định sharding đều sai dần theo thời gian: dữ liệu tăng 10× (4 shard thành chật), phân bố lệch dần (một shard 80% đầy trong khi anh em 30%), tenant VIP phình vượt shard của nó, hoặc — đau nhất — &lt;strong>shard key hóa ra chọn sai&lt;/strong> (&lt;a href="https://thanhhv.github.io/series/system-design/08-data-partitioning/01-partitioning-sharding/">8.1 §3.2&lt;/a>). Câu hỏi của chương này: làm sao thay đổi cách chia dữ liệu &lt;strong>trên hệ đang chạy, không downtime, không mất ghi&lt;/strong> — bài toán được xếp vào loại khó nhất của vận hành dữ liệu, và là lý do người ta nói &amp;ldquo;shard key là cam kết hôn nhân&amp;rdquo;.&lt;/p></description></item><item><title>8.2. Consistent Hashing — thêm bớt node mà không xáo cả thế giới</title><link>https://thanhhv.github.io/series/system-design/08-data-partitioning/02-consistent-hashing/</link><pubDate>Mon, 13 Jul 2026 12:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/08-data-partitioning/02-consistent-hashing/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Hash sharding ngây thơ: &lt;code>node = hash(key) mod N&lt;/code>. Đẹp cho đến ngày N đổi. Thêm node thứ 5 vào cụm 4 node: &lt;code>mod 4&lt;/code> → &lt;code>mod 5&lt;/code> — &lt;strong>~80% key đổi chỗ&lt;/strong>. Với cache: 80% miss đồng loạt = tự gây avalanche (&lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/01-caching-failures/">13.1&lt;/a>); với storage: di chuyển 80% dữ liệu qua mạng chỉ để thêm &lt;em>một&lt;/em> máy. Mà thêm/bớt node là chuyện thường kỳ: scale theo tải, node chết, bảo trì. Cần một cách ánh xạ key → node sao cho &lt;strong>N đổi thì chỉ ~1/N key phải dời chỗ&lt;/strong> — mức tối thiểu lý thuyết (dữ liệu &lt;em>phải&lt;/em> sang node mới thì mới có ích).&lt;/p></description></item><item><title>8.1. Partitioning &amp; Sharding — chia dữ liệu và cái giá của shard key</title><link>https://thanhhv.github.io/series/system-design/08-data-partitioning/01-partitioning-sharding/</link><pubDate>Mon, 13 Jul 2026 11:50:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/08-data-partitioning/01-partitioning-sharding/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Bảng &lt;code>orders&lt;/code> của VietShop sau 4 năm: 3TB, 5 tỷ hàng. Ba loại đau cùng lúc: &lt;strong>quản trị&lt;/strong> (backup 6 giờ, tạo index 2 ngày, xóa dữ liệu cũ bằng DELETE là bão bloat — &lt;a href="https://thanhhv.github.io/series/system-design/05-data-layer/01-postgresql/">5.1&lt;/a>); &lt;strong>hiệu năng&lt;/strong> (index sâu hơn, working set vượt RAM, vacuum lê lết); và cuối cùng — &lt;strong>trần vật lý&lt;/strong> (một máy hết cỡ để scale-up, ghi vượt năng lực single-writer — &lt;a href="https://thanhhv.github.io/series/system-design/04-distributed-systems/02-replication-consistency/">4.2&lt;/a>). Ba loại đau, hai lời giải khác cấp độ: partitioning trong node cho hai loại đầu, sharding ra nhiều node cho loại thứ ba. Nhầm cấp độ — sharding khi chỉ cần partition — là mua độ phức tạp lớn nhất trong nghề để chữa bệnh có thuốc rẻ.&lt;/p></description></item><item><title>Phần 8 — Data Partitioning</title><link>https://thanhhv.github.io/series/system-design/08-data-partitioning/00-tong-quan/</link><pubDate>Mon, 13 Jul 2026 11:40:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/08-data-partitioning/00-tong-quan/</guid><description>&lt;blockquote>
&lt;p>Chủ đề: Partitioning, Sharding, Consistent Hashing, phối hợp với Replication — và bài toán khó nhất: resharding hệ đang chạy.&lt;/p>&lt;/blockquote>
&lt;h2 id="luận-điểm-trung-tâm-của-phần-này">Luận điểm trung tâm của phần này&lt;/h2>
&lt;p>Partitioning là câu trả lời cho câu hỏi cuối cùng của scale: &lt;strong>khi một node không chứa nổi / phục vụ nổi toàn bộ dữ liệu thì sao?&lt;/strong> Chia dữ liệu ra N node — nhưng cái giá là mất những gì &amp;ldquo;một node&amp;rdquo; cho không: transaction toàn cục, join tùy tiện, thứ tự toàn cục, và sự đơn giản. Vì thế nguyên tắc số một, nhắc lại từ &lt;a href="https://thanhhv.github.io/series/system-design/01-foundations/05-bottleneck-analysis/">1.5&lt;/a>: &lt;strong>sharding là phương án cuối, sau khi index/cache/replica/scale-up đã hết bài&lt;/strong> — và là phương án gần như không có đường lùi.&lt;/p></description></item><item><title>7.3. Distributed Cache — cache khi một node không đủ</title><link>https://thanhhv.github.io/series/system-design/07-caching/03-distributed-cache/</link><pubDate>Mon, 13 Jul 2026 11:30:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/07-caching/03-distributed-cache/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Một node Redis phục vụ ~100K ops/s và chứa được RAM của một máy (&lt;a href="https://thanhhv.github.io/series/system-design/05-data-layer/04-redis/">5.4&lt;/a>). Hệ lớn vượt cả hai trần: cần triệu ops/s, cần cache working set hàng trăm GB, và cần cache &lt;strong>sống sót khi node chết&lt;/strong> (vì mất cache = avalanche, &lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/01-caching-failures/">13.1&lt;/a> — với hệ hit-rate 95%, cache không còn là &amp;ldquo;tùy chọn hiệu năng&amp;rdquo; mà là thành phần sống còn). Distributed cache = chia key ra nhiều node + nhân bản — và ngay lập tức thừa hưởng mọi bài toán của &lt;a href="https://thanhhv.github.io/series/system-design/04-distributed-systems/01-cap-pacelc/">Phần 4&lt;/a> và &lt;a href="https://thanhhv.github.io/series/system-design/08-data-partitioning/00-tong-quan/">Phần 8&lt;/a>: partition, hot key, rebalance, consistency giữa các tầng.&lt;/p></description></item><item><title>7.2. Cache Invalidation — bài toán khó thứ nhất của khoa học máy tính</title><link>https://thanhhv.github.io/series/system-design/07-caching/02-cache-invalidation/</link><pubDate>Mon, 13 Jul 2026 11:20:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/07-caching/02-cache-invalidation/</guid><description>&lt;blockquote>
&lt;p>&amp;ldquo;There are only two hard things in Computer Science: cache invalidation and naming things.&amp;rdquo; — câu đùa sống lâu vì nó đúng. Chương này giải thích &lt;em>vì sao&lt;/em> nó khó về nguyên lý, và bộ công cụ thực dụng để sống chung.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Nguồn sự thật thay đổi; bản sao trong cache thành nói dối. Câu hỏi: làm bản sao hết nói dối &lt;strong>đúng lúc&lt;/strong> (đủ tươi cho nghiệp vụ) với &lt;strong>chi phí chịu được&lt;/strong> (không biến mỗi thao tác ghi thành chiến dịch truy quét N tầng cache). Hai đầu của phổ đều dễ: không bao giờ invalidate (cache tĩnh vĩnh viễn) và invalidate mọi thứ mỗi lần ghi (tương đương không có cache). Mọi hệ thật nằm giữa — và khoảng giữa là nơi ở của race condition.&lt;/p></description></item><item><title>7.1. Bốn chiến lược cache — ai ghi, ai đọc, ai chịu trách nhiệm</title><link>https://thanhhv.github.io/series/system-design/07-caching/01-cache-strategies/</link><pubDate>Mon, 13 Jul 2026 11:10:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/07-caching/01-cache-strategies/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>&amp;ldquo;Thêm cache&amp;rdquo; nghe như một quyết định — thực ra là bốn quyết định độc lập: khi &lt;strong>miss&lt;/strong> thì ai đi lấy dữ liệu (app hay cache)? Khi &lt;strong>ghi&lt;/strong> thì cache được cập nhật lúc nào (cùng lúc, sau, hay không bao giờ)? Ghi có chờ DB không? Và ai chịu trách nhiệm khi hai bên lệch nhau? Bốn chiến lược kinh điển là bốn tổ hợp câu trả lời — chọn sai tổ hợp cho workload là nguồn của cả bug consistency lẫn hiệu năng tồi.&lt;/p></description></item><item><title>Phần 7 — Caching</title><link>https://thanhhv.github.io/series/system-design/07-caching/00-tong-quan/</link><pubDate>Mon, 13 Jul 2026 11:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/07-caching/00-tong-quan/</guid><description>&lt;blockquote>
&lt;p>Chủ đề: Cache Aside, Read Through, Write Through, Write Back, Cache Invalidation, Distributed Cache.&lt;/p>&lt;/blockquote>
&lt;h2 id="luận-điểm-trung-tâm-của-phần-này">Luận điểm trung tâm của phần này&lt;/h2>
&lt;p>Cache tồn tại vì hai sự thật: RAM nhanh hơn disk ~1000 lần (&lt;a href="https://thanhhv.github.io/series/system-design/00-tu-duy-thiet-ke/">chương 00 §3&lt;/a>), và truy cập dữ liệu có &lt;strong>locality&lt;/strong> — một phần nhỏ dữ liệu nhận phần lớn truy cập (luật lũy thừa, &lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/02-database-failures/">13.2 — hot partition&lt;/a> là mặt tối của cùng quy luật). Không có locality, cache vô dụng; có locality, cache là đòn bẩy hiệu năng rẻ nhất trong toàn bộ hộp đồ nghề.&lt;/p></description></item><item><title>6.8. Outbox Pattern — móng của mọi event đáng tin</title><link>https://thanhhv.github.io/series/system-design/06-communication/08-outbox/</link><pubDate>Mon, 13 Jul 2026 10:50:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/06-communication/08-outbox/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Một thao tác nghiệp vụ cần làm &lt;strong>hai việc trên hai hệ thống&lt;/strong>: ghi trạng thái vào database &lt;em>và&lt;/em> thông báo ra ngoài (publish event lên Kafka, enqueue job, gọi webhook). Code ngây thơ:&lt;/p>
&lt;pre tabindex="0">&lt;code>db.commit(order) // việc 1: thành công
kafka.publish(event) // việc 2: ...crash ở đây thì sao?
&lt;/code>&lt;/pre>&lt;p>Crash giữa hai dòng → &lt;strong>hệ thống nói dối&lt;/strong>: đơn tồn tại trong DB nhưng thế giới không bao giờ biết — không email, không trừ kho, không analytics. Đảo thứ tự thì dối chiều ngược lại: event bay đi cho đơn chưa từng commit. Đây là &lt;strong>dual-write problem&lt;/strong> — và nó không hiếm: nó xảy ra &lt;em>mỗi lần&lt;/em> deploy restart process đúng khoảnh khắc đó, mỗi lần Kafka chập chờn đúng lúc DB đã commit. Không thể fix bằng try/catch hay retry — vấn đề là &lt;strong>hai hệ thống không có transaction chung&lt;/strong>, về nguyên lý (&lt;a href="https://thanhhv.github.io/series/system-design/04-distributed-systems/04-clock-partition-split-brain/">4.4 — không có atomic commit giữa hai hệ tự trị rẻ tiền&lt;/a>).&lt;/p></description></item><item><title>6.7. Saga — transaction khi không còn transaction</title><link>https://thanhhv.github.io/series/system-design/06-communication/07-saga/</link><pubDate>Mon, 13 Jul 2026 10:40:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/06-communication/07-saga/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Đặt hàng chạm ba service, ba database: Orders (tạo đơn), Inventory (trừ kho), Payments (trừ tiền). Trong monolith, đây là một transaction ACID — ba thao tác cùng thành công hoặc cùng biến mất, miễn phí (&lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/01-monolith-postgresql/">12.1&lt;/a>). Tách service xong (&lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/06-microservices/">12.6&lt;/a>), ACID xuyên ranh giới &lt;strong>không còn tồn tại&lt;/strong>: kho trừ rồi, tiền fail — ai trả kho về? Hệ thống kẹt ở trạng thái nửa vời mà không cơ chế nào tự dọn.&lt;/p></description></item><item><title>6.6. Event-driven Architecture — nghĩ bằng sự kiện</title><link>https://thanhhv.github.io/series/system-design/06-communication/06-event-driven/</link><pubDate>Mon, 13 Jul 2026 10:30:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/06-communication/06-event-driven/</guid><description>&lt;blockquote>
&lt;p>Kafka (&lt;a href="https://thanhhv.github.io/series/system-design/06-communication/05-kafka/">6.5&lt;/a>) là công cụ; event-driven là &lt;strong>cách nghĩ&lt;/strong>. Chương này về cách nghĩ — phần khó hơn và ít được dạy hơn.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Hệ nhiều service trưởng thành đối mặt một mâu thuẫn: nghiệp vụ đòi &lt;em>phản ứng dây chuyền&lt;/em> (đơn tạo → trừ kho, cộng điểm, gửi mail, tính hoa hồng, cảnh báo fraud&amp;hellip;) trong khi kiến trúc đòi &lt;em>các phần không dính nhau&lt;/em>. Orchestration bằng lời gọi trực tiếp thỏa vế một, phá vế hai: service &amp;ldquo;đầu chuỗi&amp;rdquo; phải biết và sống chết cùng mọi service cuối chuỗi (&lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/07-kafka-event-driven/">12.7 §1&lt;/a>). Event-driven giải mâu thuẫn bằng cách đảo chủ ngữ: thay vì &lt;em>A bảo B làm&lt;/em>, &lt;strong>A công bố điều đã xảy ra; B tự quyết định phản ứng.&lt;/strong>&lt;/p></description></item><item><title>6.5. Kafka — distributed log cho sự kiện</title><link>https://thanhhv.github.io/series/system-design/06-communication/05-kafka/</link><pubDate>Mon, 13 Jul 2026 10:20:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/06-communication/05-kafka/</guid><description>&lt;blockquote>
&lt;p>Vì-sao-tồn-tại và hành trình áp dụng đã kể ở &lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/07-kafka-event-driven/">12.7&lt;/a>. Chương này mổ nội thất: vì sao log lại nhanh đến thế, các đảm bảo thật sự của Kafka nằm ở đâu, và giá vận hành của chúng.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Cần một nơi công bố &lt;strong>sự thật đã xảy ra&lt;/strong> (order created, payment captured, price changed) sao cho: nhiều hệ tiêu thụ độc lập theo nhịp riêng, hệ đến sau đọc lại được lịch sử, thứ tự trong phạm vi cần thiết được giữ, throughput hàng trăm nghìn–triệu event/giây, và dữ liệu không mất khi máy chết. Không mô hình queue nào thỏa đồng thời các yêu cầu này — cần một mô hình khác: &lt;strong>append-only log phân tán&lt;/strong>.&lt;/p></description></item><item><title>6.4. RabbitMQ — smart broker cho work queue</title><link>https://thanhhv.github.io/series/system-design/06-communication/04-rabbitmq/</link><pubDate>Mon, 13 Jul 2026 10:10:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/06-communication/04-rabbitmq/</guid><description>&lt;blockquote>
&lt;p>Bối cảnh vì-sao-tồn-tại và hành trình đưa nó vào hệ thống đã kể ở &lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/04-message-queue/">12.4&lt;/a>. Chương này đi sâu vào nội thất, mô hình vận hành và ranh giới của nó.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Cần giao &lt;strong>việc&lt;/strong> một cách tin cậy: mỗi việc đến đúng một worker, việc fail được thử lại, việc hỏng vĩnh viễn được cách ly có địa chỉ (DLQ), việc gấp vượt việc thường, spike được hấp thụ. Đây là bài toán &lt;strong>task distribution&lt;/strong> — khác về bản chất với bài toán &lt;strong>event distribution&lt;/strong> (&lt;a href="https://thanhhv.github.io/series/system-design/06-communication/05-kafka/">Kafka, 6.5&lt;/a>): việc thì &lt;em>tiêu thụ xong là xong&lt;/em>, sự kiện thì &lt;em>nhiều bên cùng đọc và có thể đọc lại&lt;/em>.&lt;/p></description></item><item><title>6.3. gRPC — RPC có kỷ luật cho nội bộ</title><link>https://thanhhv.github.io/series/system-design/06-communication/03-grpc/</link><pubDate>Mon, 13 Jul 2026 10:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/06-communication/03-grpc/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Bên trong một hệ microservices (&lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/06-microservices/">12.6&lt;/a>), các service gọi nhau hàng chục nghìn lần mỗi giây. Ở tần suất đó, những thứ vặt vãnh của REST/JSON thành hóa đơn lớn: serialize/parse JSON ngốn CPU thật (đo được hàng chục % CPU của service nhỏ), payload text phình băng thông, HTTP/1.1 mở nhiều connection và nghẽn head-of-line, và — đắt nhất — &lt;strong>hợp đồng lỏng lẻo&lt;/strong>: field đổi tên, kiểu đổi, chỉ phát hiện lúc runtime bằng sự cố. Hai đầu dây đều là code của bạn; cái bạn cần không phải &amp;ldquo;phổ cập&amp;rdquo; mà là &lt;strong>contract chặt kiểm tra lúc compile + hiệu năng + streaming&lt;/strong> — đó là gRPC.&lt;/p></description></item><item><title>6.2. GraphQL — client tự khai hình dữ liệu</title><link>https://thanhhv.github.io/series/system-design/06-communication/02-graphql/</link><pubDate>Mon, 13 Jul 2026 09:50:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/06-communication/02-graphql/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Ứng dụng có nhiều loại client (web, iOS, Android, smart TV, đối tác) trên cùng một domain phức tạp. Với REST thuần, mỗi màn hình gặp một trong hai bệnh: &lt;strong>under-fetch&lt;/strong> (cần 5 resource = 5 round-trip nối tiếp — chết vì latency trên mobile 3G) hoặc &lt;strong>over-fetch&lt;/strong> (endpoint trả 60 field, màn hình dùng 4 — chết vì băng thông). Team backend bị kẹp giữa: hoặc viết endpoint riêng cho từng màn hình của từng client (bùng nổ endpoint), hoặc bắt client chịu. GraphQL đảo quyền: &lt;strong>schema thống nhất phía server, client tự khai chính xác hình dữ liệu nó cần, nhận về đúng hình đó trong một round-trip.&lt;/strong>&lt;/p></description></item><item><title>6.1. REST — hợp đồng chung của web</title><link>https://thanhhv.github.io/series/system-design/06-communication/01-rest/</link><pubDate>Mon, 13 Jul 2026 09:40:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/06-communication/01-rest/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Hai hệ thống của hai team (hoặc hai công ty) cần nói chuyện với nhau qua network, và hợp đồng giữa họ phải: dễ hiểu với người mới, dễ debug bằng công cụ phổ thông, tận dụng được hạ tầng web sẵn có (cache, proxy, LB, CDN), và sống sót qua nhiều năm tiến hóa mà không phá client cũ. REST không phải giao thức &amp;ldquo;tốt nhất&amp;rdquo; theo bất kỳ trục kỹ thuật đơn lẻ nào — nó là &lt;strong>hợp đồng có hệ sinh thái lớn nhất và chi phí gia nhập thấp nhất&lt;/strong>, và đó chính là giá trị kiến trúc của nó.&lt;/p></description></item><item><title>Phần 6 — Communication</title><link>https://thanhhv.github.io/series/system-design/06-communication/00-tong-quan/</link><pubDate>Mon, 13 Jul 2026 09:30:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/06-communication/00-tong-quan/</guid><description>&lt;blockquote>
&lt;p>Chủ đề: REST, GraphQL, gRPC, RabbitMQ, Kafka, Event-driven, Saga, Outbox Pattern.&lt;/p>&lt;/blockquote>
&lt;h2 id="luận-điểm-trung-tâm-của-phần-này">Luận điểm trung tâm của phần này&lt;/h2>
&lt;p>Chọn cơ chế giao tiếp là chọn &lt;strong>hợp đồng về thời gian và lỗi&lt;/strong> — trước khi là chọn công nghệ. Ba câu hỏi định hình mọi lựa chọn trong phần này:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Bên gọi có chờ không?&lt;/strong> Sync (chờ kết quả để đi tiếp) vs async (ghi nhận ý định, kết quả đến sau). Sync dễ suy luận, giam tài nguyên theo độ trễ của bên kia; async chịu tải và cô lập lỗi, đổi bằng eventual consistency với chính nghiệp vụ của mình (&lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/03-background-worker/">12.3&lt;/a>).&lt;/li>
&lt;li>&lt;strong>Lỗi hiện ở đâu?&lt;/strong> Sync: ngay trước mặt, trong response. Async: âm thầm phía sau — backlog, DLQ, lag (&lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/03-messaging-failures/">Phần 13.3&lt;/a>). Hệ async đòi giám sát chủ động gấp đôi.&lt;/li>
&lt;li>&lt;strong>Ai phải biết ai tồn tại?&lt;/strong> Gọi trực tiếp: caller biết callee. Work queue: producer biết &lt;em>việc&lt;/em>, không biết worker. Event log: producer không biết ai nghe (&lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/07-kafka-event-driven/">12.7&lt;/a>). Hướng của sự phụ thuộc quyết định hệ thống tiến hóa dễ hay khó.&lt;/li>
&lt;/ol>
&lt;p>Quy tắc rút gọn xuyên suốt: &lt;strong>command cần kết quả → sync (REST/gRPC); việc cần làm → work queue (RabbitMQ); sự thật đã xảy ra → log (Kafka).&lt;/strong> Ba công cụ, ba việc — dùng chéo là nguồn anti-pattern.&lt;/p></description></item><item><title>5.7. So sánh &amp; khung quyết định lựa chọn</title><link>https://thanhhv.github.io/series/system-design/05-data-layer/07-so-sanh-lua-chon/</link><pubDate>Mon, 13 Jul 2026 09:20:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/05-data-layer/07-so-sanh-lua-chon/</guid><description>&lt;blockquote>
&lt;p>Chương tổng hợp của Phần 5. Nếu sáu chương trước là sáu công cụ, chương này là bàn tay cầm chúng.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-bảng-so-sánh-theo-quyết-định-gốc">1. Bảng so sánh theo quyết định gốc&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>PostgreSQL&lt;/th>
&lt;th>MySQL&lt;/th>
&lt;th>MongoDB&lt;/th>
&lt;th>Redis&lt;/th>
&lt;th>ClickHouse&lt;/th>
&lt;th>Elasticsearch&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Cấu trúc lưu&lt;/td>
&lt;td>Heap + B-tree&lt;/td>
&lt;td>Clustered B-tree&lt;/td>
&lt;td>B-tree (WiredTiger)&lt;/td>
&lt;td>RAM structures&lt;/td>
&lt;td>Columnar MergeTree&lt;/td>
&lt;td>Inverted index (Lucene)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Đơn vị nhất quán&lt;/td>
&lt;td>Transaction đa hàng&lt;/td>
&lt;td>Transaction đa hàng&lt;/td>
&lt;td>Document&lt;/td>
&lt;td>Lệnh đơn&lt;/td>
&lt;td>Không (eventual)&lt;/td>
&lt;td>Document, không transaction&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Trục tối ưu&lt;/td>
&lt;td>Đọc/ghi điểm + query linh hoạt&lt;/td>
&lt;td>Đọc/ghi điểm theo PK&lt;/td>
&lt;td>Đọc/ghi cả object&lt;/td>
&lt;td>Ops/s + latency µs–ms&lt;/td>
&lt;td>Scan + aggregate&lt;/td>
&lt;td>Tìm liên quan + facet&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Điểm mù cấu trúc&lt;/td>
&lt;td>Scan tỷ hàng; ghi append cực lớn&lt;/td>
&lt;td>Như PG + analytics yếu hơn&lt;/td>
&lt;td>Query cắt ngang document&lt;/td>
&lt;td>Dataset &amp;gt; RAM; query đa chiều&lt;/td>
&lt;td>Point read/update&lt;/td>
&lt;td>Update dày; đếm chính xác; transaction&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Scale ghi&lt;/td>
&lt;td>1 writer (shard = tự lo)&lt;/td>
&lt;td>1 writer (Vitess đường sẵn)&lt;/td>
&lt;td>Sharding tích hợp&lt;/td>
&lt;td>Cluster tích hợp&lt;/td>
&lt;td>Cụm phân tán tốt&lt;/td>
&lt;td>Shard tích hợp&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Vai trong kiến trúc&lt;/td>
&lt;td>&lt;strong>Nguồn sự thật&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Nguồn sự thật&lt;/strong>&lt;/td>
&lt;td>Nguồn sự thật (đúng domain)&lt;/td>
&lt;td>&lt;strong>Dẫn xuất/phù du&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Dẫn xuất&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Dẫn xuất&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Chi phí vận hành thêm&lt;/td>
&lt;td>Thấp (managed phổ cập)&lt;/td>
&lt;td>Thấp&lt;/td>
&lt;td>Trung bình&lt;/td>
&lt;td>Thấp–trung bình&lt;/td>
&lt;td>Trung bình–cao&lt;/td>
&lt;td>Cao&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Hàng &amp;ldquo;vai trong kiến trúc&amp;rdquo; là hàng quan trọng nhất: &lt;strong>hai cột đầu giữ sự thật; bốn cột sau phục vụ tốc độ.&lt;/strong> Nhầm vai là nguồn của các tai nạn lớn nhất (Redis làm nguồn sự thật, ES làm primary store, ClickHouse làm OLTP).&lt;/p></description></item><item><title>5.6. Elasticsearch — index, không phải database</title><link>https://thanhhv.github.io/series/system-design/05-data-layer/06-elasticsearch/</link><pubDate>Mon, 13 Jul 2026 09:10:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/05-data-layer/06-elasticsearch/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>User gõ &amp;ldquo;ao khoac nam mua dong gia re&amp;rdquo; và mong đợi: kết quả &lt;em>liên quan&lt;/em> (không phải khớp chuỗi), chịu được thiếu dấu/sai chính tả, filter theo giá/size/thương hiệu, facet đếm sẵn từng nhóm, autocomplete — tất cả dưới 100ms trên hàng triệu sản phẩm. Không cấu trúc nào ở các chương trước làm được việc này: B-tree trả lời &amp;ldquo;bằng/trong khoảng&amp;rdquo;, columnar trả lời &amp;ldquo;tổng theo nhóm&amp;rdquo; — không cái nào trả lời &lt;strong>&amp;ldquo;chứa khái niệm X, xếp theo độ liên quan&amp;rdquo;&lt;/strong>. &lt;code>LIKE '%áo khoác%'&lt;/code> là quét toàn bảng &lt;em>và&lt;/em> vẫn sai về nghiệp vụ (không xếp hạng, không xử lý dấu, không tách từ).&lt;/p></description></item><item><title>5.5. ClickHouse — cỗ máy quét tỷ hàng</title><link>https://thanhhv.github.io/series/system-design/05-data-layer/05-clickhouse/</link><pubDate>Mon, 13 Jul 2026 09:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/05-data-layer/05-clickhouse/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Nhớ lại bảng ước lượng của &lt;a href="https://thanhhv.github.io/series/system-design/01-foundations/04-scale-estimation-capacity-planning/">chương 1.4&lt;/a>: dữ liệu &lt;em>nghiệp vụ&lt;/em> của VietShop là 4.4GB/năm — còn log/event là &lt;strong>11TB/năm&lt;/strong>. Đây là quy luật chung: dữ liệu hành vi (event, click, log, metric, telemetry) lớn hơn dữ liệu nghiệp vụ 2–3 bậc độ lớn, và câu hỏi đặt lên nó luôn có dạng: &lt;em>&amp;ldquo;tổng/đếm/trung bình của X, nhóm theo Y, trong khoảng thời gian Z&amp;rdquo;&lt;/em> — quét triệu tới tỷ hàng, trả về vài trăm hàng kết quả. Chạy loại query này trên PostgreSQL là xem nó bò hàng chục phút và giết luôn OLTP đang chạy cạnh (&lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/08-cqrs/">12.8 — vấn đề mở màn của CQRS&lt;/a>). ClickHouse được thiết kế cho đúng một việc này.&lt;/p></description></item><item><title>5.4. Redis — cấu trúc dữ liệu trong RAM</title><link>https://thanhhv.github.io/series/system-design/05-data-layer/04-redis/</link><pubDate>Mon, 13 Jul 2026 08:50:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/05-data-layer/04-redis/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Có một lớp dữ liệu mà disk-based DB nào cũng phục vụ &lt;em>được&lt;/em> nhưng đều phục vụ &lt;em>đắt&lt;/em>: truy cập cực dày (chục nghìn–triệu ops/s), latency yêu cầu sub-ms, vòng đời ngắn hoặc dựng lại được — cache, session, counter, rate limit, bảng xếp hạng, khóa tạm, hàng đợi nhẹ. Dùng PostgreSQL cho việc này là thuê container chở thư tay. Redis tồn tại để phục vụ đúng lớp này: &lt;strong>cấu trúc dữ liệu quen thuộc (map, list, set, sorted set) sống trong RAM, thao tác atomic, latency ~0.1–1ms.&lt;/strong>&lt;/p></description></item><item><title>5.3. MongoDB — khi dữ liệu thật sự là document</title><link>https://thanhhv.github.io/series/system-design/05-data-layer/03-mongodb/</link><pubDate>Mon, 13 Jul 2026 08:40:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/05-data-layer/03-mongodb/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Một số dữ liệu chống lại việc trải phẳng thành bảng: catalog sản phẩm nơi mỗi ngành hàng một bộ thuộc tính (điện thoại có RAM/chip, áo có size/màu, sách có ISBN/tác giả), hồ sơ người dùng với cấu trúc lồng nhau nhiều tầng, payload sự kiện từ trăm nguồn khác nhau. Ép chúng vào quan hệ cho ra một trong hai thứ xấu: bảng 300 cột toàn NULL, hoặc EAV (entity-attribute-value — query 5 tầng join để dựng lại một object). MongoDB đặt cược vào mô hình khác: &lt;strong>đơn vị lưu trữ = document (BSON) — object lồng nhau được lưu, đọc, ghi như một khối.&lt;/strong>&lt;/p></description></item><item><title>5.2. MySQL — người anh em song sinh khác tính cách</title><link>https://thanhhv.github.io/series/system-design/05-data-layer/02-mysql/</link><pubDate>Mon, 13 Jul 2026 08:30:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/05-data-layer/02-mysql/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Cùng bài toán với PostgreSQL: nguồn sự thật ACID cho dữ liệu nghiệp vụ. Câu hỏi thực tế của chương này không phải &amp;ldquo;MySQL là gì&amp;rdquo; mà là: &lt;strong>hai RDBMS hàng đầu khác nhau ở đâu về bản chất, và khi nào sự khác biệt đó nghiêng cán cân?&lt;/strong> Đa số bài so sánh trên mạng liệt kê tính năng; chương này so sánh &lt;strong>quyết định thiết kế gốc&lt;/strong> — vì tính năng đổi theo phiên bản, quyết định gốc thì không.&lt;/p></description></item><item><title>5.1. PostgreSQL — mặc định đúng cho dữ liệu nghiệp vụ</title><link>https://thanhhv.github.io/series/system-design/05-data-layer/01-postgresql/</link><pubDate>Mon, 13 Jul 2026 08:20:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/05-data-layer/01-postgresql/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Mọi hệ thống cần một nơi lưu &lt;strong>sự thật nghiệp vụ&lt;/strong>: đơn hàng, tài khoản, số dư — dữ liệu mà nếu sai hoặc mất thì không xin lỗi được. Nơi đó phải: không mất dữ liệu đã xác nhận (durability), không cho hai thao tác giẫm nhau tạo trạng thái vô lý (isolation), giữ ràng buộc nghiệp vụ (constraint), và trả lời được các câu hỏi &lt;em>chưa biết trước&lt;/em> (query linh hoạt). PostgreSQL là câu trả lời mặc định của ngành cho bài toán này — chương này giải thích vì sao, và quan trọng hơn: giới hạn của nó nằm ở đâu.&lt;/p></description></item><item><title>Phần 5 — Data Layer</title><link>https://thanhhv.github.io/series/system-design/05-data-layer/00-tong-quan/</link><pubDate>Mon, 13 Jul 2026 08:10:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/05-data-layer/00-tong-quan/</guid><description>&lt;blockquote>
&lt;p>Chủ đề: PostgreSQL, MySQL, MongoDB, Redis, ClickHouse, Elasticsearch — và quan trọng nhất: &lt;strong>khi nào chọn cái gì&lt;/strong>.&lt;/p>&lt;/blockquote>
&lt;h2 id="luận-điểm-trung-tâm-của-phần-này">Luận điểm trung tâm của phần này&lt;/h2>
&lt;p>Không có database &amp;ldquo;tốt nhất&amp;rdquo; — chỉ có database có &lt;strong>mô hình lưu trữ và truy cập khớp với workload&lt;/strong>. Mọi khác biệt giữa các hệ quy về vài quyết định gốc mà mỗi engine đã chọn &lt;em>thay bạn&lt;/em> từ ngày nó được thiết kế:&lt;/p></description></item><item><title>4.4. Clock Synchronization, Network Partition &amp; Split Brain</title><link>https://thanhhv.github.io/series/system-design/04-distributed-systems/04-clock-partition-split-brain/</link><pubDate>Mon, 13 Jul 2026 08:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/04-distributed-systems/04-clock-partition-split-brain/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Ba &amp;ldquo;sự thật khó chịu&amp;rdquo; của hệ phân tán mà mọi thiết kế phải đối mặt:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Không có đồng hồ chung.&lt;/strong> Mỗi máy một đồng hồ, và chúng lệch nhau.&lt;/li>
&lt;li>&lt;strong>Mạng sẽ đứt&lt;/strong> — theo những cách kỳ quặc hơn bạn tưởng (đứt một chiều, đứt chập chờn, chậm-như-đứt).&lt;/li>
&lt;li>Hệ quả của (1) + (2): &lt;strong>split brain&lt;/strong> — hai phần của hệ thống cùng tin rằng mình là &amp;ldquo;chính&amp;rdquo;, cùng nhận ghi, và dữ liệu phân kỳ.&lt;/li>
&lt;/ol>
&lt;p>Chương này nối các nguyên lý ở 4.1–4.3 với các sự cố thực tế nhất của Phần 13.&lt;/p></description></item><item><title>4.3. Consensus, Quorum &amp; Leader Election</title><link>https://thanhhv.github.io/series/system-design/04-distributed-systems/03-consensus-quorum-leader-election/</link><pubDate>Mon, 13 Jul 2026 07:50:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/04-distributed-systems/03-consensus-quorum-leader-election/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Một cụm nhiều node phải trả lời được những câu hỏi nghe rất tầm thường:&lt;/p>
&lt;ul>
&lt;li>Ai là leader hiện tại?&lt;/li>
&lt;li>Cấu hình hiện hành là bản nào?&lt;/li>
&lt;li>Ghi này đã &amp;ldquo;chính thức&amp;rdquo; chưa (commit hay chưa)?&lt;/li>
&lt;/ul>
&lt;p>Điều phản trực giác: trong hệ phân tán, các câu hỏi này &lt;strong>khó một cách nền tảng&lt;/strong>. Node không phân biệt được &amp;ldquo;node kia chết&amp;rdquo; với &amp;ldquo;mạng chậm&amp;rdquo; với &amp;ldquo;node kia đang GC pause&amp;rdquo;. Không có đồng hồ chung đáng tin. Message có thể đến trễ, đến hai lần, hoặc không đến. Consensus là bài toán làm cho N node &lt;strong>đồng ý về một giá trị&lt;/strong> trong điều kiện đó — và nó là nền móng dưới mọi hệ thống phân tán nghiêm túc: failover tự động, distributed lock, config quản lý tập trung, Kafka controller, Kubernetes control plane.&lt;/p></description></item><item><title>4.2. Replication &amp; Consistency Models</title><link>https://thanhhv.github.io/series/system-design/04-distributed-systems/02-replication-consistency/</link><pubDate>Mon, 13 Jul 2026 07:40:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/04-distributed-systems/02-replication-consistency/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Replication — giữ nhiều bản sao của cùng một dữ liệu trên nhiều node — tồn tại vì ba lý do, và chỉ ba:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Availability/Durability:&lt;/strong> máy chết, disk hỏng; bản sao thứ hai là thứ duy nhất đứng giữa bạn và mất dữ liệu.&lt;/li>
&lt;li>&lt;strong>Read scalability:&lt;/strong> một node có trần đọc; N bản sao nhân trần đọc lên ~N lần.&lt;/li>
&lt;li>&lt;strong>Latency theo địa lý:&lt;/strong> đặt bản sao gần user để đọc nhanh.&lt;/li>
&lt;/ol>
&lt;p>Nhưng khoảnh khắc tồn tại bản sao thứ hai, một câu hỏi không thể né sinh ra: &lt;strong>hai bản sao có giống nhau không, vào lúc nào?&lt;/strong> Toàn bộ lý thuyết consistency models là các câu trả lời khác nhau cho câu hỏi này — mỗi câu trả lời một mức giá.&lt;/p></description></item><item><title>4.1. CAP Theorem &amp; PACELC</title><link>https://thanhhv.github.io/series/system-design/04-distributed-systems/01-cap-pacelc/</link><pubDate>Mon, 13 Jul 2026 07:30:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/04-distributed-systems/01-cap-pacelc/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Khoảnh khắc hệ thống chuyển từ 1 node sang N node — vì cần chịu tải cao hơn hoặc sống sót khi 1 máy chết — nó bước vào lãnh thổ của Distributed Systems, nơi có những giới hạn &lt;strong>toán học&lt;/strong>, không phải giới hạn kỹ thuật. Không framework nào, không cloud provider nào vượt qua được chúng. CAP và PACELC là hai giới hạn nền tảng nhất: chúng nói rằng một số tổ hợp thuộc tính mà bạn muốn là &lt;strong>bất khả thi&lt;/strong>, và việc của Architect là chọn hy sinh cái gì.&lt;/p></description></item><item><title>3.3. Active-Active vs Active-Passive — hai triết lý redundancy</title><link>https://thanhhv.github.io/series/system-design/03-availability-reliability/03-active-active-passive/</link><pubDate>Mon, 13 Jul 2026 07:20:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/03-availability-reliability/03-active-active-passive/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Đã quyết có bản dự phòng (&lt;a href="https://thanhhv.github.io/series/system-design/03-availability-reliability/01-ha-failover/">3.1&lt;/a>) — câu hỏi kế: bản dự phòng &lt;strong>làm gì trong lúc chờ&lt;/strong>? Ngồi im (passive) hay cùng phục vụ (active)? Nghe như chi tiết triển khai — thực chất là ngã ba triết lý với hệ quả lan đến tận mô hình dữ liệu: passive đơn giản nhưng đặt cược vào khoảnh khắc chuyển đổi &lt;em>chưa từng diễn ra thật&lt;/em>; active-active dùng được tài nguyên và &amp;ldquo;failover liên tục từng giây&amp;rdquo; nhưng — với tầng có state — mở cánh cửa xung đột ghi mà &lt;a href="https://thanhhv.github.io/series/system-design/04-distributed-systems/02-replication-consistency/">4.2 §2.2&lt;/a> đã cảnh báo.&lt;/p></description></item><item><title>3.2. Backup &amp; Recovery — lớp phòng thủ cuối cùng</title><link>https://thanhhv.github.io/series/system-design/03-availability-reliability/02-backup-recovery/</link><pubDate>Mon, 13 Jul 2026 07:10:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/03-availability-reliability/02-backup-recovery/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Replication chống được máy hỏng — nhưng &lt;strong>trung thành nhân bản mọi thảm họa logic trong mili-giây&lt;/strong>: DELETE nhầm, migration hỏng dữ liệu, ransomware mã hóa, bug ghi rác — replica có ngay bản sao hoàn hảo của sai lầm (&lt;a href="https://thanhhv.github.io/series/system-design/03-availability-reliability/00-tong-quan/">3.README §3&lt;/a>). Backup là lớp duy nhất chống được loại chết này: &lt;strong>bản sao tách rời theo thời gian và theo quyền truy cập.&lt;/strong> Và câu hỏi thật của backup chưa bao giờ là &amp;ldquo;có backup không&amp;rdquo; — mà là: &lt;strong>restore được không, trong bao lâu, mất bao nhiêu, và đã thử chưa?&lt;/strong> Backup chưa từng restore thử là một niềm tin, không phải một năng lực.&lt;/p></description></item><item><title>3.1. High Availability &amp; Failover — giải phẫu quá trình chuyển đổi</title><link>https://thanhhv.github.io/series/system-design/03-availability-reliability/01-ha-failover/</link><pubDate>Mon, 13 Jul 2026 07:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/03-availability-reliability/01-ha-failover/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Business nói: &amp;ldquo;hệ thống không được chết quá 43 phút mỗi tháng&amp;rdquo; (99.9% — &lt;a href="https://thanhhv.github.io/series/system-design/01-foundations/02-sla-slo-sli/">1.2&lt;/a>). Máy &lt;em>sẽ&lt;/em> chết, disk &lt;em>sẽ&lt;/em> hỏng, AZ &lt;em>sẽ&lt;/em> sập — vậy con số kia chỉ đạt được bằng một cách: &lt;strong>khi một bộ phận chết, bộ phận dự phòng tiếp quản nhanh hơn ngưỡng người dùng bỏ đi.&lt;/strong> HA = redundancy (có dự phòng) × failover (chuyển đổi đúng và nhanh). Vế thứ hai khó hơn vế thứ nhất một bậc — và là nơi các sự cố HA thực tế xảy ra: hệ thống có đủ bản sao nhưng chuyển đổi sai còn tệ hơn không có bản sao (&lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/04-distributed-failures/">13.4 — split brain&lt;/a>).&lt;/p></description></item><item><title>Phần 3 — Availability &amp; Reliability</title><link>https://thanhhv.github.io/series/system-design/03-availability-reliability/00-tong-quan/</link><pubDate>Mon, 13 Jul 2026 06:50:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/03-availability-reliability/00-tong-quan/</guid><description>&lt;blockquote>
&lt;p>Chủ đề: High Availability, Failover, Replication (phối hợp), Backup, Disaster Recovery, Active-Active, Active-Passive.&lt;/p>&lt;/blockquote>
&lt;h2 id="luận-điểm-trung-tâm-của-phần-này">Luận điểm trung tâm của phần này&lt;/h2>
&lt;p>Availability là &lt;strong>kết quả của thiết kế cho sự cố&lt;/strong>, không phải của phần cứng tốt: mọi thành phần sẽ hỏng — câu hỏi duy nhất là hệ thống phản ứng thế nào khi điều đó xảy ra. Ba mệnh đề nền:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Mỗi &amp;ldquo;số 9&amp;rdquo; thêm đắt ~10 lần&lt;/strong> (&lt;a href="https://thanhhv.github.io/series/system-design/01-foundations/02-sla-slo-sli/">1.2&lt;/a>); và từ 99.99% trở lên, con người không kịp phản ứng — mọi failover phải tự động, kéo theo toàn bộ &lt;a href="https://thanhhv.github.io/series/system-design/04-distributed-systems/03-consensus-quorum-leader-election/">Phần 4&lt;/a>. Ranh giới 3 số 9 / 4 số 9 là ranh giới kiến trúc, không phải ranh giới nỗ lực.&lt;/li>
&lt;li>&lt;strong>Redundancy chỉ là tiềm năng — failover mới là năng lực.&lt;/strong> N bản sao không cứu được ai nếu quá trình chuyển đổi sai (&lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/04-distributed-failures/">13.4 — split brain&lt;/a>); và failover chưa từng diễn tập là failover trên giấy.&lt;/li>
&lt;li>&lt;strong>Replication ≠ Backup ≠ DR&lt;/strong> — ba lớp chống ba loại chết khác nhau (máy hỏng / dữ liệu hỏng / tổ chức không biết làm gì); cần cả ba, thiếu lớp nào lộ lớp đó đúng ngày xấu trời (&lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/10-disaster-recovery/">12.10&lt;/a>).&lt;/li>
&lt;/ol>
&lt;h2 id="mục-lục">Mục lục&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/03-availability-reliability/01-ha-failover/">3.1. High Availability &amp;amp; Failover — giải phẫu quá trình chuyển đổi&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/03-availability-reliability/02-backup-recovery/">3.2. Backup &amp;amp; Recovery — lớp phòng thủ cuối cùng&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://thanhhv.github.io/series/system-design/03-availability-reliability/03-active-active-passive/">3.3. Active-Active vs Active-Passive — hai triết lý redundancy&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="bản-đồ-chủ-đề-trong-toàn-tài-liệu">Bản đồ chủ đề trong toàn tài liệu&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Mảnh&lt;/th>
&lt;th>Ở đâu&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Định nghĩa và chi phí các &amp;ldquo;số 9&amp;rdquo;, error budget&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/01-foundations/02-sla-slo-sli/">1.2&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Replication chi tiết (sync/async, mô hình)&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/04-distributed-systems/02-replication-consistency/">4.2&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Quorum, leader election, fencing — bộ máy failover an toàn&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/04-distributed-systems/03-consensus-quorum-leader-election/">4.3&lt;/a>, &lt;a href="https://thanhhv.github.io/series/system-design/04-distributed-systems/04-clock-partition-split-brain/">4.4&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DR như năng lực tổ chức: RPO/RTO, 4 lớp, diễn tập&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/10-disaster-recovery/">12.10&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Multi-region&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/12-evolution/09-multi-region/">12.9&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Các sự cố ăn mòn availability&lt;/td>
&lt;td>&lt;a href="https://thanhhv.github.io/series/system-design/13-production-failure-cases/00-tong-quan/">Phần 13&lt;/a> toàn bộ&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Phần này là mô-đun nối: đi sâu vào những gì các phần trên chưa phủ — giải phẫu failover, kỹ nghệ backup, và lựa chọn active-active/passive như một khung quyết định.&lt;/p></description></item><item><title>2.3. Auto Scaling — co giãn theo tải mà không thức đêm</title><link>https://thanhhv.github.io/series/system-design/02-scalability/03-auto-scaling/</link><pubDate>Mon, 13 Jul 2026 06:40:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/02-scalability/03-auto-scaling/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Tải không phẳng: ngày gấp 3 đêm, tối gấp 2 trưa, flash sale gấp 10 ngày thường (&lt;a href="https://thanhhv.github.io/series/system-design/01-foundations/04-scale-estimation-capacity-planning/">1.4&lt;/a>). Provision cho đỉnh = trả tiền công suất ngủ 80% thời gian; provision cho trung bình = gãy latency mỗi tối (&lt;a href="https://thanhhv.github.io/series/system-design/01-foundations/03-throughput-latency/">1.3 — hockey stick&lt;/a>). Auto scaling hứa điều thứ ba: công suất bám theo tải. Lời hứa có điều kiện — và các điều kiện đó (stateless, khởi động nhanh, metric đúng, biết giới hạn tốc độ của chính nó) là nội dung thật của chương này.&lt;/p></description></item><item><title>2.2. Load Balancer — người gác cổng của scale-out</title><link>https://thanhhv.github.io/series/system-design/02-scalability/02-load-balancer/</link><pubDate>Mon, 13 Jul 2026 06:30:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/02-scalability/02-load-balancer/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Có N instance giống nhau (&lt;a href="https://thanhhv.github.io/series/system-design/02-scalability/01-vertical-horizontal-scaling/">2.1&lt;/a>); cần một thứ đứng trước để: chia request &lt;em>đều theo tải thật&lt;/em> (không phải đều theo số đếm), phát hiện máy chết và loại nó &lt;em>trước khi user cảm nhận&lt;/em>, cho phép thêm/bớt máy &lt;em>giữa dòng traffic&lt;/em>, và tự nó &lt;strong>không trở thành SPOF mới&lt;/strong>. Bốn yêu cầu nghe hiển nhiên — mỗi cái là một bài thiết kế có chiều sâu, và LB cấu hình mặc định thường trượt cả bốn ở những cách kín đáo.&lt;/p></description></item><item><title>2.1. Vertical vs Horizontal Scaling — và bài toán state</title><link>https://thanhhv.github.io/series/system-design/02-scalability/01-vertical-horizontal-scaling/</link><pubDate>Mon, 13 Jul 2026 06:20:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/02-scalability/01-vertical-horizontal-scaling/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Hệ thống chạm trần một máy: CPU bão hòa giờ peak, latency gãy (&lt;a href="https://thanhhv.github.io/series/system-design/01-foundations/03-throughput-latency/">1.3 — hockey stick&lt;/a>). Hai con đường: &lt;strong>máy to hơn&lt;/strong> (vertical/scale-up) hay &lt;strong>nhiều máy hơn&lt;/strong> (horizontal/scale-out)? Câu hỏi nghe như so sánh giá tiền — thực chất là so sánh hai triết lý kiến trúc, và con đường thứ hai có một điều kiện tiên quyết bị đánh giá thấp một cách hệ thống: &lt;strong>state phải dọn nhà trước&lt;/strong>.&lt;/p></description></item><item><title>Phần 2 — Scalability</title><link>https://thanhhv.github.io/series/system-design/02-scalability/00-tong-quan/</link><pubDate>Mon, 13 Jul 2026 06:10:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/02-scalability/00-tong-quan/</guid><description>&lt;blockquote>
&lt;p>Chủ đề: Vertical Scaling, Horizontal Scaling, Stateless vs Stateful, Sticky Session, Load Balancer, Auto Scaling.&lt;/p>&lt;/blockquote>
&lt;h2 id="luận-điểm-trung-tâm-của-phần-này">Luận điểm trung tâm của phần này&lt;/h2>
&lt;p>Scalability không phải &amp;ldquo;chịu được nhiều tải&amp;rdquo; — mà là &lt;strong>chi phí tăng tuyến tính (hoặc chậm hơn) theo tải, không cần thiết kế lại&lt;/strong> (&lt;a href="https://thanhhv.github.io/series/system-design/01-foundations/01-requirements/">1.1&lt;/a>). Hệ scale kém không phải hệ chậm — là hệ mà tải tăng 2× thì chi phí tăng 10× hoặc phải viết lại.&lt;/p></description></item><item><title>1.5. Bottleneck Analysis</title><link>https://thanhhv.github.io/series/system-design/01-foundations/05-bottleneck-analysis/</link><pubDate>Mon, 13 Jul 2026 06:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/01-foundations/05-bottleneck-analysis/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Hệ thống chậm/quá tải, và team đứng trước cám dỗ lớn nhất của nghề: &lt;strong>tối ưu thứ dễ thấy thay vì thứ đang nghẽn&lt;/strong>. Thêm cache khi vấn đề là lock contention. Thêm server khi vấn đề là connection pool. Rewrite sang Go khi vấn đề là một câu query thiếu index.&lt;/p>
&lt;p>Bottleneck analysis là kỹ năng tìm đúng chỗ nghẽn &lt;strong>trước khi&lt;/strong> hành động. Nó quan trọng vì một định luật không khoan nhượng: &lt;strong>tối ưu bất cứ thứ gì không phải bottleneck đều không cải thiện hệ thống&lt;/strong> (Theory of Constraints). Tăng gấp đôi tốc độ một thành phần đang rảnh 60% thời gian → thay đổi tổng thể: ~0.&lt;/p></description></item><item><title>1.4. Scale Estimation &amp; Capacity Planning</title><link>https://thanhhv.github.io/series/system-design/01-foundations/04-scale-estimation-capacity-planning/</link><pubDate>Mon, 13 Jul 2026 05:50:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/01-foundations/04-scale-estimation-capacity-planning/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Hai câu hỏi mà mọi thiết kế phải trả lời bằng &lt;strong>con số&lt;/strong>, không phải bằng tính từ:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Scale Estimation:&lt;/strong> hệ thống phải chịu bao nhiêu — user, request, dữ liệu?&lt;/li>
&lt;li>&lt;strong>Capacity Planning:&lt;/strong> cần bao nhiêu tài nguyên — máy, RAM, disk, băng thông — để chịu mức đó, hôm nay và 12 tháng tới?&lt;/li>
&lt;/ol>
&lt;p>Không có hai con số này, mọi tranh luận kiến trúc (&amp;ldquo;có cần sharding không?&amp;rdquo;, &amp;ldquo;Postgres chịu nổi không?&amp;rdquo;) là tranh luận cảm tính. Với con số, phần lớn tranh luận tự biến mất — vì đáp án trở nên hiển nhiên.&lt;/p></description></item><item><title>1.3. Throughput &amp; Latency</title><link>https://thanhhv.github.io/series/system-design/01-foundations/03-throughput-latency/</link><pubDate>Mon, 13 Jul 2026 05:40:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/01-foundations/03-throughput-latency/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>&amp;ldquo;Hệ thống chậm&amp;rdquo; là câu phàn nàn phổ biến nhất và mơ hồ nhất trong ngành. Chậm vì mỗi request mất lâu (latency)? Hay vì hệ thống không nuốt nổi số lượng request (throughput bão hòa → queue → chờ)? Hai bệnh khác nhau, thuốc khác nhau, nhưng triệu chứng bề mặt giống hệt nhau: &amp;ldquo;user thấy lâu&amp;rdquo;.&lt;/p>
&lt;p>Hiểu sâu quan hệ giữa latency, throughput, concurrency và utilization là kỹ năng chẩn đoán nền tảng — thiếu nó, mọi nỗ lực tối ưu là đoán mò.&lt;/p></description></item><item><title>1.2. SLA, SLO, SLI</title><link>https://thanhhv.github.io/series/system-design/01-foundations/02-sla-slo-sli/</link><pubDate>Mon, 13 Jul 2026 05:30:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/01-foundations/02-sla-slo-sli/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>&amp;ldquo;Hệ thống có ổn định không?&amp;rdquo; là câu hỏi không trả lời được nếu không có định nghĩa đo được về &amp;ldquo;ổn định&amp;rdquo;. Team vận hành nói uptime 99.98%, nhưng khách hàng phàn nàn liên tục — vì uptime đo bằng ping đến server, còn khách hàng đo bằng &amp;ldquo;đặt hàng có thành công không&amp;rdquo;. Hai thước đo khác nhau về cùng một hệ thống.&lt;/p>
&lt;p>SLI/SLO/SLA là bộ công cụ biến &amp;ldquo;độ tin cậy&amp;rdquo; từ cảm giác thành hợp đồng đo được — giữa hệ thống với khách hàng, và giữa team engineering với chính mình.&lt;/p></description></item><item><title>1.1. Functional &amp; Non-functional Requirements</title><link>https://thanhhv.github.io/series/system-design/01-foundations/01-requirements/</link><pubDate>Mon, 13 Jul 2026 05:20:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/01-foundations/01-requirements/</guid><description>&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Mọi thất bại kiến trúc lớn đều bắt nguồn từ một trong hai lỗi:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Thiết kế cho yêu cầu không tồn tại&lt;/strong> — xây hệ thống chịu 100K RPS cho sản phẩm có 200 user.&lt;/li>
&lt;li>&lt;strong>Bỏ sót yêu cầu ngầm&lt;/strong> — không ai nói &amp;ldquo;hệ thống thanh toán không được mất tiền khi crash&amp;rdquo;, vì ai cũng nghĩ điều đó hiển nhiên; cho đến khi nó xảy ra.&lt;/li>
&lt;/ol>
&lt;p>Requirements engineering trong system design không phải thủ tục giấy tờ. Nó là công cụ &lt;strong>định giá&lt;/strong>: mỗi yêu cầu có một chi phí kiến trúc, và việc của Architect là làm chi phí đó hiện hình trước khi viết dòng code đầu tiên.&lt;/p></description></item><item><title>00. Tư Duy Thiết Kế Hệ Thống</title><link>https://thanhhv.github.io/series/system-design/00-tu-duy-thiet-ke/</link><pubDate>Mon, 13 Jul 2026 05:10:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/00-tu-duy-thiet-ke/</guid><description>&lt;blockquote>
&lt;p>Chương này là nền móng của toàn bộ tài liệu. Nếu bạn chỉ đọc một chương, hãy đọc chương này.&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="1-vấn-đề-của-cách-học-system-design-phổ-biến">1. Vấn đề của cách học System Design phổ biến&lt;/h2>
&lt;p>Phần lớn tài liệu System Design trên thị trường dạy theo kiểu: &amp;ldquo;Design Twitter thì dùng fan-out, design Uber thì dùng geohash, design URL shortener thì dùng base62&amp;rdquo;. Người học ghi nhớ &lt;strong>ánh xạ từ đề bài sang lời giải&lt;/strong>, không hiểu vì sao lời giải tồn tại.&lt;/p></description></item><item><title>System Design — Mục Lục &amp; Cách Đọc Tài Liệu</title><link>https://thanhhv.github.io/series/system-design/00-muc-luc/</link><pubDate>Mon, 13 Jul 2026 05:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/system-design/00-muc-luc/</guid><description>&lt;blockquote>
&lt;p>Tài liệu chuyên sâu về System Design dành cho Backend Engineer, Senior Backend Engineer, Tech Lead, Solution Architect và Software Architect.&lt;/p>
&lt;p>Mục tiêu: xây dựng &lt;strong>tư duy thiết kế hệ thống&lt;/strong> — không phải bộ sưu tập lời giải phỏng vấn.&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="triết-lý-của-tài-liệu">Triết lý của tài liệu&lt;/h2>
&lt;p>Mọi quyết định kiến trúc trong tài liệu này đều đi theo chuỗi tư duy:&lt;/p>
&lt;pre tabindex="0">&lt;code>Business Requirement
↓
Functional Requirement
↓
Non-functional Requirement
↓
Scale Estimation
↓
Constraint
↓
Bottleneck
↓
Architecture Pattern
↓
Distributed Systems
↓
Trade-off
↓
Production
↓
Evolution
&lt;/code>&lt;/pre>&lt;p>Mọi kết luận kỹ thuật phải trả lời được 5 câu hỏi:&lt;/p></description></item></channel></rss>