Blog
Viết cho dev — cơ chế, pitfall, war story
Bài kỹ thuật depth-first: giải thích vì sao, dẫn spec, kèm code chạy được. Cửa ngõ vào khoá học OLHub.
Sizing tài nguyên cho service mới: tính từ đâu để con số đáng tin?
Sizing service mới: dùng Little's Law đổi QPS thành số request cùng lúc, chừa chỗ trống theo hàng đợi, load test tìm điểm gãy để ra số pod, RAM, pool.
Kho bài viết
Tất cả bài viết
Vì sao Redis distributed lock vẫn cấp cho hai client khi failover?
Lock ghi vào master Redis nhưng replication bất đồng bộ chưa kịp sang replica; failover bầu replica lên thì key biến mất và client thứ hai xin được lock.
Từ sinh viên tới key member: khung KASH và thứ khoá học không dạy
Năm năm kèm sinh viên thành key member, người lên nhanh nhất hiếm khi là người giỏi nhất lúc đầu. Khung KASH và sáu nghiên cứu giải thích vì sao.
Vì sao có index rồi mà PostgreSQL vẫn quét toàn bộ bảng?
Index nằm đúng trên cột đang lọc mà EXPLAIN vẫn báo Seq Scan. Hai nguyên nhân khác hẳn nhau: planner không thể dùng, và planner tra index rồi chủ động bỏ.
Bọc transaction vẫn lệch số: bẫy isolation level READ COMMITTED
Báo cáo bọc trong BEGIN/COMMIT vẫn in ba dòng không cộng được: ở READ COMMITTED mỗi câu lệnh lấy một ảnh chụp mới, transaction không đóng băng dữ liệu.
Vì sao check trùng bằng SELECT trên nhiều pod vẫn lệch dữ liệu?
Hai pod cùng SELECT check trùng rồi INSERT vẫn lệch. UNIQUE chốt tạo mới; số dư nên cộng/trừ atomic hoặc FOR UPDATE — @Version không phải lựa chọn đầu cho tiền.
@Component, @Service, @Repository khác gì, thay được nhau không?
@Service, @Repository, @Controller đều là @Component bên dưới — nhưng chỉ @Repository dịch exception, nên đổi nhầm annotation có thể lặng lẽ làm hỏng app.
N+1 query: vì sao một lần xuất sao kê bắn ra 5.001 câu SQL?
Xuất sao kê treo chục giây vì Hibernate bắn 5.001 câu SQL thay vì 1 — còn màn danh sách phân trang thì che giấu bug. Cơ chế N+1 query trong JPA và 4 cách fix.
Vì sao không lưu tiền bằng double — và dùng BigDecimal sao cho đúng?
Báo cáo tổng lãi lệch 9 đồng dù từng chi nhánh khớp: cộng 10 triệu dòng bằng double, sai số mỗi phép cộng gom thành tiền thật. Cơ chế IEEE 754 và BigDecimal.
Vì sao @Transactional không rollback dù đã đặt đúng chỗ?
@Transactional nằm trên method mà dữ liệu vẫn lưu một nửa? Vì nó là AOP proxy: self-invocation bỏ qua proxy, còn checked exception mặc định không rollback.
Vì sao 127 == 127 đúng nhưng 128 == 128 sai trong Java?
Trong Java, so sánh hai Integer bằng == đôi khi đúng đôi khi sai — vì == so địa chỉ object, còn Integer chỉ cache dải −128..127. So giá trị: dùng .equals().