Họ đang đo gì
Bạn có nghĩ tới backpressure và giới hạn của bên thứ ba không, hay chỉ nghĩ tới thông lượng của mình.
Trả lời ngắn~30 giây
10 triệu trong 300 giây là khoảng 33.000 thông báo/giây. Không đẩy trực tiếp: ghi một bản ghi chiến dịch, rồi một tiến trình mở rộng danh sách người nhận thành các lô đưa vào hàng đợi, và một nhóm worker tiêu thụ. Điều quyết định thành bại là giới hạn tần suất PHÍA RA: APNs, FCM và nhà cung cấp email đều có hạn mức riêng, nên worker phải chia theo kênh và mỗi kênh có bộ điều tiết riêng — nếu không bạn bị chặn và mất cả đợt gửi.
Giải thích sâu
Việc mở rộng danh sách người nhận là chỗ hay bị làm sai. Truy vấn 10 triệu hàng vào bộ nhớ rồi lặp là hết RAM; truy vấn theo OFFSET là chậm dần theo cấp số. Cách đúng là keyset pagination trên khoá chính, mỗi lô vài nghìn id, và ghi lại con trỏ đã tới đâu để nếu tiến trình chết thì tiếp tục được chứ không gửi lại từ đầu — gửi trùng cho 10 triệu người là một sự cố truyền thông, không chỉ là lỗi kỹ thuật.
Backpressure là khái niệm cần nói ra. Nếu producer đẩy vào hàng đợi nhanh hơn worker tiêu thụ, hàng đợi phình ra và độ trễ tăng vô hạn — bạn vẫn “đang gửi” sau hai tiếng. Nên producer phải nhìn độ dài hàng đợi và tự chậm lại. Đây cũng là lý do dùng hàng đợi có giới hạn tốt hơn hàng đợi vô hạn: nó biến một vấn đề ẩn thành một tín hiệu rõ ràng.
Cuối cùng là ưu tiên và cách ly. Thông báo chiến dịch không được chiếm hết đường của thông báo giao dịch — mã OTP phải tới trong vài giây kể cả khi đang có đợt gửi 10 triệu. Nghĩa là hai hàng đợi riêng với hai nhóm worker riêng, không phải một hàng đợi có trường priority. Cách ly bằng tài nguyên vật lý đáng tin hơn nhiều so với cách ly bằng logic sắp xếp.
Câu hỏi tiếp theo họ sẽ hỏi
?Làm sao đảm bảo không gửi trùng?
Không đảm bảo tuyệt đối được với at-least-once. Cách thực dụng là một bảng sent(campaign_id, user_id) có khoá chính ghép, chèn trước khi gửi; trùng thì bỏ qua. Nó không hoàn hảo — có thể chèn xong rồi chết trước khi gửi — nhưng nó biến “gửi hai lần” thành “có thể bỏ sót một ít”, và đó là hướng sai an toàn hơn.
Trả lời thế này là mất điểm
- Bỏ qua giới hạn của nhà cung cấp. Bạn không kiểm soát FCM, và bị họ chặn thì không có cách nào tự sửa.
- Một hàng đợi duy nhất cho mọi loại thông báo. Đợt gửi chiến dịch sẽ chôn mã OTP của người đang đăng nhập.