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

Consistent hashing: đo thật trên một triệu khoá — thêm node thứ 11 thì modulo chuyển 90,9% khoá, vòng băm 9%, và vòng băm với hàm băm kém lệch tải 3 lần

Một triệu khoá, cụm 10 node, thêm thành 11 rồi bớt về 9. Modulo chuyển 90,9% và 90,0% khoá — gần như toàn bộ cache miss hoặc toàn bộ dữ liệu di chuyển. Vòng băm với 1.000 node ảo chuyển 9,0% và 10,1%, sát lý tưởng; jump hash 9,0% và 10,0% với 0 byte bảng. Nhưng vòng băm có hai bẫy đo được: ít node ảo thì một node gánh 27 lần node khác (3,185× so với 0,118×), và hàm băm trộn kém — FNV-1a trên chuỗi node-i#j — làm các điểm ảo dính chùm, lệch 3,026× dù có 100 node ảo. Jump hash cân nhất (1,005×) nhưng chỉ thêm bớt được node cuối; vòng băm bớt node giữa chỉ chuyển đúng khoá của node đó.

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

Giao dịch phân tán: đo thật 2PC bằng PREPARE TRANSACTION trên hai PostgreSQL — đắt gấp 1,5 lần, điều phối chết giữa chừng là khoá bị giữ vô thời hạn, và saga rẻ hơn nhưng người ngoài thấy trạng thái dở 34,6% thời gian

Trừ ví ở PostgreSQL này, tạo đơn ở PostgreSQL kia. Hai commit rời: bước hai hỏng là tiền mất không dấu vết, 100/100 lần. 2PC bằng PREPARE TRANSACTION rồi COMMIT PREPARED: đúng 100/100, giá 0,45 so với 0,30 ms vì thêm hai lượt mạng và fsync cho bản ghi prepare; điều phối viên chết giữa hai pha thì hai giao dịch treo trong pg_prepared_xacts, sống qua restart, giữ khoá dòng vô thời hạn. Saga với bước bù: đúng 100/100, rẻ nhất 0,20 ms, nhưng người đọc ngoài thấy ví và đơn không khớp 34,6% thời gian; 2PC cũng lộ 11,5% vì hai COMMIT PREPARED không đồng thời.

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

CRDT: đo thật ba bản sao tách mạng rồi gặp lại — G-Counter hội tụ đúng 30.000 sau 2 vòng, bộ đếm hợp nhất bằng max mất 20.000, và OR-Set tốn gấp 34 lần một tập thường

Ba bản sao Go đồng bộ kiểu anti-entropy qua HTTP, mỗi bản sao tăng bộ đếm 10.000 lần trong khi bản sao thứ ba bị cắt mạng. Nối lại: G-Counter hội tụ về đúng 30.000 ở cả ba sau 2 vòng đồng bộ và 1,3 ms; bộ đếm kiểu một số hợp nhất bằng max cho 10.000, mất 20.000 lần đếm; LWW-register giữ bản của đồng hồ nhanh nhất, cũng mất hai phần ba. Giỏ hàng OR-Set với thêm và xoá đồng thời ở hai bản sao hội tụ giống hệt nhau theo luật add-wins, kèm tombstone không bao giờ tự mất. Giá: OR-Set 1.000 phần tử chiếm 150,8 KB so với 4,4 KB của tập thuần, còn G-Counter chỉ 13 byte.

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

Phát hiện lỗi: đo thật heartbeat qua mạng có jitter — timeout 300 ms báo oan 9 lần một phút, phi accrual im lặng nhưng phát hiện chết chậm gấp 5, và gossip 100 nút đổi 9.900 thông điệp lấy 194

Heartbeat UDP 100 ms giữa hai container, năm bộ dò chạy song song: timeout cố định 300 ms, 1 s, 3 s và phi accrual ngưỡng 8, 12. Mạng ổn định: phi phát hiện chết sau 157 ms, không ai báo oan. Thêm jitter 80±60 ms và mất 15% gói bằng tc netem: timeout 300 ms báo oan 9 lần trong 60 giây, phi>12 im lặng nhưng chậm lại 635 ms. Dừng tiến trình 600 ms bằng SIGSTOP: trên mạng ổn định mọi bộ dò nhanh đều báo oan, kể cả phi; trên mạng jitter phi im lặng vì đã học khoảng cách rộng, rồi trả giá 831 ms khi chết thật. Gossip 100 nút: 194 thông điệp một vòng thay vì 9.900, Tfail 3 nghi oan 471.970 lần.

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

Sharding: đo thật trên 5 PostgreSQL — chia theo khoảng với khoá Zipf lệch 3,75 lần, hash cũng lệch 1,54 vì một user không chia nhỏ được, thêm mảnh bằng mod N dời 80% khoá, và đọc trong lúc dời trượt 48% nếu không đọc kép

Năm container PostgreSQL 16 làm năm mảnh, 200.000 sự kiện của 100.000 user. Chia theo khoảng user_id đẹp với khoá đều (lệch 1,00) nhưng với khoá Zipf thì mảnh đầu ôm 187.329 dòng, lệch 3,75; hash cũng lệch 1,54 vì user #0 một mình chiếm 13,5% dữ liệu. Muối top-10 user nóng hạ xuống 1,25, đổi lại đọc user nóng phải hỏi 4 mảnh. Chia theo thời gian dồn mọi dòng mới vào một mảnh: ghi chậm 1,6 lần. Thêm mảnh thứ 5: mod N dời 79,9% khoá, jump hash dời 20,0%; dời thật 39.684 dòng mất 251 ms, bộ đọc chỉ hỏi vị trí mới trượt 47,8%, đọc kép mới rồi cũ trượt 0.

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

Phân vùng mạng thật bằng iptables: cắt một nút etcd 20 giây — thiểu số từ chối ghi sau đúng 1,1 s nhưng vẫn trả lời đọc serializable cũ 20 giây, cô lập leader làm đa số mất 2 s, và lease biến mất ở đa số 0,71 s trước khi người giữ hay

Cụm etcd ba nút, cắt mạng thật bằng iptables trong network namespace của từng container, client Go đo cả ba nút mỗi 100 ms. Cô lập một follower: hai nút còn lại ghi 202/202, nút bị cắt ghi 1/21 và đọc tuyến tính 1/21 nhưng đọc serializable 21/21 với dữ liệu cũ dần tới 20 giây, không một lỗi nào. Cô lập leader: đa số mất 2 giây bầu lại, leader cũ không nhận một ghi nào. Tách rời cả ba: không ai ghi được sau 0,2 giây. Lease TTL 5 s giữ qua nút bị cắt: đa số thấy khoá mất ở +5,24 s, người giữ mới biết ở +5,95 s. Khi leader bị cô lập, leader mới gia hạn mọi lease nên khoá sống tới +9,33 s.