首页 > 解决方案 > 即使在获得 HTTP 200/202/204 之后,google-cloud-pubsub 推送也会继续重试

问题描述

我们使用具有云运行推送订阅的 google-cloud-pubsub 主题发布消息。云运行服务收到消息后会立即通过发送 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 

标签: google-cloud-platformgoogle-cloud-pubsubgoogle-cloud-run

解决方案


推荐阅读