Trả lời nhanh: Một push notification đi qua bốn chặng: máy chủ của bạn quyết định gửi, đẩy sang dịch vụ của Apple hoặc Google, dịch vụ đó chuyển tới thiết bị, và ứng dụng hiển thị. Chặng cuối bạn không kiểm soát, nên đừng bao giờ coi thông báo đẩy là kênh truyền tin đáng tin cậy. Phần bạn phải tự làm gồm: quản lý mã thiết bị, dọn mã đã chết, và gửi hàng loạt qua hàng đợi để không làm nghẽn máy chủ khi gửi cho hàng chục nghìn người.
Thông báo đẩy trông đơn giản khi thử với một thiết bị, rồi trở thành một hệ thống thật sự khi bạn có mười nghìn người dùng và muốn gửi một chiến dịch. Bài này đi vào phần kiến trúc và phần chi phí, những thứ mà hướng dẫn cài đặt thường bỏ qua.
Luồng đi của một thông báo
- Ứng dụng xin quyền và nhận mã thiết bị từ hệ điều hành, rồi gửi mã đó về máy chủ của bạn.
- Máy chủ lưu mã kèm thông tin người dùng, loại thiết bị và phiên bản ứng dụng.
- Khi cần gửi, máy chủ gọi tới dịch vụ của Apple hoặc Google kèm mã thiết bị và nội dung.
- Dịch vụ đó chuyển tới thiết bị nếu máy đang bật và có mạng.
Chặng bốn là chỗ ngoài tầm kiểm soát: máy tắt, hết pin, người dùng tắt thông báo, hoặc hệ điều hành gộp và trì hoãn. Vì vậy nguyên tắc thiết kế là thông báo đẩy chỉ để nhắc, không để truyền thông tin quan trọng. Thông tin quan trọng phải có trong ứng dụng khi người dùng mở lên, hoặc gửi thêm qua kênh khác.
Quản lý mã thiết bị
Đây là phần chiếm nhiều công nhất và cũng hay làm ẩu nhất.
Bảng lưu mã nên có: mã thiết bị, người dùng, nền tảng, phiên bản ứng dụng, thời điểm cập nhật gần nhất, và trạng thái. Ba quy tắc:
- Một người dùng có nhiều thiết bị, và một thiết bị có thể đổi người dùng. Đừng thiết kế quan hệ một một.
- Mã thay đổi theo thời gian. Ứng dụng phải gửi lại mã mỗi lần khởi động, và máy chủ cập nhật thay vì tạo bản ghi mới.
- Dọn mã chết. Khi dịch vụ báo mã không còn hợp lệ, hãy đánh dấu và ngừng gửi. Không dọn thì sau một năm bạn gửi cho hàng chục nghìn thiết bị không tồn tại, tốn thời gian và làm số liệu sai lệch.
Gửi hàng loạt cho đúng
Gửi cho một người thì gọi trực tiếp cũng được. Gửi cho năm mươi nghìn người mà làm trong lượt xử lý một yêu cầu web là công thức làm nghẽn máy chủ.
Cách đúng:
- Yêu cầu gửi tạo ra một công việc trong hàng đợi, trả về ngay cho người quản trị.
- Tiến trình nền chia danh sách thành từng lô và gửi theo tốc độ vừa phải.
- Ghi lại kết quả từng lô để biết bao nhiêu thành công, bao nhiêu mã chết.
- Thử lại với lỗi tạm thời, bỏ hẳn với lỗi mã không hợp lệ.
Cách dựng hàng đợi nằm ở bài về hàng đợi. Một lưu ý về tốc độ: đừng gửi nhanh hết mức có thể, vì nếu thông báo dẫn người dùng vào ứng dụng thì bạn vừa tạo ra một đợt truy cập dồn dập vào chính máy chủ của mình. Rải đều trong vài phút là cách đơn giản để tránh tự làm sập mình.
Chi phí thật nằm ở đâu
Phần gửi tới thiết bị không tính phí theo lượt. Chi phí thật gồm ba khoản:
- Máy chủ và hàng đợi. Gửi hàng loạt tốn CPU và tốn nhiều lượt gọi ra ngoài. Với chiến dịch lớn, đây là lúc máy chủ chịu tải cao nhất trong tháng.
- Database. Đọc danh sách mã thiết bị và ghi kết quả gửi. Bảng này lớn nhanh và cần chỉ mục đúng.
- Đợt truy cập sau thông báo. Khoản bị quên nhiều nhất: người dùng bấm vào và cùng lúc mở ứng dụng, tạo ra đỉnh truy cập gấp nhiều lần bình thường.
Nếu bạn dùng dịch vụ trung gian có tính phí theo số thiết bị, hãy so với chi phí tự dựng: phần tự dựng chủ yếu là công viết lần đầu, sau đó chỉ tốn máy chủ. Cân nhắc này giống hệt bài toán ở bài về tự kiểm soát hạ tầng.
Vài điều làm người dùng không tắt thông báo
Kỹ thuật chạy tốt mà người dùng tắt thông báo thì cũng bằng không. Bốn nguyên tắc:
- Xin quyền đúng lúc. Đừng xin ngay màn hình đầu tiên. Xin khi người dùng vừa làm một việc mà thông báo có ích, ví dụ vừa đặt đơn.
- Cho người dùng chọn loại thông báo. Tách khuyến mãi khỏi thông báo về đơn hàng. Người tắt khuyến mãi vẫn giữ thông báo quan trọng.
- Đừng gửi vào đêm khuya. Nếu người dùng ở nhiều múi giờ, hãy gửi theo giờ địa phương của họ.
- Nội dung phải nói được điều gì cụ thể. Thông báo chung chung là lý do phổ biến nhất khiến người ta tắt.
Cuối cùng, hãy đo tỷ lệ người còn bật thông báo theo thời gian. Con số này giảm dần là dấu hiệu bạn đang gửi quá nhiều, và nó khó lấy lại hơn nhiều so với việc giữ từ đầu.
Quản lý mã thiết bị, phần hay bị làm ẩu
| Việc | Vì sao quan trọng | Nếu bỏ qua |
|---|---|---|
| Cập nhật mã mỗi khi ứng dụng khởi động | Mã thiết bị đổi theo thời gian | Gửi vào hư không, tưởng đã gửi |
| Xóa mã khi nhà cung cấp báo không hợp lệ | Thiết bị đã gỡ ứng dụng | Danh sách phình toàn mã chết |
| Gắn mã với người dùng, không chỉ với thiết bị | Một người có nhiều thiết bị | Gửi thiếu hoặc gửi sai người |
| Xóa mã khi người dùng đăng xuất | Thiết bị dùng chung | Người sau nhận thông báo của người trước |
Dòng cuối là lỗi gây hậu quả về quyền riêng tư: điện thoại dùng chung hoặc máy bán lại, người mới nhận được thông báo chứa thông tin của người cũ.
Khoản chi chính không nằm ở phần gửi thông báo
- Phần gửi thông báo tới điện thoại thường miễn phí ở mức thông thường, nên đây không phải khoản chi chính.
- Khoản chi thật là hạ tầng phía bạn: lưu danh sách mã thiết bị, xử lý hàng đợi gửi, và ghi nhật ký.
- Gửi hàng loạt cho hàng chục nghìn thiết bị cần hàng đợi và tiến trình xử lý nền, không gửi thẳng trong luồng trả lời.
- Nếu dùng dịch vụ trung gian có tính phí theo số thông báo, đó mới là khoản cần theo dõi.
Đưa vào hàng đợi khi gửi cho hàng chục nghìn máy
# Ba viec bat buoc khi gui cho hang chuc nghin thiet bi: # 1. Dua vao hang doi, xu ly boi tien trinh nen# Gui thang trong luong tra loi la lam nghen may chu # 2. Chia lo va co do tre giua cac lo# Gui het mot luc la ca he thong cua ban bi doi truy cap cung luc# khi nguoi dung mo ung dung # 3. Ghi lai ket qua tung lo, va xoa ma khong hop le# Neu khong, danh sach phinh dan toan ma chet # Theo doi: so thong bao gui, so thanh cong, so ma bi tu choi# Ty le bi tu choi tang dan la dau hieu chua don ma chetGiữ cho người dùng không tắt thông báo
- Chỉ gửi thứ người dùng thật sự cần biết ngay. Thông báo khuyến mãi hằng ngày là cách nhanh nhất để bị tắt.
- Cho người dùng chọn loại thông báo muốn nhận, thay vì chỉ có bật hoặc tắt tất cả.
- Đừng gửi vào đêm khuya. Tính múi giờ Việt Nam khi đặt lịch.
- Xin quyền gửi thông báo đúng lúc, sau khi người dùng đã thấy giá trị ứng dụng, không phải ngay màn hình đầu tiên.
Câu hỏi thường gặp
Thông báo đẩy có đảm bảo tới nơi không?
Không. Máy tắt, mất mạng, người dùng tắt thông báo, hoặc hệ điều hành trì hoãn đều khiến nó không tới. Hãy coi đây là kênh nhắc nhở, còn thông tin quan trọng phải có sẵn trong ứng dụng khi người dùng mở lên.
Gửi cho hàng chục nghìn người thì cần gì?
Một hàng đợi và tiến trình nền chia lô, cộng với việc rải đều tốc độ gửi. Đừng gửi trong lượt xử lý yêu cầu web, và nhớ rằng đợt người dùng mở ứng dụng ngay sau đó cũng là tải cần chuẩn bị.
Vì sao danh sách thiết bị phình to bất thường?
Vì bạn tạo bản ghi mới mỗi lần ứng dụng gửi mã thay vì cập nhật, và không dọn mã đã chết. Hãy cập nhật theo mã và đánh dấu ngừng gửi khi dịch vụ báo mã không còn hợp lệ.
Máy chủ cần cấu hình thế nào cho chiến dịch lớn?
Chuẩn bị cho đỉnh tải chứ không cho mức trung bình: lúc gửi và lúc người dùng đổ vào là hai đỉnh liên tiếp. Ổ đĩa nhanh và đủ RAM cho database quan trọng hơn số nhân xử lý.
