bref/symfony-messenger-sqs

此包已被废弃且不再维护。作者建议使用 bref/symfony-messenger 包。

使用 Bref 在 AWS Lambda 上运行与 SQS 集成的 Symfony Messenger

0.2.0 2019-12-05 11:06 UTC

This package is auto-updated.

Last update: 2020-04-06 14:26:02 UTC


README

此包已被弃用,建议使用更通用的 bref/symfony-messenger

使用 Bref 在 AWS Lambda 上通过 SQS 使用 Symfony Messenger 的桥梁。

安装

本指南假设

首先,安装此包

composer require bref/symfony-messenger-sqs

然后,在 config/bundles.php 中注册该包

return [
    ...
    Bref\Messenger\BrefMessengerBundle::class => ['all' => true],
];

然后,配置 Symfony Messenger 以通过 SQS 发送消息

# config/packages/messenger.yaml

framework:
    messenger:
        transports:
            async: '%env(MESSENGER_TRANSPORT_DSN)%'
        routing:
             'App\Message\MyMessage': async

在此,将 MyMessage 类将发送到 async 传输。现在我们可以配置 async 传输以使用我们的 SQS 队列。

为此,让我们将 MESSENGER_TRANSPORT_DSN 环境变量配置为包含队列的 URL

MESSENGER_TRANSPORT_DSN=https://sqs.us-east-1.amazonaws.com/123456789101/my-queue

发送消息

现在 Messenger 已配置为使用 SQS,我们可以使用 MessageBusInterface 发送消息。例如,在一个控制器中

class DefaultController extends AbstractController
{
    public function index()
    {
        $this->dispatchMessage(new App\Message\MyMessage());
    }
}

阅读 Symfony 文档以了解更多信息

处理消息

消息被发送到 SQS,我们现在需要异步处理这些消息。

我们可以在 serverless.yml 中创建一个 Lambda 来执行此操作

functions:
    worker:
        handler: consumer.php
        timeout: 120 # in seconds
        reservedConcurrency: 5 # max. 5 messages processed in parallel
        layers:
            - ${bref:layer.php-73}
        events:
            -   sqs:
                    arn: arn:aws:sqs:us-east-1:123456789101:my-queue
                    # Only 1 item at a time to simplify error handling
                    batchSize: 1

Lambda 处理器将为 consumer.php,我们必须创建的文件

<?php declare(strict_types=1);

use Bref\Messenger\Sqs\SqsConsumer;

require __DIR__ . '/config/bootstrap.php';

lambda(function ($event) {
    $kernel = new \App\Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
    $kernel->boot();

    $sqsConsumer = $kernel->getContainer()->get(SqsConsumer::class);
    $sqsConsumer->consumeLambdaEvent($event);
});

最后,我们必须在 config/services.yaml 中配置 SqsConsumer 服务(此配置依赖于默认启用的自动注入)

services:
    ...

    Bref\Messenger\Sqs\SqsConsumer:
        arguments:
            # Inject the transport name used in config/packages/messenger.yaml 
            $transportName: 'async'
        public: true