aws FIFO queue возвращает пустую очередь, хотя в ней есть доступные сообщения - PullRequest
0 голосов
/ 19 мая 2018

У меня есть очередь FIFO с более чем 2 мил сообщениями.И я хочу обработать их с помощью лямбда-функций, но 9 из 10 раз я опрашиваю сообщения и получаю ответ, что очередь пуста.Что определенно не соответствует действительности.Я пытался перейти на длительный опрос, но это не помогло.Вот мой код для опроса сообщений.

import { create as listenToSqsQueue } from "sqs-consumer";

listenToSqsQueue({
    queueUrl: Config.aws.sqsurl,

    handleMessage: async function (message, done){
        // do some work with `message`s
        Promise.resolve(invokePoller(functionName, message, callback));
        done();
      }
    ,         
    batchSize: 10
}).on("empty", function() {
    callback(undefined, "Queue is empty");
}).on("error", function(error: Error, message: any) {
    console.error(error, message);
    callback(error)
}).start();

1 Ответ

0 голосов
/ 20 мая 2018

Я бы посоветовал вам попробовать небольшой тест, как показано ниже, чтобы понять это поведение очередей FIFO.

  1. Создание очереди FIFO для целей тестирования
  2. Отправка двух сообщений в очередь
  3. Вызов API-интерфейса получения сообщений из очереди.Вы должны получить первое сообщение, которое вы ввели в очередь
  4. Несколько раз вызывать API получения сообщений, и для последующих попыток вы получите пустые ответы.Через 30 секунд (время ожидания видимости) вы получите то же сообщение, если вызовете API получения сообщений.Однако вы никогда не получите второе сообщение из очереди.
  5. Удалите сообщение, полученное на шаге 3
  6. Вызовите API получения сообщений, и вы должны получить второе отправленное сообщениев очередь

Причина, по которой ваш потребитель очереди получает пустые ответы для API получения сообщений, заключается в том, что потребитель очереди не удалил полученное сообщение после его обработки.Если в вашу очередь FIFO доставлены другие сообщения, а уже доставленное сообщение не удалено, это может нарушить гарантию «Первая доставка - первая доставка» .Потому что второе сообщение может быть обработано до обработки первого сообщения.Это поведение становится более очевидным, если учесть ситуацию, в которой есть несколько потребителей очереди.

В заключение я бы предложил рассмотреть возможность удаления сообщения в качестве уведомления в очередь FIFO, чтобы указать, что потребитель очереди имеетсообщение успешно обработано, и очереди FIFO разрешено доставлять следующее сообщение в очередь.Чтобы исправить код клиента, вы можете изменить его, чтобы удалить сообщение после его успешной обработки.

...