google-cloud-pubsub push продолжает повторять попытку даже после получения HTTP 200/202/204 - PullRequest
2 голосов
/ 12 июня 2019

Мы публикуем сообщение, используя тему google-cloud-pubsub, в которой есть push-подписка для запуска в облаке. Служба облачного запуска подтверждает сообщение, как только оно его получает, отправляя 204/200. Несмотря на признание, pubsub продолжает повторять попытки. Эта реализация основана на https://cloud.google.com/run/docs/tutorials/system-packages

Есть ли способ убедиться, что pubsub не повторяет попытку после подтверждения. Мне интересно, есть ли единственный способ исправить это, реализовать промежуточное ПО и отклонить повторяющиеся сообщения.

app.post('/deploy/environment', (req, res) => {
    try {
        if (!req.body) {
            const msg = `No Pub/Sub message received`;
            logger.error(`error: ${msg}`);
            res.status(202).send(`Bad Request: ${msg}`);
            return;
        }
        if (!req.body.message || !req.body.message.data) {
            const msg = `Invalid Pub/Sub message format`;
            logger.error(`error: ${msg}`);
            res.status(202).send(`Bad Request: ${msg}`);
            return;
        }

        const dataUtf8encoded = Buffer.from(req.body.message.data, 'base64').toString('utf8');
        logger.info(`Message content: ${dataUtf8encoded}`);
        let content;
        try {
            content = JSON.parse(dataUtf8encoded);
        } catch (ex) {
            logger.warn('Bad request invalid JSON');
            return res.sendStatus(202);
        }
        if (!content.environmentId) {
            const msg = `EnvironmentId is a mandatory parameter`;
            logger.error(`error: ${msg}`);
            res.status(202).send(`Bad Request: ${msg}`);
            return;
        } else if (!content.environment) {
            const msg = `Environment is a mandatory parameter`;
            logger.error(`error: ${msg}`);
            res.status(202).send(`Bad Request: ${msg}`);
            return;
        } else if (!content.roles) {
            const msg = `Roles is a mandatory parameter`;
            logger.error(`error: ${msg}`);
            res.status(202).send(`Bad Request: ${msg}`);
            return;
        }
        res.status(204).send();
        runSystemPackage(content.environmentId, content.environment, content.roles);
    } catch (err) {
        logger.error(`error: ${err.message}`);
        res.status(202).send(`${err}`);
    }
});

Журналы:

"2019-06-12T04:49:44.015789Z"  POST /deploy/environment 204 1ms 
"2019-06-12T04:49:44.014897Z"  Message content: {"environmentId": "5","environment": "pvs5", "roles": ["core"]} 
"2019-06-12T03:42:22.251890Z"  Message [object Promise] published. 

Snippet showing retries:
"2019-06-12T04:57:01.167608Z"  POST /deploy/environment 204 1ms 
"2019-06-12T04:56:43.233886Z"  POST /deploy/environment 204 39ms 
"2019-06-12T04:55:33.630202Z"  POST /deploy/environment 204 0ms 
"2019-06-12T04:55:12.609798Z"  POST /deploy/environment 204 0ms 

...