#system-design
56 bài viết về chủ đề này
Monitoring Microservices — Log, Metric & Correlation ID (BMS)
Giám sát microservices: ba trụ quan sát (log, metric, tracing) và correlation ID để theo dõi request xuyên nhiều service.
Backpressure — Khi producer nhanh hơn consumer thì sao?
Backpressure giúp hệ thống không sụp khi producer nhanh hơn consumer: drop, block, backoff hay adaptive. Kèm code Go thực chiến.
Communication Implementation — REST, gRPC & Message Brokers (BMS)
Chọn công nghệ giao tiếp giữa microservices: so sánh REST, gRPC và message broker, tiêu chí lựa chọn và schema evolution.
Idempotency key — Chống trừ tiền 2 lần khi API bị retry
Idempotency key giúp API xử lý an toàn khi client retry: trùng request vẫn trả kết quả cũ, không bao giờ trừ tiền 2 lần.
Microservices không phải lựa chọn mặc định (Building Microservices)
Afterword Building Microservices: khi nào nên và không nên dùng microservices, cạm bẫy tách nhỏ quá sớm và khởi đầu an toàn với monolith.
Thundering Herd — Khi cache hết hạn là cả hệ thống sụp
Thundering herd là gì? Khi một key cache 'nóng' hết hạn, hàng chục nghìn request cùng đổ vào database. Kèm cách chặn: singleflight, Redis lock và jitter TTL.
Evolutionary Architect — Vai trò kiến trúc sư thời microservices
Vai trò kiến trúc sư trong kỷ nguyên microservices: governance bằng principles, fitness functions, paved road và quản lý tech debt.
Conway's Law & Team Topologies — Tổ chức team theo dòng chảy (BMS)
Conway's Law: cấu trúc team quyết định kiến trúc hệ thống. Stream-aligned teams, platform teams, cognitive load và cách tổ chức team cho microservices.
User Interfaces & Micro Frontends — Chia UI theo team (BMS)
UI composition cho microservices: page-level, server-side (SSI/ESI), client-side — micro frontends và cách tránh UI monolith.
Scaling Microservices — 4 trục scale: vertical & horizontal (BMS)
Scaling microservices qua 4 trục: vertical, horizontal duplication, data partitioning và functional decomposition — khi nào dùng trục nào, kèm caching và CQRS.
Resiliency — CAP, Circuit Breaker & Chaos Engineering (BMS)
CAP theorem, circuit breaker, bulkhead và chaos engineering — cách xây dựng microservices phục hồi được khi sự cố xảy ra.
Kafka, RabbitMQ hay Redis Streams? Chọn message queue cho backend
So sánh Kafka, RabbitMQ và Redis Streams: ưu nhược điểm, khi nào dùng cái nào, kèm code Go consumer với retry và dead letter queue.
Zero Trust, mTLS & OAuth — Bảo mật microservices hiện đại (BMS)
Zero Trust, mTLS, OAuth 2.0 và mã hoá dữ liệu — các lớp bảo mật thiết yếu cho hệ thống microservices.
Testing Microservices — Test Pyramid & E2E (Building Microservices)
Test pyramid, consumer-driven contract test và E2E — cách giữ cho microservices deploy độc lập mà vẫn an toàn.
Container & Deployment Microservices — K8s & Progressive Delivery
Tổng quan deployment microservices: container Docker, Kubernetes orchestration, progressive delivery (canary, blue-green, feature flags).
Build & CI/CD Pipeline cho Microservices — Từ code đến deploy (BMS)
CI/CD, monorepo vs multirepo, build artifact — cách quản lý build pipeline cho hệ thống microservices hiệu quả.
End-to-End Correctness & Đạo đức dữ liệu — Tương lai data systems
Phân tích chương cuối DDIA: làm sao đảm bảo tính đúng đắn end-to-end trong distributed systems, và trách nhiệm đạo đức khi xây dựng data systems.
Thiết kế Workflow cho Microservices — Orchestration vs Choreography
Phân biệt orchestration vs choreography trong microservices workflow, cách implement Saga pattern với compensating transactions.
Data Integration & Unbundling Databases — Tách database thành những chuyên gia nhỏ (DDIA)
Tìm hiểu khái niệm unbundling databases của Martin Kleppmann: thay vì database monolithic, hãy tách thành các chuyên gia riêng biệt kết nối qua stream
Stream Joins & Fault Tolerance — Join và xử lý lỗi stream (DDIA)
Tìm hiểu 3 kiểu stream join (stream-stream, stream-table, table-table) và cơ chế fault tolerance — checkpointing, exactly-once trong streaming (DDIA).
Communication Styles — Giao tiếp Microservices(Building Microservices)
Khám phá 3 kiểu giao tiếp microservices: Request/Response (REST, gRPC), Event-Driven (message broker), và Service Discovery. Hiểu ưu nhược điểm từng pattern.
Event Streams, CDC & Event Sourcing — Cốt lõi stream processing (DDIA)
Tìm hiểu về Event Streams, Change Data Capture (CDC) và Event Sourcing — ba khái niệm quan trọng trong stream processing được trình bày trong DDIA chương 11.
Branch by Abstraction & Saga — Split Monolith (Building Microservices)
Branch by Abstraction, Saga, UI Composition — ba pattern thực tế để chia nhỏ monolith an toàn, từng bước, không đau đớn.
Vẽ sơ đồ kiến trúc với SVG — Nhúng trực tiếp trong blog
Cách vẽ sơ đồ kiến trúc hệ thống bằng SVG thuần, nhúng trực tiếp vào markdown không cần công cụ bên ngoài.
Consistent Hashing — Thuật toán phân phối tải đồng đều
Consistent Hashing giúp distributed systems thêm/xoá node mà không cần rehash toàn bộ. Từ Redis Cluster đến load balancer — tất cả đều dùng.
DDD & Bounded Context — Tách Microservices (Building Microservices)
Tìm hiểu cách ứng dụng Domain-Driven Design và Bounded Context để phân định ranh giới microservices — từ lý thuyết đến thực hành.
Xử lý dữ liệu theo lô — Unix Philosophy & MapReduce (Designing Data-Intensive Applications)
Unix pipes và MapReduce — từ sort/grep/awk trên một máy đến MapReduce chạy trên cả cluster. Tìm hiểu triết lý xử lý dữ liệu theo lô trong DDIA.
Splitting the Monolith — Chiến lược & pattern (Building Microservices)
Chiến lược chia nhỏ monolith: Strangler Fig, bounded context, tách database, xử lý transaction trong hệ phân tán.
Beyond MapReduce — Spark, Flink và thế hệ data processing mới (DDIA)
MapReduce ghi intermediate state ra disk giữa mỗi phase — đây là điểm yếu chí tử. Spark, Flink, Tez thay thế bằng DAG pipeline, xử lý trong memory, hỗ trợ cả batch lẫn streaming.
Model Microservices — DDD & Bounded Context (Building Microservices)
Domain-Driven Design là chìa khóa để xác định ranh giới microservices. Chapter 2 nói về bounded context, ubiquitous language và cách áp dụng DDD vào thực tế.
Unix Philosophy & MapReduce — Xử Lý Batch Trong Hệ Phân Tán (DDIA)
Unix pipes là nguồn cảm hứng cho MapReduce — cách các hệ thống batch processing xử lý dữ liệu quy mô lớn với triết lý đơn giản
Microservices — Khái niệm, lợi ích & cạm bẫy (Building Microservices)
Giới thiệu microservices: định nghĩa, key concepts, so sánh với monolith, pain points và khi nào nên dùng từ cuốn Building Microservices.
Ordering Guarantees & Consensus — Total Order, 2PC, Raft và ZooKeeper (DDIA)
Khám phá các cơ chế ordering guarantees và consensus trong distributed systems: total order broadcast, 2PC, Raft consensus algorithm, và ZooKeeper.
Linearizability — Mô hình đồng nhất dữ liệu mạnh nhất (DDIA)
Linearizability là mô hình consistency mạnh nhất trong distributed systems. Tìm hiểu cách nó hoạt động, khi nào cần, và cái giá phải trả.
Unreliable Clocks & Byzantine Faults — Khi thời gian trong máy tính không còn đáng tin (DDIA)
Khám phá vấn đề đồng hồ không đáng tin và Byzantine faults trong distributed systems — hai thử thách lớn khi xây dựng hệ thống phân tán
Partial Failures & Unreliable Networks — Khi hệ thống phân tán gặp sự cố (DDIA)
Chương 8 DDIA phân tích bản chất của partial failure trong distributed systems — từ network faults, timeouts đến cách thiết kế hệ thống chịu lỗi.
Serializable Isolation — 2PL và SSI cho Distributed Systems (DDIA)
So sánh Two-Phase Locking (pessimistic) và Serializable Snapshot Isolation (optimistic) — hai cơ chế đạt Serializable isolation trong cơ sở dữ liệu phân tán.
ACID & Weak Isolation Levels — Transactions trong hệ thống (DDIA)
Tìm hiểu ACID và weak isolation levels — Read Committed, Snapshot Isolation — trong cơ sở dữ liệu quan hệ.
Circuit Breaker Pattern — đừng để một service chết kéo sập cả hệ thống
Tìm hiểu Circuit Breaker pattern — cách ngăn chặn cascade failure trong microservices với code Go thực tế.
Rebalancing Partitions & Request Routing — Hệ thống phân tán (DDIA)
Rebalance partition khi thêm/bớt node: consistent hashing, dynamic partitioning, fixed partitions và request routing trong distributed systems.
Partitioning Strategies — Hash & Key-Range Partitioning, Secondary Indexes (DDIA)
Phân tích hai chiến lược partitioning chính: key-range và hash partitioning, kèm cách xử lý secondary indexes, skewed workloads trong hệ thống phân tán.
Multi-Leader & Leaderless Replication — Hai mô hình replication mở rộng (DDIA)
Multi-leader và leaderless replication là hai mô hình replication cho hệ thống phân tán. Tìm hiểu về quorum, CRDT, conflict resolution, read repair, sloppy quorum và khi nào dùng chúng.
Leaders, Followers & Replication Lag — Cơ chế replication (DDIA)
Single-leader replication trong distributed systems — cách leader ghi dữ liệu, follower đồng bộ, và những vấn đề replication lag gây ra.
Dataflow — DB, REST/RPC, Message-Passing: Ba cách dữ liệu di chuyển giữa các hệ thống (DDIA)
Khám phá ba mode dataflow trong distributed system — qua database, qua REST/RPC, và qua message-passing — và cách schema evolution ảnh hưởng đến từng mode (Designing Data-Intensive Applications Chương 4)
Encoding & Schema Evolution — Thrift, Protobuf, Avro và bài toán tương thích dữ liệu (DDIA)
Binary encoding formats — Thrift, Protocol Buffers, Avro — giúp giải quyết vấn đề gì so với JSON/XML? Làm sao để schema evolution an toàn khi deploy microservices?
OLAP & Column-Oriented Storage — Khi phân tích dữ liệu cần tốc độ (DDIA)
Tìm hiểu sự khác biệt giữa OLTP và OLAP, kiến trúc data warehouse, và cách column-oriented storage tối ưu hoá truy vấn phân tích hàng terabyte dữ liệu (Designing Data-Intensive Applications Chương 3)
Hash Indexes, SSTables, LSM-Trees & B-Trees — Cấu trúc dữ liệu đằng sau storage engine (DDIA)
Khám phá các cấu trúc dữ liệu nền tảng của database: hash indexes, SSTables, LSM-Trees và B-Trees qua lăng kính DDIA
Database Index — Câu chuyện về thứ giúp query của bạn nhanh hơn 100 lần
Database Index — cấu trúc dữ liệu thần kỳ giúp query tốc độ từ O(n) thành O(log n). Cùng mình tìm hiểu B-Tree, cách index hoạt động, và kinh nghiệm dùng index trong thực tế.
Graph Data Models — Cypher, SPARQL, Datalog: Ba cách tiếp cận dữ liệu đồ thị (DDIA)
Khám phá ba ngôn ngữ truy vấn đồ thị phổ biến — Cypher của Neo4j, SPARQL của RDF và Datalog — qua lăng kính của cuốn Designing Data-Intensive Applications
Caching trong System Design — không chỉ là chuyện 'lưu tạm'
Cache là một trong những kỹ thuật cơ bản nhất trong system design, nhưng dùng sai còn hại hơn không dùng. Bài này giải thích các pattern cache phổ biến và cái bẫy cache invalidation.
Data Models & Query Languages — Cách dữ liệu được tổ chức và truy vấn (DDIA)
Relational vs Document models, schema-on-read/write, declarative vs imperative query languages — tóm tắt Chương 2 DDIA của Martin Kleppmann
Rate Limiting — Vũ khí bảo vệ API không thể thiếu
Tìm hiểu về rate limiting trong system design: Token Bucket, Leaky Bucket, Fixed Window, Sliding Window — và cách triển khai thực tế.
Maintainability & Summary — Ba nguyên tắc để hệ thống dễ bảo trì (DDIA)
Maintainability là trụ cột thứ ba trong Chapter 1 của DDIA — gồm Operability, Simplicity, và Evolvability. Hệ thống không chỉ cần chạy tốt, mà còn phải dễ bảo trì và phát triển lâu dài.
Reliability & Scalability — Hai trụ cột đầu tiên của Data System (DDIA)
Bài đầu series DDIA: Reliability và Scalability - hai yếu tố nền tảng khi xây dựng hệ thống dữ liệu lớn. Tóm lược chương 1 cuốn Designing Data-Intensive Applications.
Thiết kế Rate Limiter — chuyện không chỉ đơn giản là đếm
Rate limiter là thứ backend dev nào cũng nghe qua, nhưng thiết kế sao cho đúng thì không phải ai cũng biết. Câu chuyện từ basic Token Bucket tới distributed với Redis.
Rate Limiting — mấy thuật toán mà backend dev nào cũng gặp
Rate limiting không chỉ là chuyện 'chặn spam' — Token Bucket, Leaky Bucket, Fixed Window và Sliding Window có gì khác nhau? Bài này giải thích đơn giản, dễ hiểu.