Bài 2 — Goroutine, Scheduler & GPM Model

Concurrency — Goroutine, Scheduler và GPM Model 1. Problem Statement Bài toán C10K → C10M Một server hiện đại cần phục vụ 10.000 → 10.000.000 kết nối đồng thời. Với mô hình “1 kết nối = 1 OS thread”: Memory: 10.000 thread × 8MB stack (mặc định Linux) = 80GB chỉ cho stack. Bất khả thi. Context switch: chuyển đổi thread qua kernel tốn 1-10µs (lưu/khôi phục register, TLB flush, cache pollution). Với 10K thread active, CPU dành phần lớn thời gian cho việc chuyển đổi thay vì làm việc. Scheduler kernel không biết gì về ngữ nghĩa ứng dụng — nó schedule công bằng theo time-slice, không theo “goroutine này đang chờ I/O”. Các giải pháp cũ và giới hạn Giải pháp Cách hoạt động Giới hạn Thread pool (Java cổ điển) Số thread cố định + queue Thread bị block bởi I/O vẫn chiếm chỗ; sizing pool là nghệ thuật đen Callback / event loop (Node.js, nginx) 1 thread + non-blocking I/O Callback hell; 1 tính toán nặng chặn toàn bộ; code bất đồng bộ “lây nhiễm” (colored functions) Async/await (C#, Rust, JS) Compiler biến đổi thành state machine Vẫn chia thế giới thành sync/async (“function coloring”); ecosystem phải async hết Go chọn hướng thứ ba: viết code tuần tự, blocking như bình thường — runtime lo việc biến blocking thành non-blocking bên dưới. Không có async/await, không có màu hàm. Đây là điểm bán hàng lớn nhất của Go. ...

June 5, 2026 · 10 min

Bài 1 — Triết Lý Go & Nền Tảng Ngôn Ngữ

Triết lý thiết kế Go và nền tảng ngôn ngữ Level 1 → Level 4: Từ “tại sao Go tồn tại” đến quyết định kiến trúc production. 1. Problem Statement Bài toán Go giải quyết Năm 2007, Google đối mặt với ba vấn đề mà không ngôn ngữ nào lúc đó giải quyết trọn vẹn: Thời gian compile quá lâu. Codebase C++ hàng chục triệu dòng của Google mất 45 phút đến vài giờ để build. Nguyên nhân kỹ thuật: mô hình #include của C/C++ khiến mỗi translation unit phải parse lại hàng trăm nghìn dòng header. Một file header có thể bị include hàng nghìn lần trong một lần build. ...

June 3, 2026 · 13 min

Bài 0 — Giới Thiệu

Golang & Node.js — Tài liệu chuyên sâu cho Backend Engineer Bộ tài liệu 15 chương, viết theo tư duy Problem → Tại sao tồn tại → Cơ chế bên trong → Trade-off → Production → Anti-pattern → Khi nào không dùng. Mục tiêu không phải dạy cú pháp — mà giúp bạn hiểu bản chất, phân tích bottleneck và tự đưa ra quyết định kỹ thuật có cơ sở. ...

June 1, 2026 · 4 min

Chuyện mình triển khai Rule Engine trong backend

Chào mọi người, gần đây khi mình chuyển sang công việc mới với một ngôn ngữ lập trình khác, mình có cơ hội tham gia thiết kế một hệ thống rule engine để đáp ứng các yêu cầu business của công ty. Trong quá trình tìm hiểu và research, mình muốn ghi lại những kiến thức đã học được, đồng thời chia sẻ lại theo một scope phổ biến hơn để phù hợp với nhiều mô hình business hiện nay. Bài viết này vừa để mình hệ thống hóa kiến thức, vừa hy vọng giúp ích cho những bạn đang quan tâm đến rule engine. ...

November 29, 2025 · 7 min

So sánh Node.js và Golang trong Backend

Xin chào mọi người, Trong quá trình làm việc ở vị trí Backend Engineer, mình đã trải qua nhiều ngôn ngữ lập trình, trong đó có Node.js và Golang. Vậy trường hợp nào nên dùng Node.js, trường hợp nào nên dùng Golang? Bài viết này chia sẻ kinh nghiệm thực chiến cá nhân và quan sát thực tế từ đồng nghiệp xung quanh. Let’s start! 1. Hiệu năng và Đa luồng Golang có hiệu năng tốt hơn nhờ là compiled language và mô hình goroutine rất nhẹ (lightweight thread do Go runtime quản lý), dễ dàng xử lý hàng nghìn concurrent connections mà tốn rất ít tài nguyên. ...

May 17, 2025 · 4 min