Lập trình 22/09/2026 9 phút

Fan-out WebSocket tới 10.000 client đo thật: ghi tuần tự bắt client cuối chờ 91 ms, chia 10 worker còn 31 ms, PreparedMessage bớt 2 ms, một client không đọc làm cả 10.000 client trễ 1,1 giây với ghi tuần tự, 1.000 với shard, không ai với kênh riêng

Server Go phát 40 vòng, mỗi vòng 1 KB tới 10.000 client, ghi timestamp vào payload để client đo độ trễ thật: 400.000 mẫu mỗi cách. Ghi tuần tự: client cuối nhận sau 91 ms, p99 99 ms. Chia 10 worker: 31 ms, p99 43 ms, CPU mỗi vòng tăng từ 90 lên 140 ms. PreparedMessage chỉ giảm 2 đến 3 ms vì ở 1 KB chi phí là syscall chứ không phải copy. Kênh riêng mỗi client: 31 ms nhưng thêm 10.000 goroutine và 52 MB. Lẫn vào một client không đọc với write deadline 1 giây: tuần tự kẹt cả vòng 1.105 ms nên p99 toàn bài thành 1.066 ms, shard kẹt một phần mười số client, kênh riêng không ảnh hưởng ai.