Eventually Consistent: How Do We Know the Systems Eventually Agree?
Event-driven systems only agree eventually. Here’s how we check they actually got there: deadlines, data ownership, and a reconciliation job that walks the floor.
Tin lập trình mới nhất về distributed-systems, tóm tắt tiếng Việt bằng AI.
Event-driven systems only agree eventually. Here’s how we check they actually got there: deadlines, data ownership, and a reconciliation job that walks the floor.
In this article, we’ll look at the architecture behind Scion.
An API can save an order and crash before publishing the message that tells other services about it.
Event-driven architecture (EDA) phổ biến nhưng tiềm nhiều thách thức trong production environment. Vấn đề truy xuất lỗi (tracing) trở nên phức tạp khi sự kiện (event) đi qua nhiều service khác nhau, đòi hỏi hệ thống phân tích log tập trung như ELK stack. Hàng đợi tin hỏi (dead letter queues) dễ bị đầy nếu không implement validation logic kỹ càng, dẫn đến mất dữ kiện quan trọng. Sự không nhất quán cuối cùng (eventual consistency) gây race condition khi nhiều consumer xử lý cùng event đồng thời. Các EDA system cần thiết kế event schema versioning và comprehensive testing framework với Contract Testing để đảm bảo reliability khi số lượng service tăng lên.
Bài viết này giúp lập trình viên nhận diện và giải quyết các vấn đề phổ biến trong kiến trúc hướng sự kiện như tracing, dead letter queues, tính nhất quán cuối cùng và testing.
Tác giả đã xây dựng Dhara, một distributed task queue bằng Go sử dụng PostgreSQL làm queue duy nhất và nguồn sự thật thực tế. Sử dụng replication của PostgreSQL để đảm bảo high availability và các WAL (Write-Ahead Logging) để đảm bảo data consistency. Cấu trúc hiện tại hỗ trợ tới 5,000 tasks mỗi giây với độ trễ chỉ 10ms. Điều đáng học hỏi là việc tối ưu hóa connection pooling và cách tận dụng tính năng built-in của database để giảm dependency hệ thống.
Bài này giúp bạn hiểu cách xây dựng hàng đợi tác vụ phân tạp hiệu quả với Go và PostgreSQL mà không cần các hệ thống lưu trữ phụ.
Database generated IDs can impact your system design. Generating IDs earlier simplifies asynchronous processing, workflows, and service boundaries.
CAP Theorem xác định rằng trong distributed system chỉ có thể đảm bảo tối đa hai trong ba yếu tố Consistency, Availability, và Partition Tolerance. PACELC mở rộng CAP bằng cách thêm việc phải chọn giữa latency và consistency khi không có partition. Các hệ thống lớn như Amazon Dynamo và Google Bigtable đã chọn Availability và Partition Tolerance với trade-off là eventual consistency. Ngược lại, các hệ thống như Apache Zookeeper và Google Spanner ưu tiên Consistency ngay cả khi ảnh hưởng đến Availability trong trường hợp network partition. Việc hiểu rõ hai định lý này giúp lập trình viên đưa ra quyết định thiết kế phù hợp dựa trên yêu cầu cụ thể của ứng dụng.
Bài viết giúp lập trình viên hiểu rõ các sự đánh đổi trong hệ thống phân tán qua CAP và PACELC để thiết kế ứng dụng hiệu quả.
PyTorch 2.15 ships a rewritten NCCL backend that stops a single failing GPU from forcing a full training restart. The new ProcessGroupNCCL allows only one communicator per process group during initialization, which by default eliminates the crosstalk that the old version's many communicators caused. A third-party orchestrator can now exclude a crashed or slow GPU and assign a replacement worker. A new 'flight recorder' captures operation snapshots for debugging stalls. The legacy backend remains as a rollback option but will be removed in 2.16, planned for early next year. The release also totals 3,117 commits from 583 contributors and includes parallel processing improvements for Apple gear and support for Nvidia's next-generation Blackwell GPUs.
Bài viết chỉ ra hiện tượng coi số lượng dịch vụ microservices như dấu hiệu của kinh nghiệm cao trong ngành phần mềm. Tac giả lấy ví dụ về một dự án có tới 37 dịch vụ độc lập, mỗi dịch vụ được triển khai trong container và kết nối qua API REST/gRPC. Nguyên nhân kỹ thuật là xu hướng tách hệ thống quá sớm mà không xác định rõ ranh giới nghiệp vụ, dẫn đến sự dư thừa trong quản lý cấu hình, giám sát và truy vết lỗi. Hệ quả là tăngภาระ vận hành, độ trễ giao tiếp giữa dịch vụ và khó duy trì tính nhất quán dữ liệu, khiến đội ngũ tiêu tốn nhiều thời gian cho DevOps thay vì phát triển tính năng. Bài học là trước khi quyết định chuyển sang microservices, cần đánh giá độ phức tạp miền vấn đề, cân nhắc sử dụng monolith mô-đun hoặc các dịch vụ có kích thước vừa phải, và chỉ mở rộng khi có bằng chứng thực tế về nhu cầu mở rộng và đội ngũ có khả năng vận hành.
Bài viết này giúp lập trình viên hiểu rằng kiến trúc microservices không phải là thước đo trình độ kỹ năng hay kinh nghiệm senior thực sự.
American Express sử dụng kiến trúc cell-based để xử lý giao dịch thanh toán quy mô lớn. Kiến trúc này chia hệ thống thành các cell độc lập, mỗi cell chứa đầy đủ các dịch vụ cần thiết để xử lý một giao dịch. Khi một cell gặp sự cố, các cell khác vẫn có thể tiếp tục hoạt động, đảm bảo hệ thống không bị sập hoàn toàn. Mô hình này giúp American Express đạt độ sẵn sàng cao, với thời gian downtime chỉ vài giây mỗi năm và xử lý hàng triệu giao dịch mỗi ngày. Các lập trình viên học được cách thiết kế hệ thống phân tán có khả năng chịu lỗi bằng cách cô lập sự cố trong một phạm vi nhỏ.
Bài viết này giúp lập trình viên hiểu cách xây dựng hệ thống xử lý giao dịch đáng tin cậy ngay cả khi gặp sự cố.
Benchmarking a vector index at billion-scale means tracking P99/P99.9 latency, Recall@K, QPS at a fixed recall target, index build time, RSS memory, and CPU usage, since averages hide failures. The team used three datasets for different jobs: SIFT-1B (128-d) to test raw scale, LAION-100M (768-d CLIP floats) to test real float behavior, and a self-built BookCorpus-10M (4096-d, via Llama 2) to approximate LLM-scale embeddings. Building BookCorpus-10M took 16 hours on five GPUs at about 173 vectors/sec, producing 164 GB that restores via cbbackupmgr in 2-3 minutes. Partition elimination, tagging vectors with a key like category_id, let a 10-partition layout skip 90% of the work per query, tightening P99 tail latency and raising throughput per core.
So sánh chi tiết giữa monolithic và microservices vượt qua lý thuyết, bàn về sự phức tạp trong deployment, sự ảnh hưởng của Conway's Law đến ownership team, khó khăn trong debugging và observability, cũng như thách thức về data consistency, performance và scaling. Bài viết chỉ ra monolithic thực sự phù hợp trong những trường hợp nào, khi nào microservices mang lại hiệu quả, và giới thiệu khái niệm "modular monolith" như giải pháp trung gian. Các lỗi phổ biến như resume-driven development hay distributed monoliths được liệt kê kèm framework thực tế để ra quyết định dựa trên team, domain, delivery, operations và scale. Thông điệp chính là chọn architecture dựa trên vấn đề thực tế chứ không phải sự phức tạp giả định.
Bài viết này giúp lập trình viên hiểu rõ sự cân thực giữa kiến trúc microservices và monolithic, tránh những sai lầm phổ biến và đưa ra quyết định kiến trúc phù hợp dựa trên nhu cầu thực tế.
Concurrency control trong hệ thống phân tạp tồn tại hai hình thức khác nhau và hầu hết lỗi hệ thống phân tạp đều do việc áp dụng sai loại concurrency control. Bài viết giải thích sự khác biệt cơ bản giữa arbitration control và serialization control, trong đó arbitration tập trung vào giải quyết xung đột tài nguyên theo thời gian thực, còn serialization đảm bảo thứ tự thực hiện transaction nhất quán. Các nghiên cứu từ Google và Amazon cho thấy đến 67% lỗi phân tạp liên quan đến việc lựa chọn sai cơ chế concurrency control. Lập trình viên nên nắm vững hai mô hình này để thiết kế hệ thống phân tạp có khả năng mở rộng cao và tránh được các lỗi đồng thời phức tạp.
Bài viết giúp lập trình viên hiểu sự khác biệt giữa arbitration và serialization để tránh lỗi phân tán trong hệ thống.
Trong hệ thống phân tán, vấn đề "save-then-publish" có thể gây mất sự kiện (event) mà không ghi log lỗi nào. Nguyên nhân kỹ thuật là transaction database và message broker hoạt động độc lập, dẫn đến tình trạng message bị drop dù insert thành công. Hệ quả là các subscriber không nhận được event cần thiết, làm hỏng tính toàn vẹn dữ liệu. Pattern Outbox + Inbox sử dụng cùng một transaction để lưu cả event và dữ liệu vào database, đảm bảo không mất sót message, thực hiện hiệu quả với Postgres và Node.js.
Bài này giải thích cách tránh mất sự kiện khi lưu trữ dữ liệu bằng pattern Outbox trong Postgres và Node.js.
Vào ngày 23 tháng 9, GitHub đã gặp sự cố với tỷ lệ lỗi 500 và 404 tăng cao trên nhiều trang ứng dụng, bắt đầu từ 07:57 UTC. Nguyên nhân kỹ thuật được cho đến từ vấn đề về routing và phân phối tải (traffic routing) dẫn đến việc không thể định tuyến đúng đến các trang cụ thể. Sự cố này gây ra các trang hiển thị lỗi 404 và lỗi 500 trên nhiều tính năng của GitHub, ảnh hưởng đến trải nghiệm người dùng. Điều đáng học hỏi là ngay cả các nền tảng lớn như GitHub cũng có thể gặp sự cố về routing traffic, nhấn mạnh tầm quan trọng của hệ thống giám sát và dự phòng.
Bài viết cung cấp phân tích ngắn gọn về sự cố GitHub ngày 23/9 giúp lập trình viên hiểu rõ nguyên nhân và bài học từ sự cố này.
Ampbase đã triển khai control plane hoàn toàn trên Tigris object storage mà không sử dụng database truyền thống dưới lớp. Họ đã tự xây dựng bốn nguyên tố cơ bản của database (CRUD operations, indexing, transactions và consistency) trực tiếp trên object storage. Vấn đề phát sinh khi xử lý transaction và consistency, đặc biệt là khi dữ liệu lớn, dẫn đến performance không ổn định. Bài viết cung cấp bài giá trị thực tế về giới hạn của object storage khi làm database, hữu ích cho ai đang cân nhắc kiến trúc serverless.
Bài này giúp bạn hiểu cách xây dựng hệ thống control plane hoàn toàn bằng object storage mà không cần database truyền thống.
Trước khi chuyển sang microservices, hãy tự hỏi 5 câu hỏi quan trọng vì hầu hết nỗi ân hận chỉ xuất hiện sau 18 tháng khi gặp phải các vấn đề hệ thống phân tán.
Lập trình viên nên đọc bài này để tránh rơi vào lỗi "phân tích quá muộn" khi hệ thống lớn lên, khi các vấn đề phân tán và quản lý không ngờ đến đã khiến dự án gặp khó khăn mà không có chiến lược phân tích trước.
Bài viết giới thiệu các khái niệm cơ bản về microservices, so sánh với kiến trúc monolith, giải thích về modular monoliths, giao tiếp giữa các service, định lý CAP, hệ thống phân tán và các best practices trong kiến trúc microservices.
Nếu bạn đang phát triển ứng dụng lớn hoặc muốn nâng cấp kiến thức về thiết kế hệ thống phân tán, Microservices Fundamentals Complete Guide sẽ giúp bạn hiểu rõ cách chuyển đổi từ kiến trúc monolith sang microservices, tối ưu hóa giao tiếp giữa dịch vụ và tránh rủi ro của hệ thống phân tán.
A runnable MQTT crash/reconnect example shows why a database commit needs a durable event key. Compare a naive counter with atomic SQLite deduplication.
Khi thiết kế phần mềm, các yêu cầu bạn không có cũng quan trọng như những yêu cầu bạn có. Việc xác định điểm có thể thỏa hiệp, như thứ gì có thể chạy chậm, giúp định hướng quyết định kỹ thuật. Quá trình này giúp tránh lãng phí tài nguyên vào các tính năng không mang lại giá trị cao cho người dùng cuối. Các đội nhóm thành công thường tập trung vào việc loại bỏ các requirements non-functional không cần thiết thay vì cố gắng tối ưu hóa mọi thứ.
Hiểu những yêu cầu không có giúp bạn thiết kế phần mềm linh hoạt hơn và tập trung vào giá trị cốt lõi.
Vào ngày 6 tháng 8 năm 2026, GitHub gặp sự cố nghiêm trọng khi GitHub Actions bị suy giảm hoạt động trong khoảng 9 giờ. Báo cáo sự cố công khai của GitHub cho biết nguyên nhân liên quan đến tình trạng bão hòa (saturation) hệ thống.
Đọc bài này để hiểu cách các hệ thống cloud lớn như GitHub xử lý áp lực từ hàng nghìn yêu cầu đồng thời, giúp bạn dự đoán và thiết kế hệ thống chịu tải tốt hơn trong thực tế công việc.
Sự gia tăng các thao tác write đang đặt áp lực lên các hệ thống mà mọi repository đều phụ thuộc. Vấn đề kỹ thuật chính là cách xử lý lượng requests Git ngày càng tăng, đặc biệt với sự phát triển của agent-scale development. Hệ quả bao gồm tình trạng latency cao và risk of system failure khi quy mô mở rộng. Giải pháp của họ bao gồm implementing sharding strategy và sử dụng Git LFS để giảm tải cho servers. Điều đáng học là việc tối ưu hóa Git infrastructure cần kết hợp cả cải tiến kỹ thuật lẫn thiết kế hệ thống phân tán.
Bài viết này giúp lập trình viên hiểu cách xây dựng hạ tầng Git có khả năng mở rộng để phát triển trên quy mô lớn của các tác nhân.
Paul Mockapetris phát minh ra DNS vào năm 1983 để giải quyết vấn đề hệ thống tên máy tính phức tạp thời bấy giờ. Nguyên nhân kỹ thuật là nhu cầu thay thế file hosts.txt cồng kềnh, vốn phải được phân phối thủ tục qua FTP mỗi khi có thay đổi. Hệ quả là DNS ra đời với cấu trúc phân cấp và cơ chế caching, cho phép mở rộng quy mô Internet toàn cầu. Bài viết tiết lộ các quyết định thiết kế quan trọng như giới hạn độ dài tên domain 63 ký tự và tổng 255 ký tự. Lập trình viên nên đọc để hiểu sâu về tư duy engineering đằng sau một trong những giao thức nền tảng của Internet.
Bài này giúp bạn hiểu nguồn gốc và quá trình phát minh ra hệ thống DNS qua câu chuyện của nhà sáng tạo Paul Mockapetris.
Byzantine Fault là vấn đề nghiêm trọng trong hệ thống phân tán khi nhiều node độc lập có thể thất bại theo bất kỳ cách nào, kể cả phá intentionally. Nguyên nhân kỹ thuật nằm ở việc khó phân biệt giữa lỗi ngẫu nhiên và hành động có chủ ý của các node độc lập. Hệ quả là có thể dẫn đến toàn bộ hệ thống đưa ra kết quả sai nếu không có giải pháp phù hợp. Điều đáng học là các giải pháp như Practical Byzantine Fault Tolerance (PBFT) hay Paxos có thể đạt được consensus trong hệ thống có đến 1/3 node bị tấn công, đòi hỏi chiếu toán cao và thuật toán phức tạp.
Bài viết giải thích rõ ràng về Byzantine Fault - vấn đề nền tảng trong xây dựng hệ thống phân phối đáng tin cậy cho lập trình viên.
Bối cảnh triển khai LLM-based agent đến production phải chọn giữa synchronous (chặn xử lý) và asynchronous (không chờ) execution. Synchronous pattern gặp rủi ro timeout như giới hạn 29-second của AWS API Gateway với tác vụ dài, trong khi asynchronous dùng job queues, background workers và checkpointing để tách biệt tác vụ. Hệ quả là asynchronous yêu cầu cơ sở hạ tầng phức tạp hơn như RabbitMQ, Redis, PostgreSQL hay MongoDB để quản lý trạng thái worker. Điều đáng học là bắt đầu với synchronous cho tác vụ nhanh như question-answering, sau đó migrate sang asynchronous khi workflow phức tạp hơn, như minh họa trong code examples sử dụng Python's asyncio.
Bài viết này giúp lập trình viên hiểu rõ hai mẫu kiến trúc triển khai agent LLM vào production để lựa chọn phù hợp với quy mô và yêu cầu ứng dụng.
Agents tại Anthropic đã làm tăng khối lượng job CI lên 25 lần, biến nó thành trở ngại chính. Giải pháp tăng tốc pipeline vẫn chưa khắc phục được vấn đề cốt lõi vì chúng chỉ kiểm tra repository chứ không phải hệ thống phân tán mà hệ thống phải tương tác. Sự gia tăng job CI này cho thấy mô hình truyền thống không còn phù hợp với quy mô và độ phức tạp hiện tại. Cần tư duy lại về cách thiết kế CI/CD để kiểm tra toàn hệ thống, không chỉ là code đơn thuần. Bài này có giá trị cho lập trình viên làm việc với các hệ thống lớn và phân tán.
Đọc bài này giúp bạn hiểu tại sao tối ưu CI bằng cách tăng tốc pipeline không giải quyết được vấn đề khi agents làm tăng khối lượng công việc lên gấp 25 lần.
SingleStore giới thiệu Query Tuning Agent giúp tự động tối ưu hóa hiệu suất truy vấn. Công cụ này phân tích debug profiles và đưa ra đề xuất chuyên sâu cho các distributed workloads phức tạp. Nguyên nhân kỹ thuật là việc tối ưu hóa thủ công truy vấn phức tạp trong database phân tán đòi hỏi kiến thức chuyên môn cao và nhiều thời gian. Hệ quả là Query Tuning Agent giúp giảm đáng kể thời gian xử lý và cải thiện hiệu suất hệ thống. Điểm đáng học là cách kết hợp auto-tuning với phân tích profile để mang lại giải pháp tối ưu mà không cần can thiệp trực tiếp vào code.
Trình điều truy vấn của SingleStore tự động tối ưu hóa hiệu suất và cung cấp khuyến nghị chuyên gia cho các tải trọng phân phức tạp.
Để xây dựng một agent harness có khả năng chịu được crash và restart, tác giả đề xuất mô hình mỗi lần chạy agent như state bền vững với id, cursor và version, lưu trữ trong SQLite (hoặc Postgres cho đa tiến trình). Hệ thống checkpoint trước và sau các bước có side effect, sử dụng compare-and-swap dựa trên version để ngăn chèn chéo giữa các worker đồng thời. Các tool call được bảo vệ chống retry bằng idempotency key được sinh từ run_id và step index, với fallback dedup table cho dịch vụ không hỗ trợ idempotency. Bài viết bao gồm code Python hoàn chỉnh, test crash-and-recovery thực tế, và khuyến cáo theo dõi các bước ở trạng thái RUNNING sau recovery và cảnh báo nếu bước đó vượt TTL.
Lập trình viên nên đọc bài này để học cách xây dựng hệ thống agent bền vững, xử lý lỗi hiệu quả và quản lý trạng thái trong môi trường phân tán.
Bối cảnh nghiên cứu này tập trung vào việc kiểm thử các hệ thống phân tán bằng suite test do AI tạo ra. Nguyên nhân kỹ thuật là do việc kiểm thử hệ thống phân tán phức tạp do race conditions và điều kiện cạnh tranh, dẫn đến các lỗi an toàn phân tán khó phát hiện. Hệ quả nghiên cứu cho thấy mutation testing có thể đánh giá hiệu quả 82% test suite do AI tạo ra cho hệ thống Apache Kafka. Điều đáng học là phương pháp kết hợp AI với mutation testing giúp phát hiện các lỗi an toàn phân tán mà các kỹ thuật kiểm thử truyền thống có thể bỏ sót, từ đó nâng cao độ tin cậy của các hệ thống phân tán.
Bài viết này giúp lập trình viên hiểu cách đánh giá độ tin cậy của bộ kiểm thử AI được tạo ra cho hệ thống phân tán.
Bối cảnh là hệ thống write-heavy với hub và nhiều worker xử lý traffic ứng dụng, mỗi node ghi events tại chỗ. Nguyên nhân kỹ thuật là việc chia tách dữ liệu giúp giảm tải nhưng gây khó khăn trong tổng hợp dữ liệu từ các node. Hệ quả là tạo nhu cầu về replication giải quyết bài toán tổng hợp dữ liệu phân tán. Điều đáng học là Postgres logical replication sau 10 năm phát triển đã trở thành giải pháp hiệu quả với latency dưới 50ms và khả năng scale-out với thousands of replicas. Bài gốc đi sâu vào implementation details và best practices khi sử dụng Postgres logical replication cho các hệ thống phân tán.
Bài viết này giải thích cách Postgres logical replication thay đổi kiến trúc hệ thống trong thập kỷ qua và ứng dụng thực tế.
Tracing is a valuable tool in software development that helps prevent issues when making changes by providing visibility into system behavior and performance. It involves monitoring and recording the flow of data or events as they move through a system. Tracing in a distributed system includes components such as tracer, span, context propagation, correlation ID, instrumentation, data store, and visualization and analysis tools. OpenTracing, OpenTelemetry, Zipkin, and Jaeger are widely used distributed tracing libraries. Digma is an observability tool that provides insights and feedback during development.
Learn the basics of distributed systems
A Tier-0 multi-region Kafka cluster needs three regions, a replication factor of 6, min.insync.replicas=3, and acks=all to keep accepting writes when an entire region fails. With six replicas spread across regions, losing one region drops the in-sync set to four, still above the minISR of three, so writes continue. A second broker restart during the outage can drop ISR to three without halting writes, but any further drop stops them. KRaft controllers need separate quorum planning: a 2+2+1 distribution across five controllers tolerates one region loss, and Kafka 3.9's dynamic quorum (KIP-853) lets you remove failed controllers without restarting the cluster. WAN degradation between healthy regions can be more dangerous than a hard outage, since replication lag can push ISR below minISR and halt writes under CAP theorem trade-offs. Recovery of a failed region can be controlled by throttling replica catch-up, at the cost of a longer recovery time.
Master message queues in distributed systems. Learn how SQS, Kafka, and RabbitMQ handle ACKs, delivery guarantees, partitioning, and dead-letter queues.
A 20-box self-check across six stages, and a free 7-page roadmap with the plan for each one.
Learn how idempotency keys prevent duplicate API operations caused by retries, timeouts, and network failures in backend and distributed systems.
How we made clusters scale up on demand and resize without downtime, and rebuilt our control plane along the way.
Learn how Datadog built FETCh to continuously validate production behavior against TLA+ specifications and uncover a subtle bug that conventional testing had not exposed.
Agentic AI promises autonomy, but poor failure recovery can trigger duplicate transactions and costly production failures. What must change.
Polars Cloud becomes Polars Nanook as the platform matures beyond cloud managed compute to a full data platform for both cloud and on-premise (airgapped) environments.
Đọc tin ở đây, luyện code, học theo lộ trình và luyện IELTS trên các sản phẩm anh em — tất cả kết nối với nhau trong hệ sinh thái 8 Sync.
Cổng chính của hệ sinh thái: giới thiệu sản phẩm, blog và bảng giá trọn bộ.
Khám pháHọc theo lộ trình rõ từng chặng: video, quiz chấm tự động, certificate và mentor đang làm nghề.
Xem lộ trình1.000 bài DSA, đề tiếng Việt, chấm tự động 7 ngôn ngữ — nhiều bài FREE, chạy ngay trên trình duyệt.
Luyện miễn phíChấm bốn kỹ năng IELTS bằng AI, phản hồi chi tiết theo rubric.
Dùng thử miễn phíAI IDE 22 MB cho dev Việt.
Tải miễn phíBộ nhớ tổ chức cho AI agent.
Khám pháAI trực Fanpage, tự sàng lọc lead.
Dùng thử