bref / symfony-messenger-sqs
0.2.0
2019-12-05 11:06 UTC
Requires
- php: ^7.3
- ext-json: *
- aws/aws-sdk-php: ^3.127
- symfony/config: ^4.3|^5.0
- symfony/dependency-injection: ^4.3|^5.0
- symfony/http-kernel: ^4.3|^5.0
- symfony/messenger: ^4.3|^5.0
- symfony/yaml: ^4.3|^5.0
Requires (Dev)
- mnapoli/hard-mode: ^0.2.0
- phpstan/phpstan: ^0.12.0
- phpunit/phpunit: ^8.0
- symfony/framework-bundle: ^4.3|^5.0
This package is auto-updated.
Last update: 2020-04-06 14:26:02 UTC
README
此包已被弃用,建议使用更通用的 bref/symfony-messenger。
使用 Bref 在 AWS Lambda 上通过 SQS 使用 Symfony Messenger 的桥梁。
安装
本指南假设
- Symfony 已安装
- Symfony Messenger 已安装
- Bref 已安装并 配置为部署 Symfony
- 已创建 SQS 队列
首先,安装此包
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()); } }
处理消息
消息被发送到 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