确认截止时间为10秒。当我使用异步拉动方式处理消息时,我不调用message.ack()
和message.nack()
,而是等待消息确认截止日期,并期望Pub/Sub
重新传递此消息。
等待10秒钟后,订户不再收到该消息。这是我的代码:
subscriber
:
import { pubsubClient, IMessage, parseMessageData } from '../../googlePubsub';
import { logger } from '../../utils';
const topicName = 'asynchronous-pull-test';
const subName = 'asynchronous-pull-test';
const subscription = pubsubClient.topic(topicName).subscription(subName);
const onMessage = (message: IMessage) => {
const { data, ...rest } = message;
const jsonData = parseMessageData(data);
logger.debug('received message', { arguments: { ...rest, data: jsonData } });
const publishTime = new Date(message.publishTime).getTime();
const republishTimestamp = Date.now() - 5 * 1000;
if (publishTime < republishTimestamp) {
logger.info('message acked');
message.ack();
} else {
logger.info('push message back to MQ');
}
};
logger.info('subscribe the MQ');
subscription.on('message', onMessage).on('error', (err: Error) => logger.error(err));
publisher
:
const topicName = 'asynchronous-pull-test';
async function main() {
const messagePayload = { email: faker.internet.email(), campaignId: '1' };
await pub(topicName, messagePayload);
}
main();
我正在使用"@google-cloud/pubsub": "^0.19.0",
我希望订户将在10秒钟后的确认截止日期再次收到该消息。这意味着我的订户每10秒接收和处理一次消息。我错了吗?
答案 0 :(得分:0)
您应该忽略该消息,以告知发布/订阅重新传递它。 Documentation
答案 1 :(得分:0)
Google Cloud Pub / Sub客户端库会自动调用modifyAckDeadline
,以在可配置的时间内未确认或未确认的消息。在node.js中,这是通过maxExtension
属性进行配置的:
const options = {
flowControl: {
maxExtension: 60, // Specified in seconds
},
};
const subscription = pubsubClient.topic(topicName).subscription(subName, options);
通常,不确认/不确认消息不是延迟重新发送邮件的一种好习惯。这将导致该消息仍与flow control个最大未完成消息相对,这意味着它可以阻止将来的消息传递,直到原始接收的消息被确认或拒绝为止。目前,Cloud Pub / Sub还没有一种方法可以延迟邮件重新交付,但正在考虑中。