Мы публикуем сообщение, используя тему 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