Golang

Thiết kế hệ thống thực chiến: Sự bình dị của những kiến trúc vận hành trơn tru

Thiết kế hệ thống thực chiến: Sự bình dị của những kiến trúc vận hành trơn tru

Nhiều kỹ sư mới vào nghề thường lầm tưởng rằng một thiết kế hệ thống (System Design) ấn tượng phải là một mạng lưới chằng chịt các microservices, sử dụng Apache Kafka để stream event, áp dụng pattern CQRS phức tạp và chạy distributed consensus khắp nơi.

Đọc thêm
Dùng Golang Duy Trì Sự Sống: Hệ Thống Incident Management Tự Động Cho Bệnh Tiểu Đường Type 1

Dùng Golang Duy Trì Sự Sống: Hệ Thống Incident Management Tự Động Cho Bệnh Tiểu Đường Type 1

Bia hơi hoặc một đĩa salad ngỡ như lành mạnh chứa bao nhiêu gram carbohydrate? Với đại đa số mọi người, câu trả lời thường là “ai mà quan tâm”, ngoại trừ những người đang theo chế độ ăn kiêng khắt khe. Nhưng đối với khoảng 8 triệu người mắc bệnh Tiểu đường Type 1 (T1D) trên thế giới, đây là câu hỏi sống còn diễn ra mỗi ngày.

Đọc thêm
Những lời dối lòng khi chúng ta cố bám trụ với Golang

Những lời dối lòng khi chúng ta cố bám trụ với Golang

Trong cộng đồng lập trình Backend, Golang (Go) luôn được xưng tụng như một vị vua của sự tối giản. Từ các microservices tại Google, Uber, Grab cho đến các công cụ hạ tầng cốt lõi như Docker, Kubernetes, Terraform - Go gần như hiện diện ở khắp mọi nơi. Chúng ta truyền tai nhau những luận điểm quen thuộc: “Go đơn giản dễ học”, “Concurrency trong Go siêu nhẹ nhờ Goroutine”, “Toolchain của Go biên dịch cực nhanh và chỉ ra 1 file binary duy nhất”.

Đọc thêm
Golang tắt Nagle's Algorithm mặc định: Cú lừa hiệu năng trên mạng chập chờn

Golang tắt Nagle's Algorithm mặc định: Cú lừa hiệu năng trên mạng chập chờn

Chào các bạn, hôm nay mình muốn chia sẻ với các bạn một câu chuyện dở khóc dở cười mà mình và nhiều anh em làm hệ thống đã từng nếm trải.

Đọc thêm
Graceful shutdown: lợi ích và lý do phải có

Graceful shutdown: lợi ích và lý do phải có

Có lần team mình deploy bản mới lúc 11h đêm. kubectl rollout restart xong, 30 giây sau PagerDuty réo: 200 cái 502 trong 5 giây. Khách hàng đang đặt đồ ăn thì timeout. Mình lật đật rollout undo, xong ngồi check log - hóa ra pod cũ bị SIGTERM, HTTP server tắt ngay lập tức, 50 request đang xử lý dở bị cắt ngang hết.

Đọc thêm
Quản lý goroutine: errgroup, leak-proof, backpressure

Quản lý goroutine: errgroup, leak-proof, backpressure

Tháng trước, một service của team mình đột nhiên chậm như rùa. p50 latency từ 50ms nhảy lên 3 giây. Mở Grafana lên - 120,000 goroutine đang chạy. Bình thường chỉ 200. Ai đó vừa push code quên defer cancel() trong một vòng lặp xử lý batch.

Đọc thêm
Khi nào nên dùng cache (và khi nào không)

Khi nào nên dùng cache (và khi nào không)

Có một bug production mà đến giờ mình vẫn nhớ như in: user A hủy đơn hàng, nhưng app vẫn hiển thị “đang giao” trong 10 phút tiếp theo. Support nhận 30 ticket trong 1 buổi sáng. Nguyên nhân: cache TTL 10 phút, nhưng không ai invalidate khi order status thay đổi.

Đọc thêm
API Filtering: gọi dữ liệu như dân sành cà phê

API Filtering: gọi dữ liệu như dân sành cà phê

Năm đầu đi làm, mình từng viết một endpoint GET /api/menus trả về… toàn bộ menu. 200 items mỗi lần gọi. JSON nặng 1.2MB. Frontend chỉ cần tên + giá của 10 món đang active. Mình nhớ câu đầu tiên anh lead nói: “Mày đang gửi cả cái kho hàng cho người ta chỉ cần xem menu đấy à?”

Đọc thêm
Context trong Go: truyền dữ liệu, deadline, cancel - dùng đúng hay chết hiệu năng

Context trong Go: truyền dữ liệu, deadline, cancel - dùng đúng hay chết hiệu năng

Hồi mới code Go, mình có một bug production kỳ lạ: cứ sau 3-4 ngày chạy, service tự dưng ngốn 8GB RAM rồi OOM. Mò suốt chiều thứ Sáu mới phát hiện: một cái goroutine không bao giờ kết thúc vì mình quên truyền context xuống gRPC call. Mỗi request leak một goroutine, sau 100K request thì server “đội mồ” luôn.

Đọc thêm