Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services AmazonSQS到AmazonS3中的文件_Amazon Web Services_Amazon S3_Aws Lambda_Amazon Sqs - Fatal编程技术网

Amazon web services AmazonSQS到AmazonS3中的文件

Amazon web services AmazonSQS到AmazonS3中的文件,amazon-web-services,amazon-s3,aws-lambda,amazon-sqs,Amazon Web Services,Amazon S3,Aws Lambda,Amazon Sqs,根据,如果我想创建一个lambda函数来将数据从SQS发送到S3,那么每个SQS消息将存储在一个单独的S3对象中(我假设这是由于每当SQS接收到消息时,lambda函数都会被触发) 例如,有没有办法将SQS在过去24小时内收到的所有消息发送到同一个S3对象 编辑 这可能是从队列接收消息并将其发送到S3的代码 var receiveMessageRequest = new ReceiveMessageRequest { QueueUrl = myQueueUrl }; var receiveMe

根据,如果我想创建一个lambda函数来将数据从SQS发送到S3,那么每个SQS消息将存储在一个单独的S3对象中(我假设这是由于每当SQS接收到消息时,lambda函数都会被触发)

例如,有没有办法将SQS在过去24小时内收到的所有消息发送到同一个S3对象

编辑

这可能是从队列接收消息并将其发送到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();
}
var receiveMessageRequest=new receiveMessageRequest{QueueUrl=myQueueUrl};
var receiveMessageResponse=sqs.ReceiveMessageAsync(receiveMessageRequest.GetAwaiter().GetResult();
while(receiveMessageResponse.Messages.Count>0)
{
if(receiveMessageResponse.Messages!=null)
{
Console.WriteLine(“打印收到的消息。\n”);
foreach(receiveMessageResponse.Messages中的var消息)
{
如果(!string.IsNullOrEmpty(message.Body))
{
发送到S3
}
}
var messagereceipthandle=receiveMessageResponse.Messages[0]。ReceiptHandle;
//删除邮件
Console.WriteLine(“删除邮件。\n”);
var deleteRequest=new DeleteMessageRequest{QueueUrl=myQueueUrl,ReceiptHandle=MessageReceiptHandle};
sqs.DeleteMessageAsync(deleteRequest).GetAwaiter().GetResult();
}
receiveMessageRequest=new receiveMessageRequest{QueueUrl=myQueueUrl};
receiveMessageResponse=sqs.ReceiveMessageAsync(receiveMessageRequest.GetWaiter().GetResult();
}
但是,哪一个是发送到S3的最佳选项?我的意思是,在S3中,我会付费放置请求,如果我一个元素一个元素地执行,这可能会非常低效

我还认为将项目存储在内存中也不是一个好主意,因此我不确定应该使用什么来获得最佳效果


其他问题:当我在本地开发时,我使用了ReceiveMessage,但在Lambda函数中,我必须使用ReceiveMessageAsync,这是为什么?

一个可能的解决方案是:

您可以计划处理lambda的cloudwatch事件

这个lambda将读取SQS消息,并将它们存储在bucket S3中(每条消息表示一个对象)


签出本文:

一个可能的解决方案是:

您可以计划处理lambda的cloudwatch事件

这个lambda将读取SQS消息,并将它们存储在bucket S3中(每条消息表示一个对象)


签出本文:

如果您想将过去24小时内的所有消息发送到SQS中,那么您可以使用具有特定限制的功能来完成,如下所述

首先,您有一个每24小时执行一次的计划Lambda。现在,每当这个Lambda在调度中被调用时,您都会读取所有可用事件的SQS,然后一个接一个地追加它们,然后将整个字符串写入S3对象

这是在24小时窗口内累积的所有事件都存储在同一个S3对象中

这种方法的局限性

  • 超时限制:如果事件太多,则可能会耗尽AWS Lambda的最大超时限制15分钟
  • 内存限制:如果事件太多,则可能会耗尽AWS Lambda的最大内存限制1.5 GB

  • 为了克服这个限制,你可以考虑在24小时以上(可能是12小时或6小时或3小时或任何情况下,如果你的情况可行)调度lambda(

    < p>)。如果你想把所有的消息在最近24小时内发送到Sqs,那么你可以用下面解释的某些限制来完成这个功能。 首先,您有一个每24小时执行一次的计划Lambda。现在,每当这个Lambda在调度中被调用时,您都会读取所有可用事件的SQS,然后一个接一个地追加它们,然后将整个字符串写入S3对象

    这是在24小时窗口内累积的所有事件都存储在同一个S3对象中

    这种方法的局限性

  • 超时限制:如果事件太多,则可能会耗尽AWS Lambda的最大超时限制15分钟
  • 内存限制:如果事件太多,则可能会耗尽AWS Lambda的最大内存限制1.5 GB

  • 为了克服这个限制,你可以考虑在24小时(12小时或6小时或3小时或任何情况下,如果你的情况可行的话)调度lambda,

    你不能更新S3对象;你只能替换它们。因此,要附加到现有对象,您必须读取其内容,附加新内容,然后覆盖整个对象。实际上,这不是一个好的解决方案,如果您有多个并发Lambda调用,它就会崩溃。如果你真的想把SQL消息放在同一个地方,那么你可以考虑把它们附加到一个DyDoDB表中。你只能替换它们。因此,要附加到现有对象,您必须读取其内容,附加新内容,然后覆盖整个对象。实际上,这不是一个好的解决方案,如果您有多个并发Lambda调用,它就会崩溃。如果你真的想把SQL消息放在同一个地方,那么你可以考虑把它们附加到一个DyDoDB表中。根据这个代码,从队列发送到S3是最好的选择。根据这个代码,从队列发送到S3是最好的选择?