tritran/sqs-queue-bundle

为 Symfony 的简单 SQS 队列

安装次数: 212,536

依赖者: 0

建议者: 0

安全性: 0

星标: 27

关注者: 6

分支: 19

开放问题: 8

类型:symfony-bundle

2.1.4 2020-02-19 08:55 UTC

README

此包提供了一个简单的方法来处理 AWS SQS。

SensioLabsInsight Latest Stable Version Latest Unstable Version Build Status codecov

安装

按照以下 5 个简单步骤设置此包。

步骤 1: 下载包

打开命令行,进入您的项目目录,并执行以下命令以下载此包的最新稳定版本

$ composer require tritran/sqs-queue-bundle

此命令要求您全局安装了 Composer。

步骤 2: 启用包

app/AppKernel.php 中注册包

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        return [
            // ...
            new \Aws\Symfony\AwsBundle(),
            new \TriTran\SqsQueueBundle\TriTranSqsQueueBundle(),
        ];
    }

    // ...
}

在默认的 Symfony 应用程序中使用 Symfony Flex 时,安装/删除包时,包会自动启用/禁用,因此您可以忽略此步骤。

步骤 3: 更新 AWS SQS 凭据

此包使用 AWS SDK for PHP。有关可用的配置选项的完整文档,请参阅 SDK 指南

以下是以 YAML 格式提供的 AWS 凭据配置示例

# app/config/config.yml

aws:
    version: latest
    region: us-central-1
    credentials:
        key: not-a-real-key
        secret: "@not-a-real-secret"

步骤 4: 配置队列

以下是一些队列的 YAML 格式配置示例

# app/config/config.yml

tritran_sqs_queue:
    sqs_queue:
        queues:
            emailpool:
                queue_url: 'https://sqs.eu-central-1.amazonaws.com/49504XX59872/emailpool'
                worker: "@acl.service.emailpool"
                attributes:
                    receive_message_wait_time_seconds: 20
                    visibility_timeout: 30
            reminder:
                queue_url: 'https://sqs.eu-central-1.amazonaws.com/49504XX59872/reminder'
                worker: 'AclBundle\Service\Worker\ReminderWorker'

有关可用的队列选项的完整文档,请参阅 队列属性

现在,您可以通过 tritran.sqs_queue.emailpooltritran.sqs_queue.reminder 访问队列 emailpoolreminder 服务,它是 BaseQueue 的接口。

以下是将消息发送到指定队列的示例实现

namespace AclBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use TriTran\SqsQueueBundle\Service\Message;

/**
 * Class DefaultController
 *
 * @package AclBundle\Controller
 */
class DefaultController extends Controller
{
    public function indexAction()
    {
        // ...
        
        $data = [
            'from' => 'sender@domain.com',
            'to' => 'receiver@domain.com',
            'subject' => 'Greeting Message',
            'body' => 'Congratulation! You have just received a message which was sent from AWS SQS Queue'
        ];
        $this->get('tritran.sqs_queue.emailpool')
            ->sendMessage((new Message())->setBody(serialize($data)));

        // ...
    }
}

对于 FIFO 队列,您必须将非空 MessageGroupId 与消息关联。否则,操作会失败。
您可以显式提供 MessageDeduplicationId。如果您无法提供 MessageDeduplicationId 并且您为队列启用了 ContentBasedDeduplication,Amazon SQS 将使用消息正文(但不包括消息属性)生成 SHA-256 哈希来生成 MessageDeduplicationId
有关 FIFO 队列的更多信息,请参阅 Amazon SQS FIFO (First-In-First-Out) Queues

队列行为

队列管理器行为

您可以通过服务 tritran.sqs_queue.queue_manager 访问 QueueManager

步骤 5: 设置工作进程

以下是一个示例实现,它将监听队列以处理其中的消息。

namespace AclBundle\Service\Worker;

use TriTran\SqsQueueBundle\Service\Message;
use TriTran\SqsQueueBundle\Service\Worker\AbstractWorker;

class ReminderWorker extends AbstractWorker
{
    /**
     * @param Message $message
     *
     * @return boolean
     */
    protected function execute(Message $message)
    {
        echo 'The message is: ' . $message->getBody();

        return true;
    }
}

然后您可以通过以下方式将其作为守护进程在控制台执行

bin/console tritran:sqs_queue:worker reminder

注意:reminder 是您在步骤 4 中的 config.yml 中配置的队列名称。

附录:有用的控制台命令

注意:请使用 -h 获取每个命令的更多信息。