[英]What messageIds should be added to the BatchItemFailures when processing SQSEvent from a FIFO-queue in an AWS-Lambda
[英]How to use AmazonSQSExtendedClient to recieve data from an SQSEvent
我有兩個 AWS lambda 函數通過 SQS 隊列連接在一起。 它們已經正常工作了一段時間,但最近有效負載的大小有所增加,現在已經突破了 256Kb 的限制。
看完問題43738341喜歡用AmazonSQSExtendedClient。 我查看了github的代碼,並使我的第一個 lambda function 正確發送消息(通過 SQS 的小負載 go,較大的負載寫入 S3)。
我遇到的問題是接收消息:我的第二個 lambda 的入口點如下所示:
public class SqsHandler implements RequestHandler<SQSEvent, Void> {
public Void handleRequest(SQSEvent event, Context context) {
SQSEvent.SQSMessage record = event.getRecords().get(0);
System.out.println("0. record " + record.toString());
System.out.println("1. eventSource " + record.getEventSource());
System.out.println("2. eventSourceARN " + record.getEventSourceArn());
System.out.println("3. MessageId" + record.getMessageId());
System.out.println("4. ReceiptHandle " + record.getReceiptHandle());
System.out.println("5. Body " + record.getBody());
}
}
當我的入口點被調用時,我已經收到了我的 SQS 事件。 我不知道(也不應該?)知道它來自隊列。
GitHub 上的代碼示例(幾乎逐行復制到所有其他站點)發送方和接收方都是相同的 lambda。因此它能夠創建 ReceiveMessageRequest object,因為它知道隊列 URL。
在真實系統中,發送者和接收者永遠不會相同。 我什至可以通過多個隊列從多個 Lambda 接收數據
我不明白的是接收Lambda應該怎么寫。 AWS 網站上的示例代碼說:
final ReceiveMessageRequest receiveMessageRequest =
new ReceiveMessageRequest(myQueueUrl);
List<Message> messages = sqsExtended
.receiveMessage(receiveMessageRequest).getMessages();
但這需要我知道隊列的url。 它也不綁定到需要使用的 SQSEvent。
有效負載超過256KB的SQSEvent記錄的消息正文應包含表示S3指針的JSON字符串,該字符串由s3BucketName和s3Key屬性組成,用於存儲實際有效負載。 請參閱Amazon SQSExtendedClient類的MessageS3Pointer類定義和storeMessageInS3方法以供參考。 有了這些信息,您就應該能夠直接從S3獲取消息內容,而不必依賴Lambda事件處理程序中的SQS擴展客戶端庫。
在接收器中,更換
for( var rec in event.Records ){
const msg = JSON.parse( event.Records[rec].body );
和
for( var rec in event.Records ){
const s = await s3.getObject({Bucket:process.env.SQS_BODY_BUCKET,Key:event.Records[rec].body}).promise();
const msg = JSON.parse( s.Body );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.