Lập trình 22/09/2026 8 phút

Graceful degradation: khi phụ thuộc chết, trả dữ liệu cũ có ích còn hơn trang trắng 500

Amazon từng nói: thà hiển thị gợi ý sản phẩm cũ hơn là để trang trắng. Đó là graceful degradation — khi một phụ thuộc chết hẳn, trả một phản hồi suy giảm nhưng vẫn có ích thay vì lỗi 500. Bài này đo thật trong Go: một handler phụ thuộc cứng chỉ đạt 25% thành công khi downstream chết; thêm fallback bằng stale cache, tỉ lệ thành công lên 100% (150/200 request được phục vụ bằng dữ liệu cũ đánh dấu rõ).

Lập trình 22/09/2026 8 phút

Chọn mẫu chịu tải nào? Cây quyết định và cách ghép 11 mẫu thành một pipeline sống sót

Loạt bài này đi qua 11 mẫu chịu tải, mỗi mẫu giải một vấn đề riêng. Bài tổng kết trả lời câu hỏi thực tế: gặp tình huống X thì dùng mẫu nào, và ghép chúng theo thứ tự nào? Kèm demo thật trong Go ghép bulkhead + circuit breaker + timeout + fallback: cùng một downstream ốm yếu, pipeline nâng tỉ lệ thành công người dùng từ 48% lên 100%, giảm tải xuống downstream từ 500 còn 73 lần gọi, và cắt latency từ 93.9ms xuống 13.3ms.

Lập trình 22/09/2026 8 phút

Dead Letter Queue: một message độc không được phép giữ con tin cả hàng đợi

Một message hỏng không xử lý nổi mà consumer cứ retry mãi sẽ chặn đứng mọi message sau nó. Bài này chạy thật trên Kafka: 10 message với 2 cái độc ở vị trí 3 và 7 — consumer không có DLQ kẹt tại message độc đầu tiên, chỉ xử lý được 2/10; consumer có DLQ tách 2 message độc sang topic riêng sau vài lần retry, xử lý trọn 8 message tốt và hàng đợi không kẹt.

Lập trình 22/09/2026 6 phút

Retry và backoff trong gRPC: để framework tự thử lại, và chỉ thử lại lỗi tạm thời

Viết vòng lặp retry bằng tay ở từng chỗ gọi là lặp code và dễ sai. gRPC có retry policy khai bằng cấu hình. Bài này chạy thật: server fail 2 lần đầu với Unavailable rồi OK — client cấu hình retry tự thử lại và nhận thành công sau đúng 3 lần gọi server (đo bằng counter thật), với backoff tăng dần. Nhưng lỗi InvalidArgument thì không retry: server chỉ bị gọi 1 lần, vì gọi lại input sai vẫn sai.

Lập trình 22/09/2026 9 phút

Fault injection đo thật với Toxiproxy: timeout 1 giây thua latency 300 ms vì một lượt gọi PostgreSQL là 5 lượt phản hồi, retry nâng 69% lên 98,5% với reset nhưng 0/50 với phản hồi cụt, bão retry ×4 tải mà 0% thành công, breaker 22 chờ còn 7

Đặt Toxiproxy giữa client Go và PostgreSQL rồi tiêm năm kiểu lỗi: chậm, treo, reset, cắt phản hồi, tắt hẳn. Latency 300 ms chiều về đánh bại timeout 1.000 ms vì một lượt gọi là khoảng 5 lượt phản hồi, đo 536 ms khi latency 100 ms. Không timeout thì treo quá 20 giây; tắt hẳn thì refused sau 0,3 ms. Reset 30% kết nối: retry 0/1/3 cho 69/94/98,5%; phản hồi cụt 200 byte: 0/50 dù retry 3, tốn 20 giây. Bão retry 50 client: jitter hạ đỉnh từ 50 xuống 20 lượt mỗi 100 ms nhưng vẫn 0% thành công. Breaker 5 lỗi/2 giây: 7 timeout thay vì 22, hồi sau 0,43 giây. Kèm netem loss 20%: p99 3,1 giây.