[ask] webpush notification - vấn đề gửi số lượng lớn trong thời gian ngắn
Vì không giỏi nên đây là lần thứ 3 mình lập topic để thảo luận, hỏi đáp về webpush notification. Vậy mà 1 năm sắp qua rồi mà vẫn chưa làm được nưa ... toang quá.
Vào vấn đề chính: webpush mình đang sử dụng thư viện https://github.com/web-push-libs/web-push-php
Ổn định: Khi gửi webpush cho 1 endpoint cụ thể thông báo đơn hàng thì mất 0.07s tổng thời gian, truy vấn db, req đến fcm.googleapis.com và ghi log.
Chậm: Khi gửi 200 endpoint, mình có xuất thời gian các phân đoạn như sau:
- Thời gian lấy 200 endpoints đưa vào mảng: 0.065155s
- Thời gian req đến fcm.googleapis.com: 4.419076s
- Thời gian ghi log: 0.187559s Tổng thời gian: 4.885548s
Rất chậm: Khi gửi liên tục > 2000 endpoint thời gian req fcm.googleapis.com lên 15-20s.
Hiện tại web-push-php sử dụng thư viện GuzzleHttp\Client để request
Sử dụng CPU: mariadbd: 36 đến 80% CPU - 2 core Intel(R) Xeon(R) 2200.186 56320 KB Sử dụng RAM: mariadbd: 270 Mb tổng - 4Gb ram Ping fcm.googleapis.com: 1.45 ms PHP Đã thử 7.3, 7.4, 8.0
Vấn đề mình nhận ra thời gian req đến fcm.googleapis.com hiện tại là nguyên nhân gây chậm. Vậy làm thế nào tối ưu thời gian này?.
Nếu chia cùng lúc ra thành 5 cron mỗi cron xử lý 200 endpoint 1 lần thì làm thế nào xử lý việc trùng endpoint.
- Lấy endpoint gửi log status = -2
- Lấy endpont gửi set status = -1
- Gửi xong set satus = 1
Trong trường hợp gửi nhiều notifications với cùng 1 thông báo thì nên lập 1 cái topic để người dùng subscribe vô. Sau cung thì đẩy thông báo lên api google rồi đợi google nhắn. Xem thêm https://firebase.google.com/docs/cloud-messaging/android/topic-messaging