Nội dung bài viết
Video học lập trình mỗi ngày
Khi sử dụng FCM (Firebase) với sendMulticast thì theo tài liệu chỉ có thể gửi một lúc giới hạn 500 tokens hay hiểu là 500 thiết bị một lúc. Mẹo nhỏ trong bài viết này hướng dẫn bạn có thể làm được nhiều hơn với 500 tokens.
NOTES: Bài viết thuộc Series - Mẹo viết javascript
Use SendMulticast with Firebase
Theo tài liệu trên FCM thì bạn có thể sử dụng SendMulticast
để send notification đến nhiều thiết bị. Bạn nào chưa biết cách config thì có thể xem tại bài viết Firebase push notification với nodejs dành cho người mới bắt đầu.
API REST và API FCM dành cho quản trị viên cho phép bạn gửi nhiều thư tới danh sách các mã thông báo đăng ký thiết bị. Bạn có thể chỉ định tối đa 500 mã thông báo đăng ký thiết bị cho mỗi lần gọi.
Ví dụ về Nodejs:
// Create a list containing up to 500 registration tokens.
// These registration tokens come from the client FCM SDKs.
const registrationTokens = [
'YOUR_REGISTRATION_TOKEN_1',
// …
'YOUR_REGISTRATION_TOKEN_N',
];
const message = {
data: {score: '850', time: '2:45'},
tokens: registrationTokens,
};
admin.messaging().sendMulticast(message)
.then((response) => {
console.log(response.successCount + ' messages were sent successfully');
});
Nếu nói như vậy thì tokens > 500 thì sao? Và đây là một giải pháp.
How to send push notification to > 500 tokens with multicast
Giải pháp đơn giản đó là nếu như bạn có 1000 tokens
thì bạn chia ra thành 2 gói, mỗi gói có 500 tokens
. Và gửi hai lần. Nếu hệ thống lớn bạn phải sử dụng Message Queue để được hỗ trợ một cách tốt nhất.
Bởi vì khi bạn cố tình gửi hơn 500 tokens một lần thì bạn sẽ nhận ngay một lỗi của FCM: Error: tokens list must not contain more than 500 items
. Chính vì vậy, để đơn giản hoá thì chúng ta sẽ sử dụng thuật toán Chunk array
. Và sau đây là Code đơn giản.
How to send push notification to > 500 tokens with multicast
chunk array javascript es6
Ví dụ ta có:
const sliceIntoChunks = async (arr, chunkSize) => {
const res = [];
for (let i = 0; i < arr.length; i += chunkSize) {
const chunk = arr.slice(i, i + chunkSize);
res.push(chunk);
}
return res;
}
Cách sử dụng:
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
console.log(sliceIntoChunks(arr, 3));
//[[ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ], [ 10 ]]
Chạy đoạn code trên ta có kết quả sau: [[ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ], [ 10 ]]
.
Sau đó chúng ta sẽ thực hiện send từng package như sau:
for (const arr of sliceIntoChunks(arr, 3)) {
sendMultiCastStuff(arr)
}
Một mẹo nhỏ này cho phép bạn xử lý được vấn đề khi sử dụng SendMulticast
với FCM trên. Đừng quên bạn có thể khám phá với nhiều mẹo viết javascript.