Welcome to MikeDaDev's Blog – notes on Java, backend & system design.

Explore
MikeDaDev's Blog

#java

Things I've written about #java
  • Kinh nghiệm phỏng vấn tại công ty A*

    Bài test viết gồm 5 câu của một công ty fintech mình tạm gọi là A*: đa luồng cho n chiếc xe xuất phát cùng lúc, chuỗi con dài nhất không lặp ký tự, thiết kế API 3 tầng có mã hoá bất đối xứng, SDLC và mô hình OSI. Mình đi qua từng câu, chỗ dễ mất điểm, code đã chạy thử, rồi tổng hợp các vòng phỏng vấn thường gặp phía sau và cách chuẩn bị.

  • Claude Code template cho Spring Boot: mổ xẻ repo của Piotr Mińkowski

    Repo claude-ai-spring-boot gói sẵn CLAUDE.md, 6 agent và 7 skill để Claude Code viết Spring Boot 4 theo đúng chuẩn. Bài này mở từng phần ra xem nó vận hành thế nào, rồi chạy thử code mẫu trong skill trên Spring Boot 4.1.1: chỗ nào compile không qua, chỗ nào Kubernetes sẽ âm thầm bỏ qua preStop hook, file quyền nào đi theo khi clone, và cách sửa trước khi đem về dùng cho team.

  • Java 27: Compact Object Headers

    Từ Java 27, Compact Object Headers (Project Lilliput) được bật mặc định: header của object trên HotSpot co từ 12 xuống 8 bytes. Bài mổ xẻ 64 bit header được sắp ra sao, class pointer nén còn 22 bit thế nào, lock và GC xoay xở thế nào, lợi gì cho CPU cache và các cờ JVM cần biết.

  • Spring AI: Dynamic Tool Calling

    Dynamic Tool Calling trong Spring AI: bài toán chi phí token khi nhét hết tool vào Context Window, cách viết CallAdvisor để chọn tool theo ngữ nghĩa qua Vector Store, và cách tự động lập chỉ mục các @Tool bean.

  • Feature Flags với Unleash & Spring Boot

    Feature Flags với Unleash trong Spring Boot 3: 4 nhóm toggle theo cách chia của Pete Hodgson, cách Unleash đánh giá flag ngay trong bộ nhớ phía client và đồng bộ qua Server-Sent Events, chuyện MurmurHash3 chia user khi gradual rollout, và dùng Strategy Pattern để thoát khỏi đống if-else.

  • Java Memory Model & happens-before

    Đào vào Java Memory Model (JSR-133): giao thức MESI, Store Buffer, 4 loại Memory Barrier, quan hệ Happens-Before, chuyện False Sharing (@Contended), và Acquire/Release với VarHandle từ Java 9.

  • cạm bẫy Virtual Threads trong production

    Bật Virtual Threads trong Java 21 xong ứng dụng production lại treo? Bài này đi qua 4 chỗ hay dính: pinning carrier thread do synchronized (và chuyện JDK 24 đã sửa nó), ThreadLocal làm phình bộ nhớ, pool thread không cần thiết và connection pool bị đè bẹp, kèm cách xử lý cho từng cái.

  • LMAX Disruptor & kiến trúc lock-free

    Sàn giao dịch tài chính LMAX xử lý khoảng 6 triệu lệnh mỗi giây trên một luồng CPU duy nhất, truyền message giữa các thread chỉ mất vài chục nano giây, và viết bằng Java. Bài này đi qua cấu trúc RingBuffer, hiện tượng False Sharing, Cache Line Padding và cách làm lock-free của Disruptor.

  • Database Sharding system design

    Lúc nào thì một node SQL không còn gánh nổi tải? Bài này nói về cách ước tính dung lượng nhanh (back-of-the-envelope), cách chọn sharding key, chuyện transaction phân tán và kinh nghiệm từ các hệ thống tài chính.

  • Rate Limiting với Bucket4j trong Spring Boot

    Vì sao chỉ rate limit ở Nginx là chưa đủ? Mổ xẻ thuật toán Token Bucket, cách Bucket4j xử lý concurrency không cần lock, và cách dựng rate limiting phân tán với Redis trong Spring Boot để chạy production.

  • in java / jvm

    Generational ZGC trong java 21

    Heap lên tới vài chục, vài trăm GB thì mấy GC truyền thống như G1 hay Parallel hay kéo theo những lần Stop-The-World (STW) dài cả giây, dịch vụ đứng hình. Generational ZGC trong Java 21+ dùng Colored Pointers, Load Barriers (và Store Barriers) ra sao để giữ pause GC dưới 1 mili-giây.

  • RestClient & Fluent API trong Spring Boot 3

    Vì sao RestTemplate bị cho vào chế độ bảo trì rồi sắp bị deprecate? Bài này nói về RestClient và JdbcClient, hai món mới theo kiểu Fluent API từ Spring Framework 6.1 / Spring Boot 3.2, viết gọn hơn, đọc dễ hơn và ít chỗ truyền nhầm tham số hơn.

  • GraalVM Native Image vs JVM JIT

    GraalVM Native Image khởi động trong vài chục tới vài trăm mili-giây, ăn RAM rất ít nên đang được dân Serverless và Kubernetes chuộng. Nhưng AOT có thay hẳn được HotSpot JIT không? Mổ xẻ kiến trúc, số đo minh hoạ, những thứ bạn buộc phải đánh đổi và các lựa chọn khác như Project Leyden.

  • jOOQ vs Hibernate JPA

    Vì sao nhiều team làm hệ thống tài chính cân nhắc jOOQ bên cạnh Hibernate? Chi phí ngầm của ORM, Type-safe SQL của jOOQ, những chỗ Hibernate 6 đã bắt kịp, và kiến trúc Hybrid dùng cả hai.

  • T24 core banking

    T24 (Temenos Transact) là hệ thống core banking, nơi mọi giao dịch tài chính của ngân hàng chạy qua. Chia module rõ ràng, xử lý realtime, nó đang làm xương sống cho nghiệp vụ chính của khoảng một nghìn ngân hàng. Bài này ghi lại những gì dev cần biết khi phải làm việc với nó.

  • activiti 8

    Activiti 8 là engine BPM/workflow mã nguồn mở, làm ra để chạy tốt trên môi trường cloud-native. Nó chạy được BPMN chuẩn, gắn chặt với Spring Boot, nên hay được dùng làm "nhạc trưởng" điều phối microservices, nhất là khi phải quản lý mấy luồng giao dịch phân tán rắc rối theo kiểu Saga.

  • backbase - digital banking platform

    Backbase là một nền tảng ngân hàng số (Engagement Banking Platform) giúp ngân hàng làm mới trải nghiệm khách hàng trên mọi kênh mà không phải thay cả hệ thống core banking cũ. Nó nằm như một lớp tương tác phía trên các hệ thống sẵn có, phục vụ cả ngân hàng bán lẻ, doanh nghiệp lẫn quản lý tài sản.

  • BPMN 2.0

    BPMN 2.0 (Business Process Model and Notation) là chuẩn quốc tế về ký hiệu đồ họa để vẽ và thiết kế quy trình nghiệp vụ. Nó là "ngôn ngữ chung" giữa business analyst, dev và ban quản lý, và model vẽ ra có thể chạy trực tiếp trên workflow engine. Bài này đi qua events, activities, gateways, process variables, listeners, error handling, tích hợp Activiti với Spring Boot và các best practice.

  • map vs flatmap

    map và flatMap trong Java nhìn từ gốc là Monadic Bind: flatMap cấp phát bộ nhớ thế nào trong Stream, thay bằng mapMulti (Java 16) để đỡ GC Churn, thenCompose trong CompletableFuture, và cái bẫy mất thứ tự khi dùng flatMap trong Reactive Streams.

  • RabbitMQ căn bản

    RabbitMQ là gì, vì sao nên dùng, kiến trúc bên trong và cách tích hợp với Spring Boot, kèm các pattern đảm bảo reliability cho production.

  • java advanced performance techniques

    Các kỹ thuật tối ưu hiệu năng Java ở cấp hệ thống: branchless programming, autoboxing, EnumSet, Virtual Threads, bẫy Hibernate/JPA, Caffeine cache, GraalVM Native Image, data locality, lock-free và SIMD.

  • java comparison

    Những cặp khái niệm Java/Spring hay bị hỏi khi phỏng vấn Senior mà cũng dễ dùng sai trên production: == vs equals(), HashMap vs ConcurrentHashMap, synchronized vs ReentrantLock, PUT vs PATCH...

  • Saga pattern trong Microservices

    Saga Pattern là cách xử lý transaction phân tán trong microservices: chia một quy trình dài thành chuỗi local transaction. Bước nào lỗi thì chạy compensating transaction để hoàn tác các bước trước, nhờ vậy dữ liệu vẫn nhất quán (eventual consistency) mà không phải lock cả hệ thống.

  • high-performance java techniques

    Mấy kỹ thuật tối ưu hiệu năng Java ít người để ý: object pooling, primitive arrays, lock-free, batch, zero-copy, viết code dễ cho JIT, kèm ví dụ, cơ chế bên dưới và lúc nào không nên dùng.

  • multithreading vs parallel stream

    So sánh Multithreading truyền thống (Thread, ExecutorService, CompletableFuture) với Parallel Stream trong Java: khác nhau về mô hình, mức kiểm soát, khi nào nên dùng cái nào, các lỗi hay gặp và chỗ Virtual Threads (Java 21+) chen vào.

  • leetcode: two sum

    Two Sum nhìn từ góc độ low-latency: Autoboxing và pointer chasing làm HashMap O(N) chậm cỡ nào trên phần cứng thật, khi nào Two-Pointer thắng, cách tự viết Primitive Open-Addressing Hash Map, SIMD Vector API giúp được gì và không giúp được gì, kèm số đo JMH.

  • java 25 LTS

    A close look at Java 25 LTS: Compact Object Headers (JEP 519), Stream Gatherers (JEP 485), Flexible Constructor Bodies (JEP 513), Scoped Values (JEP 506) and Generational ZGC, with notes on what they change for high-throughput cloud services.

  • acid in sql

    Nếu database SQL là cái két sắt thì ACID (Atomicity, Consistency, Isolation, Durability) là bộ khoá giữ cho mọi giao dịch an toàn. Nhờ nó, dù hệ thống sập nguồn hay gặp lỗi bất ngờ, thao tác dữ liệu hoặc chạy trọn vẹn, hoặc hoàn tác hết, dữ liệu không bao giờ rơi vào trạng thái nửa vời.

  • mdc tracing

    MDC hoạt động ra sao, cách gắn traceId vào log và chuyền nó qua HTTP, RabbitMQ, Kafka, gRPC, thread pool; khi nào nên để Micrometer Tracing làm thay, và cách xuất log JSON cho dễ tìm.

  • in java / kafka

    kafka advance

    Phần hai của loạt Kafka: những thứ bạn sẽ cần khi hệ thống lớn dần, từ Kafka Connect, Schema Registry, bảo mật, exactly-once, testing, chạy Kafka trên K8s cho tới playbook xử lý sự cố.

  • gRPC trong Spring Boot

    gRPC chạy thế nào bên dưới, Protobuf và HTTP/2 giúp nó nhanh ra sao. Kèm cách dựng gRPC với Spring Boot cho production và mấy bài học mình rút ra khi đưa nó lên chạy thật.

  • model context protocol

    Model Context Protocol (MCP) là một chuẩn mở giúp trợ lý AI kết nối thẳng và an toàn tới nguồn dữ liệu, API hay môi trường làm việc bên ngoài. Có một giao thức chung như vậy, AI đọc được ngữ cảnh của người dùng mà không cần ai ngồi viết connector riêng cho từng ứng dụng.

  • spring ai và kiến trúc rag

    Mổ kiến trúc Spring AI 1.x: ChatClient Fluent API, chuỗi Advisors, RAG với VectorStore và PgVector, Function Calling, Observability với Micrometer/OpenTelemetry và mấy pattern resilience để sống sót qua rate-limit.

  • maven dependencies

    Thoát khỏi Dependency Hell bằng cách quản lý dependency cho gọn. Đi qua cấu trúc POM, BOM, dependency scope, multi-module và vòng đời build trong project Java.

  • in java / grpc

    grpc

    grpc là gì, tại sao google tạo ra nó, cách hoạt động bên trong, so sánh với REST và GraphQL và hướng dẫn xây dựng gRPC service với Java & Spring Boot.

  • ai agentic systems

    AI agent là bước chuyển lớn của AI: từ chatbot thụ động chỉ biết "hỏi - đáp" sang những "nhân viên số" tự lên kế hoạch, tự hành động để giải quyết việc phức tạp. Bài này đi qua cấu tạo của agent, vòng lặp ReAct, cách lập kế hoạch, multi-agent và mấy kinh nghiệm khi xây agent.

  • nâng cấp java 25 LTS

    Nhìn Java 25 LTS từ góc độ người làm kiến trúc: so với Java 21/17 thì hơn ở đâu. Compact Object Headers (JEP 519), Stream Gatherers (JEP 485), Flexible Constructor Bodies (JEP 513), Generational ZGC & Shenandoah, Scoped Values (JEP 506), và cách tính bài toán ROI khi nâng cấp hệ thống cloud-native.

  • rabbitmq pattern

    Các pattern hay dùng của RabbitMQ trong Spring Boot: publisher confirm, manual ack, DLQ, retry, idempotent consumer, giữ thứ tự message, và cách giữ dữ liệu nhất quán bằng Outbox và Saga.

  • multi-module spring boot

    Mổ xẻ kiến trúc Multi-Module Spring Boot cho production: chia module theo Hexagonal/Clean Architecture, tách riêng JPA/DataSource cho từng module, tránh mở connection pool tràn lan, xử lý cái bẫy bytea của JDBC PostgreSQL và dùng ArchUnit để giữ ranh giới module.

  • kiến trúc RabbitMQ

    Dựng RabbitMQ cho production cần biết gì: Erlang OTP/BEAM bên dưới, ghép nhiều Channel trên một TCP Connection, bỏ Mirrored Queues để chuyển sang Quorum Queues (Raft), không mất message nhờ Producer Confirms và Manual ACK, cùng Dead Letter Queue (DLQ) kèm retry exponential backoff.

  • redis pattern

    Redis đâu chỉ để làm cache. Bài này gom lại các chiến lược caching, cách cấu hình cho đỡ tốn bộ nhớ và mấy pattern phân tán hay dùng với Redis trong hệ thống Backend.

  • jmeter

    Apache JMeter là phần mềm mã nguồn mở để kiểm thử hiệu năng (performance testing) và kiểm thử chịu tải (load testing) cho ứng dụng web, API hoặc cơ sở dữ liệu. Nó giả lập hàng ngàn người dùng ảo truy cập cùng lúc, để bạn đo thời gian phản hồi, tìm lỗi và biết máy chủ chịu được tới đâu.

  • in java / solid

    solid principles

    SOLID là 5 nguyên tắc thiết kế hướng đối tượng giúp code dễ đọc, dễ mở rộng, dễ test và dễ sửa về sau.

  • prometheus

    Prometheus không chỉ là mấy con số khô khan, nó là trung tâm của hệ sinh thái Observability. Bài này nói về kiến trúc, cách nghĩ khi thiết kế metrics và cách tích hợp với Spring Boot.

  • bitwise operations in java

    Bitwise thoạt nhìn hơi khó chịu vì phải nghĩ bằng số nhị phân thay vì thập phân như mọi khi. Nhưng nắm được quy luật rồi thì thấy nó chạy rất nhanh, tốn ít bộ nhớ, và xuất hiện khắp nơi từ permission, HashMap cho tới câu hỏi phỏng vấn.

  • in java / kafka

    kafka basic

    kafka là gì, sao lại chọn kafka mà không phải rabbitmq? bài này đi qua kiến trúc kafka, cách dùng với spring boot, mấy pattern hay gặp ngoài đời và checklist trước khi lên production.

  • câu hỏi phỏng vấn java senior

    Các câu hỏi phỏng vấn nâng cao cho Senior & Staff Software Engineer: False Sharing & Cache Line 64-byte, bẫy Carrier Pinning trong Virtual Threads, Parent-Child Connection Starvation trong HikariCP, Zero-Allocation trên đường dẫn hiệu năng cao và thiết kế Idempotency.

  • mongodb

    Không dừng ở định nghĩa NoSQL, bài này đi vào kiến trúc MongoDB, cách thiết kế dữ liệu (Embed hay Reference), chiến lược đánh index, và cách dùng MongoDB cho đúng trong microservices với Spring Boot.

  • java functional extends

    JDK chỉ có sẵn Function và BiFunction, tối đa 2 tham số. Bài này tự viết TriFunction tới DecaFunction (3 đến 10 tham số) kèm andThen, ví dụ chạy được, và bàn khi nào nên dùng, khi nào nên gom tham số vào một record.

  • redis

    Redis làm được nhiều hơn một bộ nhớ đệm. Bài này nói về kiến trúc bên trong, cách tối ưu bộ nhớ và các pattern phân tán dùng Redis trong hệ thống Backend.

  • cqrs pattern

    CQRS là pattern tách hẳn phần đọc dữ liệu (Query) ra khỏi phần ghi, thay đổi dữ liệu (Command). Tách ra rồi thì mỗi bên tự tối ưu hiệu năng, bảo mật và database theo cách của mình, rất đáng dùng cho những hệ thống phức tạp mà lượng đọc và ghi chênh nhau nhiều.

  • visitor pattern

    Visitor Pattern trong Java hoạt động ra sao: cơ chế Double Dispatch để lách giới hạn Single Dispatch của JVM, dùng để duyệt cây cú pháp (AST), và đặt cạnh Pattern Matching trên Sealed Types của Java 21 xem bên nào hơn.

  • iterator pattern

    Đào sâu Iterator Pattern trong Java: fail-fast hoạt động nhờ biến modCount ra sao, CopyOnWriteArrayList đổi bộ nhớ lấy an toàn thế nào, Spliterator giúp chạy song song ra sao, và cách tự viết cursor iterator để stream hàng triệu bản ghi mà không OOM.

  • command pattern

    Command Pattern nhìn từ góc độ kiến trúc: biến động từ thành danh từ (Objectifying Actions), Undo/Redo dùng hai stack kết hợp Memento, đường tiến hóa sang CQRS (Command Query Responsibility Segregation) và Compensating Transactions trong Saga.

  • coding convention và chuẩn mực java

    Ghi chú về coding convention cho team Java: dùng chuẩn Google, bỏ package-by-layer để chuyển sang Vertical Slice, chặn NullPointer bằng JSpecify & NullAway, và kiểm tra ranh giới kiến trúc tự động trong CI/CD bằng ArchUnit.

  • strategy pattern

    Nhìn Strategy Pattern bằng con mắt Solution Architect: Strategy khác State và Template Method ở đâu, dùng Functional Interface của Java để khỏi đẻ ra cả đống class thừa, và dựng một Dynamic Promotion Engine bằng Spring Boot.

  • observer pattern

    Đi từ Observer Pattern kinh điển tới Event-Driven Architecture (EDA): vì sao java.util.Observable bị deprecate từ Java 9, quản lý transaction với @TransactionalEventListener AFTER_COMMIT, xử lý backpressure trong Reactive Streams và so sánh với Apache Kafka.

  • facade pattern

    Nhìn Facade Pattern bằng con mắt Solution Architect: nó liên quan gì tới Law of Demeter, khác Adapter, Proxy, Decorator ở đâu, và lớn lên thành Anti-Corruption Layer (ACL trong DDD) ra sao khi phải bọc một hệ thống Core Banking legacy.

  • abstract factory pattern

    Abstract Factory Pattern nhìn từ góc độ kiến trúc hệ thống: dùng nó để thoát vendor lock-in khi chạy multi-cloud, dựng lớp trừu tượng cho Blob Storage, Message Queue và Secret Manager trên AWS/GCP, và cái giá phải trả gọi là Lowest Common Denominator.

  • decorator pattern

    Decorator Pattern nhìn từ góc Solution Architect: vì sao kế thừa gây Class Explosion, Decorator thủ công khác gì Spring AOP Proxies (JDK vs CGLIB), bẫy Self-Invocation trong AOP và ví dụ Resilient Caching Decorator kèm những điểm cần lưu ý trước khi đem lên production.

  • adapter pattern

    Adapter Pattern trong Java, từ bản chất OOP tới kiến trúc Lục Giác (Ports and Adapters), cách dựng Anti-Corruption Layer (ACL) để bảo vệ Domain Model trước hệ thống Legacy, và phân biệt Adapter với Facade, Proxy, Decorator.

  • stack & queue

    Ghi chú về cách chọn và dùng Stack, Queue, Deque trong Java: khi nào dùng ArrayDeque, PriorityQueue, BlockingQueue hay ConcurrentLinkedQueue cho hệ thống chịu tải cao.

  • prototype pattern

    Prototype Pattern trong Java: vì sao Cloneable bị coi là lỗi thiết kế của JDK, khác nhau giữa Shallow Copy và Deep Copy, và so sánh 4 cách nhân bản object dùng được trên production (Copy Constructor, Jackson, Kryo, Record Withers).

  • builder pattern

    Đào sâu Builder Pattern trong Java: vì sao JavaBeans Pattern và Telescoping Constructor dễ gây lỗi, cách dùng Staged Builder để thiếu trường bắt buộc là compile không qua, và khi nào nên dùng Lombok @Builder hay Java Records.

  • dependency injection

    Dependency Injection (DI) là pattern dùng để hiện thực nguyên tắc Inversion of Control (IoC). Object không tự `new` mấy thứ nó cần nữa, mà để một bên quản lý chung (như Spring Container) "tiêm" (inject) dependency vào qua constructor, setter hoặc field. Nhờ vậy các class ít dính chặt vào nhau (loose coupling), code linh hoạt, dễ sửa và nhất là dễ viết unit test.

  • factory pattern

    Nhìn lại Factory Pattern từ góc độ kiến trúc: vì sao Factory kiểu switch-case kinh điển lại vi phạm chính Open/Closed Principle, cách inject Map bean trong Spring Boot để bỏ hẳn if-else, Functional Factory với Java Supplier, và phân biệt Factory Method với Abstract Factory qua ví dụ multi-cloud.

  • singleton pattern

    Singleton Pattern nhìn kỹ hơn một chút: vì sao việc đảo lệnh của JIT và CPU buộc Double-Checked Locking phải có volatile, 4 cách phá Singleton (Reflection, Serialization, Clone, ClassLoader) và vì sao dự án Spring nên để IoC Container quản lý singleton.

  • solid principles - tổng quan

    **SOLID** là 5 nguyên tắc thiết kế cơ bản của lập trình hướng đối tượng: Single Responsibility, Open-Closed, Liskov Substitution, Interface Segregation và Dependency Inversion. Áp dụng đúng thì code có cấu trúc rõ ràng, các phần ít dính vào nhau, nên dễ mở rộng, dễ test và dễ bảo trì về lâu dài.

  • postgre-sql

    Đi một vòng PostgreSQL: MVCC, WAL chạy ra sao, đánh index thế nào cho đúng, và mấy kinh nghiệm tối ưu hiệu năng "xương máu" khi dùng chung với Spring Boot.

  • chữ ký số trong java

    Chữ ký số (digital signature) trong Java, dùng qua class java.security.Signature, giúp xác thực dữ liệu đến từ đâu và chắc chắn nó chưa bị ai sửa. Cơ chế dựa trên mã hoá bất đối xứng: người gửi dùng private key để ký, người nhận dùng public key tương ứng để kiểm tra lại.

  • spring security với jwt

    Spring Security kết hợp JWT (JSON Web Token) là cách phổ biến để bảo mật RESTful API. Thay vì stateful (Session/Cookie lưu trên server), xác thực chuyển sang stateless: mọi thông tin nằm trong token, nên hệ thống dễ scale hơn và đỡ tốn bộ nhớ trên server.

  • multi-module Spring Boot với Gradle

    Dựng Multi-Module Spring Boot 3 với Gradle hiện đại: bỏ anti-pattern subprojects/allprojects, dùng Convention Plugins để tái sử dụng cấu hình, quản lý dependency tập trung bằng Version Catalog (libs.versions.toml), hiểu compile avoidance giữa api và implementation, và xử lý xung đột bootJar vs jar.

  • session, cookies & jwt

    Cookie là mấy mẩu dữ liệu nhỏ nằm ngay trên trình duyệt. Khi làm đăng nhập, Session giữ trạng thái trên server và dùng cookie để mang Session ID qua lại, còn JWT thì stateless: nhét luôn thông tin người dùng đã ký vào token, server đỡ phải nhớ gì.

  • java concurrency

    Concurrency trong Java 21 & Spring Boot 3.x: Virtual Threads, ScopedValue và các pattern xử lý bất đồng bộ trong hệ thống phân tán hiệu năng cao.

  • functional interfaces & lambda trong java

    Lambda và Functional Interface chạy thế nào bên trong JVM: vì sao lambda không phải Anonymous Inner Class, invokedynamic và LambdaMetafactory làm gì, tại sao biến phải effectively final, và cách dựng một Policy Engine bằng hàm.

  • http abstractions

    Các class và interface HTTP của Spring (ResponseEntity, HttpHeaders, MediaType, RestTemplate, WebClient, RestClient...) gói HTTP thô thành object dễ dùng, giúp code độc lập với web server bên dưới và dễ unit test hơn.

  • java virtual threads

    Virtual Threads trong Java 21: vì sao thread truyền thống khó scale, virtual thread chạy thế nào bên dưới, cách dùng cơ bản và mấy chỗ cần để ý (pinning, ThreadLocal, giới hạn tài nguyên).

  • logback & mdc in spring

    A practical guide to building observable Spring microservices with Logback, MDC and distributed tracing: the patterns that work, the traps teams fall into, and fixes that held up in production.

  • in java / jvm

    Optional trong Java

    Nhìn kỹ Java Optional: mỗi instance tốn 16-24 bytes heap và khi nào thì chuyện đó thật sự đáng lo, 6 anti-pattern hay gặp, khác biệt quan trọng giữa orElse và orElseGet, và cách làm null-safety bài bản hơn với JSpecify.

  • arraylist vs linkedlist

    Vì sao ArrayList gần như luôn nhanh hơn LinkedList trong Java: chuyện CPU Cache Line và spatial locality, chỗ hao bộ nhớ của Node header, cái hiểu lầm sách giáo khoa về tốc độ chèn của LinkedList, và ArrayDeque, lựa chọn nên dùng thay thế.

  • map in java

    Mổ xẻ bên trong các loại Map của Java, mỗi loại tốn kém ở đâu, và chọn loại nào cho đúng khi hệ thống chịu tải cao

  • list in java

    Đào xuống tầng low-level xem ArrayList, LinkedList chạy thế nào, vì sao lý thuyết nói một đằng mà hiệu năng thực tế một nẻo, và mấy cái bẫy dễ dính khi chạy đa luồng.

  • hibernate ORM

    Hibernate ORM bên trong chạy thế nào: 4 trạng thái vòng đời của Entity (Transient, Persistent, Detached, Removed), Dirty Checking tự động qua Loaded Snapshots, First-Level vs Second-Level Cache, và cách tiết kiệm bộ nhớ với @Transactional(readOnly = true).

  • project Lombok

    Lombok can thiệp vào Abstract Syntax Tree (AST) thế nào dù JSR 269 không cho phép, những cái bẫy hay gặp trên Production (JPA @Data, @EqualsAndHashCode với kế thừa, @Builder với Jackson, @SneakyThrows) và cách thay bằng Java Records & MapStruct.

  • custom annotations trong java

    Annotation trong Java chạy thế nào bên trong JVM: bytecode attribute, dynamic proxy, meta-annotation của Spring (@AliasFor), rồi tự viết một custom annotation dùng Spring AOP và SpEL để làm rate limiting phân tán dùng được cho production.

  • Spring Security annotations

    Kiến trúc bảo mật của Spring Security: hai lớp phòng thủ FilterChain và AOP Method Security, SpEL trong @PreAuthorize, bẫy Side-Effect của @PostAuthorize, vấn đề hiệu năng của @PostFilter và cách thiết lập Role Hierarchy cho production.

  • spring test annotations

    Ghi chú về các Spring Test annotations để viết Unit Test và Integration Test trong Spring Boot: @SpringBootTest, test slices, @MockitoBean/@MockitoSpyBean (thay @MockBean/@SpyBean), Testcontainers.

  • ioc container & application context

    IoC Container là phần lõi của Spring Framework: tự khởi tạo, nối và quản lý vòng đời của các object (Beans) thông qua Dependency Injection. **Application Context** là bản mở rộng (interface) của IoC Container, ngoài các tính năng cơ bản còn có thêm event, đa ngôn ngữ (i18n), tích hợp AOP và nhiều thứ khác.

  • spring data jpa

    Spring Data JPA là module của Spring Framework, nằm trên Java Persistence API (JPA). Thay vì viết boilerplate code để làm việc với database, bạn chỉ cần khai báo interface (kế thừa `JpaRepository`), Spring sẽ tự cung cấp phần implement cho các thao tác CRUD cơ bản. Điểm hay nhất là tự sinh câu SQL từ tên method (ví dụ `findByEmailAndStatus`), và hỗ trợ sẵn phân trang, sắp xếp, auditing.

  • spring jackson annotations

    Các annotation của Jackson (có sẵn trong Spring Boot) cho phép kiểm soát chi tiết việc chuyển đổi (serialization và deserialization) giữa object Java và JSON. Với @JsonProperty (đổi tên trường), @JsonIgnore (bỏ dữ liệu nhạy cảm khi trả về), @JsonFormat (định dạng ngày tháng) hay @JsonInclude (lọc giá trị null), bạn tùy biến được cấu trúc dữ liệu qua API mà không phải đụng vào logic.

  • @Transactional & Spring AOP

    @Transactional và Spring AOP (Aspect-Oriented Programming) là hai thứ đứng sau cơ chế quản lý transaction tự động của Spring. Nhờ chúng mà business logic tách được khỏi mấy việc kỹ thuật lặp đi lặp lại (cross-cutting concerns) như mở transaction, commit hay rollback.

  • Spring Boot Auto-configuration

    Spring Boot Auto-Configuration chạy thế nào bên dưới: AutoConfigurationImportSelector, bộ lọc sớm dựa trên metadata sinh lúc build, ASM đọc annotation mà không nạp class, thứ tự của DeferredImportSelector, chuyển từ spring.factories sang AutoConfiguration.imports, và cách viết một Custom Starter dùng được trên production.

  • spring data core annotations

    Spring Data có một loạt annotation như `@Id`, `@Query`, `@Repository`, `@Transient` để map class Java (entity) vào database và lo phần truy xuất dữ liệu. Nhờ chúng mà bớt được cả đống boilerplate: khai báo khoá chính, quan hệ giữa các bảng hay query tuỳ chỉnh đều gọn, dễ đọc, dễ bảo trì.

  • spring web bind annotations

    Spring Web Bind Annotations là nhóm annotation trong Spring MVC và Spring WebFlux, đóng vai trò cầu nối: tự lấy dữ liệu từ các phần của HTTP Request (URL, Body, Headers) rồi gán (bind) vào tham số của method trong Controller.

  • @ManyToMany trong JPA

    @ManyToMany trong JPA/Hibernate hoạt động ra sao: vì sao Hibernate xóa sạch bảng nối rồi insert lại (Write Amplification), vì sao không thêm được thuộc tính phụ (metadata), và cách làm dùng được trên production: tách thành hai @OneToMany qua Explicit Join Entity với @EmbeddedId và @MapsId.

  • @OneToMany & @ManyToOne trong JPA

    Mấy cái bẫy hay gặp với @OneToMany và @ManyToOne trong JPA/Hibernate: EAGER ngầm, N+1 query và cách xử lý bằng EntityGraph hay BatchSize, lỗi MultipleBagFetchException do Cartesian Product, và StackOverflowError vì lỡ dùng Lombok @Data.

  • Spring IoC & Dependency Injection

    Mổ xẻ bên trong Spring IoC Container: DIP, IoC và DI khác nhau ra sao, vòng đời của một bean trong ApplicationContext, cách Spring gỡ circular dependency bằng cache 3 tầng (three-level cache), và vì sao field injection với @Autowired bị loại khỏi code enterprise.

  • java records

    Hiểu Java Records cho đúng: "transparent carrier" nghĩa là gì, vì sao serialization của Record an toàn hơn, Pattern Matching với Sealed Types, Shallow vs Deep Immutability và mấy cái bẫy khi đem Record dùng với JPA / Hibernate.

  • in java / jvm

    java reflection

    Mổ xẻ Java Reflection bên trong JVM: cơ chế inflation từ JNI sang bytecode accessor (tới JDK 17) và bản viết lại bằng method handle từ JDK 18, vì sao reflection khó cho JIT inline, chuyện setAccessible bị chặn từ JDK 16/17, và vì sao MethodHandles cùng code sinh lúc compile hợp với GraalVM AOT hơn.

  • java stream API

    Nhìn vào bên trong Java Stream API: pipeline được dựng thế nào, Loop Fusion chạy qua interface Sink ra sao, Stateless khác Stateful operation chỗ nào, và vì sao parallelStream xài chung ForkJoinPool có thể làm treo cả hệ thống.

  • in java / jvm

    string vs stringbuilder vs stringbuffer

    Chuỗi ký tự trong JVM hoạt động thế nào: Compact Strings (JEP 254), việc toán tử + chuyển từ StringBuilder sang invokedynamic StringConcatFactory (JEP 280), so sánh String, StringBuilder, StringBuffer và chuyện JIT bỏ lock của StringBuffer nhờ Escape Analysis.

  • in java / jvm

    java string pool

    Đi sâu vào StringTable native trong HotSpot JVM: vì sao String Pool dời từ PermGen sang Java Heap, bảng băm C++ từng tụt từ O(1) về O(N) ra sao và JDK 11 sửa thế nào, cái bẫy của String.intern(), và String Interning khác String Deduplication (JEP 192) chỗ nào.

  • threadpool executor pool size

    ThreadPoolExecutor nhìn từ góc kiến trúc: biến bit ctl, Định luật Little & công thức Goetz để tính Pool Size, cái bẫy Unbounded Queue gây OOM, Thread Starvation Deadlock và so sánh với Virtual Threads.

  • java ThreadPoolExecutor

    Mổ ThreadPoolExecutor từ bên trong: biến ctl gói bit thế nào, vì sao mấy static factory của Executors là quả bom OOM, vì sao Worker tự dựng khoá không tái nhập trên AQS, 4 cách xử lý backpressure và quy trình graceful shutdown 2 pha để chạy production.

  • biến, kiểu dữ liệu và toán tử trong java

    Biến, kiểu dữ liệu và toán tử trong Java, giải thích cho người mới: từ hình ảnh "chiếc hộp dán nhãn", 8 kiểu nguyên thuỷ cộng String, các phép toán số học và logic, tới mấy cái bẫy hay gặp khi đi làm như chia số nguyên, so sánh chuỗi và sai số khi tính tiền.

  • in java / jvm

    kiến trúc JVM

    Đi một vòng bên trong HotSpot JVM cho dân làm phần mềm: file bytecode 0xCAFEBABE trông ra sao, ClassLoader uỷ quyền theo Parent Delegation Model thế nào, các vùng nhớ Runtime Data Areas (Stack Frame, Metaspace, Heap), và JIT biên dịch phân tầng (Tiered Compilation C1/C2).

  • controlled concurrency with semaphores

    A practical look at backpressure and concurrency limits in Java: how java.util.concurrent.Semaphore works on top of AbstractQueuedSynchronizer (AQS), why Virtual Threads waiting on it unmount instead of pinning their carrier, how to size the limit with Little’s Law, and patterns that hold up in production.