Как получить все сообщения из очереди SQS, если количество сообщений и количество сообщений, полученных от sqs.receiveMessage, не совпадают? - PullRequest
0 голосов
/ 04 августа 2020

Все это работает в VP C, поэтому другой код не взаимодействует с этими очередями. Это проверка. Сценарий:

  1. Настроить обработчик очереди для очереди SQS
  2. Pu sh набор неисправных сообщений в очередь
  3. Дождитесь прибытия этих сообщений в DLQ (получить счетчик очереди SQS, подождать, пока он достигнет нуля)
  4. Проверить счетчик в DLQ
  5. Если счетчик не совпадает с ожидаемым числом, захватите сообщения в очередь и выгружать их в консоль

Функции:

getAllMessages = async function (url, count) {
    let maxResults = count > 10 ? 10 : count;
    let params = {
        QueueUrl: url,
        MaxNumberOfMessages: maxResults
    };

    const { Messages } = await sqs.receiveMessage(params).promise();
    return Messages;
};


getSqsMsgCount = async function (url) {
    let params = {
        QueueUrl: url,
        AttributeNames: ['ApproximateNumberOfMessages',
            'ApproximateNumberOfMessagesNotVisible',
            'ApproximateNumberOfMessagesDelayed']
    };

    return sqs.getQueueAttributes(params).promise().then(data => {
        return parseInt(data.Attributes.ApproximateNumberOfMessages) +
            parseInt(data.Attributes.ApproximateNumberOfMessagesNotVisible) +
            parseInt(data.Attributes.ApproximateNumberOfMessagesDelayed);
    }, err => {
        console.log(`Failed to retrieve sqs message count for ${url}`);
        Promise.reject(err);
    });
};

Проблема в том, что getSqsMsgCount сообщает мне, что в очереди 11 сообщений (что на 4 больше, чем ожидалось), но когда я звоню getAllMessages, я всегда получаю ровно один.

Как мне получить одно из этих двух:

  1. Сообщения, полученные от receiveMessage, чтобы соответствовать номеру из функция getSqsMsgCount
  2. getSqsMsgCount функция, чтобы быть более точной

Я знаю, что в getSqsMsgCount написано «Приблизительно», но это такое небольшое количество сообщений (11 самое большее) кажется разумным ожидать, что код будет иметь правильный счет. Поскольку это DLQ, сообщения больше нигде не будут передаваться. В DLQ нет слушателей очереди. Я пробовал добавить несколько минут ожидания, прежде чем проверять счетчик DLQ.

...