Amazon web services AmazonSQS到AmazonS3中的文件
根据,如果我想创建一个lambda函数来将数据从SQS发送到S3,那么每个SQS消息将存储在一个单独的S3对象中(我假设这是由于每当SQS接收到消息时,lambda函数都会被触发) 例如,有没有办法将SQS在过去24小时内收到的所有消息发送到同一个S3对象 编辑 这可能是从队列接收消息并将其发送到S3的代码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
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对象中 这种方法的局限性
为了克服这个限制,你可以考虑在24小时以上(可能是12小时或6小时或3小时或任何情况下,如果你的情况可行)调度lambda(
< p>)。如果你想把所有的消息在最近24小时内发送到Sqs,那么你可以用下面解释的某些限制来完成这个功能。 首先,您有一个每24小时执行一次的计划Lambda。现在,每当这个Lambda在调度中被调用时,您都会读取所有可用事件的SQS,然后一个接一个地追加它们,然后将整个字符串写入S3对象 这是在24小时窗口内累积的所有事件都存储在同一个S3对象中 这种方法的局限性为了克服这个限制,你可以考虑在24小时(12小时或6小时或3小时或任何情况下,如果你的情况可行的话)调度lambda,你不能更新S3对象;你只能替换它们。因此,要附加到现有对象,您必须读取其内容,附加新内容,然后覆盖整个对象。实际上,这不是一个好的解决方案,如果您有多个并发Lambda调用,它就会崩溃。如果你真的想把SQL消息放在同一个地方,那么你可以考虑把它们附加到一个DyDoDB表中。你只能替换它们。因此,要附加到现有对象,您必须读取其内容,附加新内容,然后覆盖整个对象。实际上,这不是一个好的解决方案,如果您有多个并发Lambda调用,它就会崩溃。如果你真的想把SQL消息放在同一个地方,那么你可以考虑把它们附加到一个DyDoDB表中。根据这个代码,从队列发送到S3是最好的选择。根据这个代码,从队列发送到S3是最好的选择?