为什么不重新发送邮件?

时间:2019-05-29 04:50:08

标签: google-cloud-platform google-cloud-pubsub

确认截止时间为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秒接收和处理一次消息。我错了吗?

2 个答案:

答案 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还没有一种方法可以延迟邮件重新交付,但正在考虑中。