我们使用具有云运行推送订阅的 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