Concurrency

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