簡體   English   中英

如何使用PHP SDK在AWS Elastic Beanstalk Worker環境中刪除SQS消息

[英]How to delete SQS message in AWS Elastic Beanstalk Worker Environments using PHP SDK

我有一個使用SQS的AWS Elastic Beanstalk Worker環境設置。 SQS正在發布到URL,該URL是使用Laravel的代碼庫的終結點。 從此端點開始,它接收消息並處理有效負載。 我的某些過程很耗時,需要20多個分鍾才能完成。 我正在從端點發送回成功響應,但是由於要花費大量時間來完成該過程,因此大多數情況下,消息將進入SQS中的飛行模式。 我正在嘗試使用PHP SDK進行deleteMessage()調用,但是我需要傳遞ReceiptHandle來刪除消息。 根據此處的文檔,SQS不會將ReceiptHandle發布到我的應用程序,因此無法進行刪除調用。 處於inFlight模式的消息的問題在於,下次將再次調用該消息,因此該過程被重復。

完成該過程后,如何刪除一條消息?

我當前的代碼如下:

 $worker->process(
            $request->header('X-Aws-Sqsd-Queue'), $job, [
                'maxTries' => 0,
                'delay' => 0
            ]
        );
        return $this->response([
            'Processed ' . $job->getJobId()
        ]);

其中worker是...的實例

Illuminate\Queue\Worker;

response函數是對數據進行json編碼並以200響應

您必須具有ReceiptHandle才能刪除隊列中的消息。 下面的核心PHP中的功能是讀取和刪除隊列中的消息。

function ReadMessages($client,$queueUrl){
    try {
        $result = $client->receiveMessage(array(
            'AttributeNames' => ['SentTimestamp'],
            'MaxNumberOfMessages' => 1,
            'MessageAttributeNames' => ['All'],
            'QueueUrl' => $queueUrl, // REQUIRED
            'WaitTimeSeconds' => 0,
        ));
        if (count($result->get('Messages')) > 0) {
            var_dump($result->get('Messages')[0]);

            //to delete a message pass the receipt Handle
            $result = $client->deleteMessage([
                'QueueUrl' => $queueUrl, // REQUIRED
                'ReceiptHandle' => $result->get('Messages')[0]['ReceiptHandle'] // REQUIRED
            ]);
            } else {
                echo "No messages in queue. \n";
            }
        }   
    catch (AwsException $e) {
        // output error message if fails
        return 'error';
        error_log($e->getMessage());
    }
}

采取一些變通辦法,以便獲得一個ReceiptHandle來刪除隊列中的消息。

暫無
暫無

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

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