Amazon SQS для файлов в Amazon S3 - PullRequest
       9

Amazon SQS для файлов в Amazon S3

0 голосов
/ 18 октября 2018

Согласно это , если я хочу создать лямбда-функцию для отправки данных из SQS в S3, каждое сообщение SQS будет храниться в отдельном объекте S3 (я предполагаю, что это связано с тем, что лямбда-функция будетактивировать каждый раз, когда SQS получает сообщение)

Можно ли, например, отправить все сообщения, полученные SQS за последние 24 часа, одному и тому же объекту S3?

EDIT

Это может быть код для получения сообщения из очереди и отправки его на S3

var receiveMessageRequest = new ReceiveMessageRequest { QueueUrl = myQueueUrl };
 var receiveMessageResponse = sqs.ReceiveMessageAsync(receiveMessageRequest).GetAwaiter().GetResult(); ;
 while (receiveMessageResponse.Messages.Count > 0)
 {
     if (receiveMessageResponse.Messages != null)
     {
         Console.WriteLine("Printing received message.\n");
         foreach (var message in receiveMessageResponse.Messages)
         {
             if (!string.IsNullOrEmpty(message.Body))
             {
                 <...> SEND TO S3
             }
         }
         var messageRecieptHandle = receiveMessageResponse.Messages[0].ReceiptHandle;
         //Deleting a message
         Console.WriteLine("Deleting the message.\n");
         var deleteRequest = new DeleteMessageRequest { QueueUrl = myQueueUrl, ReceiptHandle = messageRecieptHandle };
         sqs.DeleteMessageAsync(deleteRequest).GetAwaiter().GetResult();
     }
     receiveMessageRequest = new ReceiveMessageRequest { QueueUrl = myQueueUrl };
     receiveMessageResponse = sqs.ReceiveMessageAsync(receiveMessageRequest).GetAwaiter().GetResult();
}

Но какой вариант будет наилучшим для отправки на S3?Я имею в виду, что в S3 я бы заплатил, чтобы поместить запрос, и если бы я делал это элемент за элементом, это могло бы быть довольно неэффективным.уверен, что я должен использовать для лучшего результата

Другой вопрос: когда я разрабатывал локально, я использовал ReceiveMessage, но в лямбда-функции я должен использовать ReceiveMessageAsync, почему это?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Если вы хотите отправить все сообщения за последние 24 часа в SQS, вы можете сделать это с помощью функции Scheduled Lambda с определенными ограничениями, как описано ниже.

Прежде всего потокбыло бы, что у вас есть запланированная лямбда, которая выполняется каждые 24 часа.Теперь всякий раз, когда эта лямбда вызывается по расписанию, вы читаете SQS для всех доступных событий, затем добавляете их одно за другим и затем записываете всю эту строку в объект S3.

Это все события, накопленные за 24-часовое окно, сохраненные в одном и том же объекте S3.

Ограничения при таком подходе

  1. Ограничение времени ожидания: если событий слишком много, вы можете исчерпать ограничение максимального времени ожидания 15 минут для AWS Lambda
  2. Ограничение памяти: если событий слишком много, вы можете исчерпать максимальное ограничение памяти в 1,5ГБ для AWS Lambda.

Чтобы преодолеть это ограничение, вы можете рассмотреть планирование лямбды с более высокой частотой, чем 24 часа (может быть, 12 часов, 6 часов или 3 часа или что-либо другое, если это возможно в вашем случае)

0 голосов
/ 18 октября 2018

Возможное решение:

Вы можете запланировать событие cloudwatch, которое будет обрабатывать лямбду.

Эта лямбда будет читать сообщения SQS и хранить их в корзине S3 (каждое сообщение представляет объект)

оформить статью: ссылка

...