3

クラウド実行プッシュ サブスクリプションを持つ google-cloud-pubsub トピックを使用してメッセージを発行します。クラウド実行サービスは、メッセージを受信するとすぐに 204/200 を送信して確認します。承認にもかかわらず、pubsub は再試行を続けます。この実装は、 https://cloud.google.com/run/docs/tutorials/system-packagesに基づいています。

ack 後に 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 

4

0 に答える 0