Отправка push-уведомлений всем подписчикам за один звонок - PullRequest
0 голосов
/ 18 октября 2019

Я внедряю push-уведомления в Интернете с работниками сервисов на моем сайте. У меня есть веб-сайт работы, и новая работа публикуется через каждый час. Я хочу уведомить подписчика о новой работе, когда она будет опубликована. Я сделал реализацию в получении подписанного и написанного пользователем узла сервера, а также для отправки push-уведомлений путем генерации ключей VAPID.

У меня есть вопрос, я чувствую, что когда мне нужно отправить push-уведомление всем абонентам, нужно ли мне отправлять новый вызов для каждого пользователя, или есть какой-то механизм для отправки его одним вызовом всем абонентам.

Например, если у меня 100 000, нужно ли мне совершать 100 000 звонков или есть какой-то другой способ отправить 1 звонок и уведомить всех 100 000 подписчиков о новом обновлении работы за один раз?

Я определенно чувствую, что меня ограничит соответствующий браузер, если я отправлю тысячи звонков за один раз.

Есть ли способ сделать это одним звонком?

Вот мой текущий код маршрута от экспресс-сервера отправки уведомлений всем подписчикам.

const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const Subscription = mongoose.model('subscribers');
const q = require('q');
const webPush = require('web-push');
const keys = require('./../config/keys');
router.post('/', (req, res) => {
    const payload = {
        title: req.body.title,
        message: req.body.message,
        url: req.body.url,
        ttl: req.body.ttl,
        icon: req.body.icon,
        image: req.body.image,
        badge: req.body.badge,
        tag: req.body.tag
    };

Subscription.find({}, (err, subscriptions) => {
    if (err) {
        console.error(`Error occurred while getting subscriptions`);
        res.status(500).json({
            error: 'Technical error occurred'
        });
    } else {
        let parallelSubscriptionCalls = subscriptions.map((subscription) => {
            return new Promise((resolve, reject) => {
                const pushSubscription = {
                    endpoint: subscription.endpoint,
                    keys: {
                        p256dh: subscription.keys.p256dh,
                        auth: subscription.keys.auth
                    }
                };

                const pushPayload = JSON.stringify(payload);
                const pushOptions = {
                    vapidDetails: {
                        subject: 'http://example.com',
                        privateKey: keys.privateKey,
                        publicKey: keys.publicKey
                    },
                    TTL: payload.ttl,
                    headers: {}
                };
                webPush.sendNotification(
                    pushSubscription,
                    pushPayload,
                    pushOptions
                ).then((value) => {
                    resolve({
                        status: true,
                        endpoint: subscription.endpoint,
                        data: value
                    });
                }).catch((err) => {
                    reject({
                        status: false,
                        endpoint: subscription.endpoint,
                        data: err
                    });
                });
            });
        });
        q.allSettled(parallelSubscriptionCalls).then((pushResults) => {
            console.info(pushResults);
        });
        res.json({
            data: 'Push triggered'
        });
    }
});

});

router.get('/', (req, res) => {
    res.json({
        data: 'Invalid Request Bad'
    });
});
module.exports = router;

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

В настоящее время стандарт веб-push не позволяет отправлять одно и то же уведомление нескольким получателям: если вы работаете напрямую с сервисом push-уведомлений в браузере, вам нужно будет сделать отдельный звонок для каждого получателя.

Я уже спрашивал об этом на официальном репозитории Github в 2016 году: https://github.com/w3c/push-api/issues/208

Если вы хотите разгрузить свое приложение, вы можете использовать push-сервис, который выполняет работу от вашего имени:затем вы делаете один вызов API для службы push, и она выполняет тысячи вызовов для службы push браузера.

В настоящее время я не вижу проблем с регулированием, даже с несколькими миллионами уведомлений в час.

1 голос
/ 19 октября 2019

Если вы хотите сделать только один вызов API, вы можете использовать Firebase для этого. Вы можете просто подписать своих пользователей на «тему», а затем сделать всего один API-вызов для конечной точки FCM, указав эту тему в теле запроса, и позволить Google выполнять всю работу по отправке push-уведомлений вашим подписчикам. Также вы можете использовать ваши текущие ключи VAPID в вашем проекте firabase.

...