簡體   English   中英

如何使用 AmazonSQSExtendedClient 從 SQSEvent 接收數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM