簡體   English   中英

AWS SQS:我怎么知道我正在處理最后一條消息?

[英]AWS SQS : How do I know that I am processing the last message?

在此處輸入圖像描述

  massPayoutExecute:
    handler: lambda/execute.php
    timeout: 120 # 2 minutes
    layers:
      - arn:aws:lambda:#{AWS::Region}:<ACCOUNT::ID>:layer:php-81:1
    reservedConcurrency: 10
    role: MyRole
    events:
      - sqs:
          arn: !GetAtt MyQueue.Arn
          batchSize: 1
          maximumBatchingWindow: 60

...

    MyQueue:
      Type: AWS::SQS::Queue
      Properties:
        QueueName: ${opt:stage}-${opt:client}-MyQueue
        VisibilityTimeout: 900
        DelaySeconds: 300

例如,對於 500 條消息,我有這些對象:

1 Object Parent:
{
    "id": 123,
    "iteration": 0,
    "numberOfChild": 500
}

500 Object Child:
{
    "parentId": 123,
    "treated": false
}
  • Lambda 01 完美存儲 object Parent和 500 個對象Child ,並將Parent::numberOfChild設置為 500。
  • Lambda 01 可以發送無限數量的消息(例如可以發送10k)。
  • SQS隊列收到所有消息,發送到Lambda 02(這里沒有報錯)。
  • 對於每條消息,Lambda 02 在 DynamoDB 中更新Child::treatedParent::iteration的條目。
  • Parent object 是新的時, Parent::iteration等於 0 並且 Lambda 02 必須為它收到的每條消息遞增此數字。

我的問題:

Lambda 02 設法完美更新所有Child對象,但未能正確更新Parent::iteration的增量。

在我的代碼中,我將Parent::iteration的值與Parent::numberOfChild的值進行比較以繼續新的進程。

如果 Lambda 02 有一個reservedConcurrency = 1 ,它完美地工作(我達到了Parent::iteration等於Parent::numberOfChild的地步)但是,如果reservedConcurrency = 10Parent::iteration沒有正確更新並且我從來沒有Parent::iteration等於Parent::numberOfChild

我絕對想將並發保持在 10。

我的問題:

你知道我怎么知道 Lambda 02 處理 SQS 收到的最后一條消息嗎?

我不想使用 FIFO SQS。

感謝@luk2302 和@mark-b,當我使用原子計數器https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html#WorkingWithItems.AtomicCounters更新Parent::iteration時,它正在工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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