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

Explore
MikeDaDev's Blog

#system-design

Things I've written about #system-design
  • Thiết kế hệ thống lưu trữ tài liệu trong thời đại số hoá

    Ảnh CCCD lúc mở tài khoản, hợp đồng vay ký điện tử, sao kê tháng: mỗi ngày một ngân hàng vài chục triệu khách sinh ra hàng triệu file, và file nào cũng phải giữ đúng người xem, đúng thời hạn, không được mất. Bài này dựng một kiến trúc tham chiếu cho nền tảng lưu trữ tài liệu cỡ đó: ước lượng tải, upload chia chunk, lưu theo tầng nóng ấm lạnh, phân quyền RBAC kết hợp ABAC, mã hoá envelope, và những kiểu hỏng hay gặp khi chạy thật.

  • 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ị.

  • in ai / llm

    Netflix dạy LLM gợi ý phim để bạn xem mãi không dừng

    Từ cuộc thi Netflix Prize một triệu đô năm 2006 tới việc coi lịch sử xem phim như một câu văn và huấn luyện model kiểu LLM để đoán bộ phim tiếp theo. Những gì Netflix đã chia sẻ công khai: hệ thống gợi ý cổ điển và giới hạn của nó, foundation model cho gợi ý, cách đưa vào sản phẩm, GenRec, bài toán đo "hài lòng lâu dài", và những gì một team nhỏ học được từ đó.

  • in ai / llm

    Bảo mật LLM cơ bản: vẽ bản đồ mối đe doạ trước khi viết code

    Prompt injection chưa có thuốc chữa, nên câu hỏi đúng không phải "làm sao để model không bị lừa" mà là "bị lừa rồi thì mất gì". Cách làm threat model cho chatbot, RAG và agent: tài sản, kẻ tấn công, ranh giới tin cậy, lethal trifecta, mổ xẻ vụ EchoLeak trong Microsoft 365 Copilot, và những kiến trúc như CaMeL hay Rule of Two giúp giới hạn thiệt hại ngay từ thiết kế.

  • in ai / llm

    Chuyện gì xảy ra bên dưới khi bạn prompt xong và nhấn Enter?

    Theo chân một prompt từ lúc bạn nhấn Enter tới khi chữ đầu tiên hiện lên: ghép system prompt, tokenize, xếp hàng chờ GPU, prefill, decode, KV cache, sampling, streaming. Nắm được luồng này là hiểu vì sao output đắt hơn input, vì sao context dài lại chậm, và nên tối ưu chi phí ở đâu.

  • Discord: từ Cassandra sang ScyllaDB

    Nhìn lại chặng đường Discord lưu hàng nghìn tỷ tin nhắn: từ lúc MongoDB hết chịu nổi, qua Apache Cassandra, rồi chuyển hẳn sang ScyllaDB với mô hình thread-per-core, hết JVM GC pause, p99 latency đọc còn khoảng 15ms và số node giảm từ 177 xuống 72.

  • Figma: scale PostgreSQL với Horizontal Sharding

    Figma làm Horizontal Sharding cho PostgreSQL thế nào: nhóm bảng theo colo, hash shard key để tránh hotspot, proxy DBProxy định tuyến bằng SQL AST, shard "logic" bằng view trước khi tách vật lý, và lần failover đầu tiên chỉ mất khoảng 10 giây sẵn sàng một phần.

  • in ai / rag

    RAG vs Fine-tuning

    Khi nào nên dùng RAG, khi nào nên Fine-tuning? Hiểu sai hai cách này là có thể đốt cả trăm ngàn USD tiền GPU. Mô hình "nhớ" kiến thức ra sao, 7 trục đánh đổi khi chọn kiến trúc, bài toán TCO và cách ghép RAG với một SLM fine-tune riêng để chạy production.

  • bảo mật LLM & OWASP Top 10

    Bảo mật cho hệ thống Generative AI và Agentic Workflows: vì sao Code Plane và Data Plane lẫn vào nhau trong LLM, các kiểu tấn công theo OWASP Top 10 for LLM, mô hình Dual-LLM Sandbox, Zero-Trust Tool Broker và Guardrails nhiều lớp (Defense-in-Depth) cho production.

  • transactional outbox & idempotent consumer

    Xử lý bài toán Dual-Write cho đúng: Transactional Outbox với Debezium SMT, kỹ thuật SELECT FOR UPDATE SKIP LOCKED, vì sao Kafka transaction không cứu được bạn ở đây, và cách làm Idempotent Consumer chạy được trên production với RDBMS (kèm Redis làm lớp lọc nhanh).

  • in ai / slm

    Small Language Models (SLM)

    Nhìn Small Language Models (1B - 8B) từ góc độ người làm kiến trúc: tính VRAM và KV-Cache, chọn kiểu lượng tử hoá (AWQ hay GGUF), chạy Dynamic Multi-LoRA trên vLLM, ghép SLM với LLM thành Compound AI, và bài toán TCO, ROI.

  • 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.

  • zero-downtime database migration

    Làm Zero-Downtime Migration cho database: ma trận lock như AccessExclusiveLock, chiến lược Expand-Contract 5 pha, Shadow Reads (dark launching), Throttled Keyset Backfill và so sánh gh-ost với pg_repack.

  • case study Shopify: Redis to MySQL

    Black Friday 2025 đạt đỉnh 5.1 triệu USD/phút, và đó cũng là mùa đầu tiên Shopify giữ chỗ tồn kho bằng MySQL thay cho Redis. Vì sao bỏ Redis, vì sao câu UPDATE trừ số lượng quen thuộc không đủ, và thiết kế một dòng cho mỗi đơn vị hàng với SKIP LOCKED chạy ra sao.

  • clean architecture

    Clean Architecture là kiểu kiến trúc chia hệ thống thành các vòng tròn đồng tâm, với một luật phụ thuộc rất chặt: lớp bên trong (chứa logic nghiệp vụ) không bao giờ được phụ thuộc vào lớp bên ngoài (UI, Database, Framework). Nhờ vậy nghiệp vụ không dính vào công nghệ cụ thể nào, dễ test, dễ bảo trì và dễ mở rộng.

  • 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.

  • 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.

  • kiến trúc API Gateway

    Mổ kiến trúc API Gateway trong hệ thống microservices cỡ lớn: đặt Kong, Spring Cloud Gateway và Envoy lên bàn cân, làm distributed rate limiting kiểu token bucket bằng Redis Lua, mô hình BFF và circuit breaker để hệ thống tự hồi phục.

  • 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.

  • 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.

  • CORS & CSRF

    Hiểu cho đúng mấy cơ chế bảo mật của trình duyệt: Same-Origin Policy thật ra là gì, preflight OPTIONS tốn thêm bao nhiêu, cái bẫy Access-Control-Allow-Origin dùng wildcard, và vì sao nên gom cấu hình CORS về API Gateway.

  • spring profiles và externalized config

    Quản lý cấu hình trong Spring Boot cho bài bản: nguyên tắc 12-Factor Config, thứ tự ưu tiên giữa các PropertySource, spring.config.import (Spring Boot 2.4+), kết hợp HashiCorp Vault & Kubernetes ConfigMaps, và reload nóng với @RefreshScope.

  • 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.

  • 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.

  • 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.