Chuyên mục
Backend
APIs, databases and distributed systems.

Một chiến lược test cho service thật: mỗi lớp một câu hỏi và tỉ lệ 300 unit, 40 slice, 8 hành trình; fake có hành vi và WireMock ở biên giới; Surefire/Failsafe, Awaitility, Clock và chính sách test chập chờn — cùng checklist 12 câu để review test.

groupingBy hai cấp với TreeMap, flatMap xuống dòng hàng, top N bằng collectingAndThen, teeing cho min và max, toMap có merge giữ thứ tự — rồi khi nào đặt tên collector, dùng record thay tuple hay quay về vòng for, và một báo cáo từ CSV khép lại Giai đoạn 6.

JaCoCo ba bước với check làm đỏ build và ngưỡng theo package nghiệp vụ, line khác branch, coverage không đo được assert và PITest chỉ thẳng vào test còn thiếu, kim tự tháp test chạy bằng Surefire và Failsafe — cùng bốn con số đáng theo dõi và những con số nên bỏ.

Parallel stream là chia, làm, ghép trên ForkJoinPool chung của cả JVM: nguồn nào chia tốt, phép ghép nào đắt, mô hình N × Q để biết khi nào có lãi, vì sao I/O không bao giờ thuộc về parallel stream — và bẫy stateful lambda chỉ hỏng khi song song, cùng cách đo bằng JMH.

Boot 3 mặc định chỉ lộ health; bản đồ endpoint an toàn và nguy hiểm; HealthIndicator tự viết với liveness tách khỏi readiness cho Kubernetes, info từ build và git, metrics Micrometer với tag hữu hạn — và ba lớp khóa: cổng riêng, SecurityFilterChain với EndpointRequest, exclude env/heapdump/threaddump.

Optional là công cụ cho kiểu trả về — không field, không tham số, không bọc collection; chuỗi map/flatMap/filter thay kim tự tháp if; orElse luôn tính tham số còn orElseGet lười, orElseThrow cho “không có là lỗi” — và các anti-pattern isPresent + get, orElse(null).

Fesod là hậu duệ của EasyExcel, cùng engine SAX/SXSSF. Khác biệt kiểm chứng được: vòng đời dự án, POI 5.2.5 vs 5.5.1, các API mới (numRows, csv(), headerMergeStrategy) và độ bền với file xấu — không phải hiệu năng gấp nhiều lần.

Builder với mặc định hợp lệ để test chỉ nói điều nó quan tâm, @TestComponent gói builder với repository, @Sql cho dữ liệu nhiều hay legacy với bẫy method ghi đè class, ba bẫy script SQL — và chiến lược dọn dẹp: rollback, TRUNCATE trước mỗi test, dữ liệu duy nhất, còn @DirtiesContext thì không.

Ba bẫy của toMap — trùng khóa, giá trị null, kiểu map; groupingBy với downstream counting/summingInt/mapping và gom nhiều cấp bằng record; partitioningBy luôn đủ hai khóa; filtering giữ nhóm rỗng, teeing gộp hai collector trong một lượt, collectingAndThen gỡ Optional của maxBy.