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

Idempotency key trong Go: đảm bảo một thao tác chỉ thực thi đúng một lần

Retry ở bài trước chỉ an toàn khi thao tác lũy đẳng. Idempotency key là cách biến thao tác có side effect thành lũy đẳng: client sinh khóa duy nhất, server dedup. Đo thật trong Go: không idempotency retry 5 lần tạo 5 đơn; có thì chỉ 1, kể cả 100 goroutine đồng thời.

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

Distributed tracing với OpenTelemetry trong Go: lần theo một request qua nhiều dịch vụ

Log rời rạc không cho biết thời gian một request nằm ở đâu khi nó đi qua API, DB, cache. Distributed tracing nối tất cả bằng một trace_id và quan hệ cha-con giữa span. Đo thật trong Go với OpenTelemetry: dựng cây trace, và chi phí một span 50 ns (tắt) đến 763 ns (ghi đủ) — sampling là nút chỉnh.

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

Distributed lock với Redis trong Go: SET NX PX và Lua unlock an toàn

Mutex chỉ khóa trong một tiến trình. Khi nhiều máy chủ tranh một tài nguyên, cần khóa ngoài tiến trình. Bài dựng distributed lock bằng Redis trong Go: SET NX PX để lấy, Lua so sánh-rồi-xóa để trả an toàn. Đo thật: loại trừ đúng 1 người, 50 goroutine đỉnh critical section = 1, và những cái bẫy.

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

Consensus với Raft trong Go: bầu leader và nhân bản log qua đa số

Khóa Redis có thể sai khi failover. Raft giải bài toán đồng thuận: nhiều node thống nhất một log lệnh dù có node chết, miễn đa số còn sống. Bài dựng cụm 3 node hashicorp/raft thật trong Go: đo bầu leader, nhân bản log đồng nhất, và failover — leader chết thì cụm tự bầu leader mới ở term cao hơn.

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

Service discovery trong Go: đăng ký, health check TTL và round-robin

Địa chỉ cứng không co giãn: dịch vụ scale, chết, đổi IP thì client không biết. Service discovery giải bằng sổ đăng ký động — dịch vụ tự đăng ký và heartbeat, client tra để tìm bản sống. Bài dựng registry trong Go và đo thật: round-robin phân đều 3/3/3, health check loại bản chết, traffic tự né.

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

Distributed tracing: khi metric chỉ nói 'chậm', trace chỉ đúng span nào ngốn thời gian

Metric báo checkout p99 = 127ms. Nhưng 127ms đó tiêu ở đâu — validate, query DB, hay gọi payment? Metric không biết. Bài này dựng thật tracing với OpenTelemetry và Jaeger: tạo span lồng nhau, export, rồi query Jaeger API lấy trace thật — và thấy ngay queryDB ngốn 91ms (72% tổng) trong khi validate chỉ 3.85ms. Đây là thứ metric tổng hợp không bao giờ chỉ ra được.