Почему сообщение не должно быть доставлено? - PullRequest
0 голосов
/ 29 мая 2019

Срок подтверждения - 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 голосов
/ 29 мая 2019

Клиентские библиотеки 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 max, что означает, что это может помешать доставке будущих сообщений до тех пор, пока первоначально полученные сообщения не будут проверены или собраны.В настоящее время Cloud Pub / Sub не имеет средств для задержки доставки сообщений, но это что-то на рассмотрении.

0 голосов
/ 29 мая 2019

Вы должны удалить сообщение, чтобы сообщить Pub / Sub о его повторной доставке. Документация

...