【问题标题】:How to delete SQS message in AWS Elastic Beanstalk Worker Environments using PHP SDK如何使用 PHP 开发工具包在 AWS Elastic Beanstalk 工作线程环境中删除 SQS 消息
【发布时间】:2020-01-11 21:16:42
【问题描述】:

我有一个使用 SQS 的 AWS Elastic Beanstalk Worker Environment 设置。 SQS 正在发布到一个 URL,这是一个使用 Laravel 的代码库的端点。从这个端点,它接收消息并处理有效负载。我的一些过程很耗时,需要 20 多分钟才能完成。我正在从端点发回一个成功响应,但是由于完成该过程需要很长时间,因此大多数情况下,消息将进入 SQS 中的飞行模式。我正在尝试使用 PHP SDK 进行 deleteMessage() 调用,但我需要通过 ReceiptHandle 来删除消息。根据文档here,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 响应

【问题讨论】:

    标签: php laravel amazon-web-services amazon-s3 amazon-ec2


    【解决方案1】:

    您必须拥有 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 来删除队列中的消息。

    【讨论】:

    • 我试过这个。但不幸的是,我没有收到任何消息。我将它用于 SQS 发布的端点。
    • 能把你做过的过程用代码或者截图清理一下吗
    猜你喜欢
    • 2019-09-26
    • 2018-01-24
    • 2017-02-15
    • 2013-09-29
    • 1970-01-01
    • 2018-11-30
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多