beierz / aws-queue-bundle
Symfony 扩展包,用于连接 AWS sns 和 sqs 以创建离线队列处理
Requires
- php: >=7.0
- aws/aws-sdk-php-symfony: ^2.0.0
- symfony/symfony: ^2.8|^3.0|^3.1|^3.2|^3.3
Requires (Dev)
- doctrine/collections: ^1.4|^1.5
- liip/functional-test-bundle: ^1.0.0
- symfony/phpunit-bridge: ^4.2
README
关于
Symfony2 的 AWS Queue Bundle
此扩展包的目的是在 symfony 服务和 AWS 服务之间提供简单的集成。队列由 生产者 和 消费者 定义
使用此扩展包和 aws 扩展包,您定义的 消费者 和 生产者 服务将自动设置 AWS 服务。这简化了通过 AWS 平台设置队列和通知服务的需求。
安装
Composer(推荐)
composer require beyerz/aws-queue-bundle
应用内核
将 BeyerzAWSQueueBundle 添加到您的应用内核的 registerBundles()
方法中
public function registerBundles() { return array( new Beyerz\AWSQueueBundle\BeyerzAWSQueueBundle(), ); }
使用
配置
config.yml
beyerz_aws_queue: region: #Your AWS region that you want to use account: #Your AWS Account ID channel_prefix: "%kernel.environment%" #used to separate dev/stage/prod (mainly to make development eaiser) run_local: false #This option should allow you to run remotely using aws, or locally using no-queue or gearman
重要配置说明
由于 Aws 定义的工作树的方式,aws-queue-bundle 无法自动附加您的配置。
结果就是您需要自行定义 aws 配置。
文档
创建生产者
创建一个可以在您的系统中使用的生产者非常简单,以下是一些示例代码以供您开始。您也可以查看此扩展包中的演示文件夹 AcmeBundle/Producers/MyAwesomeProducer.php
<?php namespace Acme\AcmeBundle\Producers; use Beyerz\AWSQueueBundle\Interfaces\ProducerInterface; use Beyerz\AWSQueueBundle\Producer\ProducerTrait; class MyAwesomeProducer implements ProducerInterface { use ProducerTrait; public function publish($message) { $this->producer->publish($message); } }
生产者需要一些设置,这由本扩展包处理,您不需要太担心。我们为生产者提供了接口和特性,只要您包括它们,设置应该会很顺利。
接下来,我们需要将生产者定义为服务,以便我们可以对其进行标记并使 AwsQueueBundle 知道它的存在:
AcmeBundle/Resources/config/services.yml
parameters: acme.my_awesome_producer.class: Acme\AcmeBundle\Producers\MyAwesomeProducer services: acme.my_awesome_producer: class: "%acme.my_awesome_producer.class%" tags: - {name: "beyerz_aws_queue.producer", channel: "awesome_producer"}
现在,您可以通过 symfony 容器像平常一样访问您的生产者
<?php $myAwesomeProducer = $this->container->get('acme.my_awesome_producer'); $myMessage = "My Awesome Message"; $myAwesomeProducer->publish($message);
运行此生产者后,您可以去亚马逊账户中的 SNS 服务中看到为您创建了一个新的主题。由于我们尚未创建任何消费者,您在 SQS 中还没有队列。
创建消费者
消费者比生产者复杂一些,但您需要理解的基本概念是您的消费者类会从队列中接收消息以便您进行处理。
AcmeBundle/Consumers/MyAwesomeConsumer.php
<?php namespace Acme\AcmeBundle\Consumers; use Beyerz\AWSQueueBundle\Interfaces\ConsumerInterface; class MyAwesomeConsumer implements ConsumerInterface { public function consume($message) { //do something awesome with your message } }
消费者需要一些设置,这由本扩展包处理,您不需要太担心。我们提供了接口,只要您实现它,设置应该会很顺利。您的消费者类被一个特殊的消费者服务“封装”。这个封装器连接到队列并将消息传递给您的消费函数。这个封装器使用服务容器加载您的消费者,这意味着您可以像平常一样创建服务,甚至可以在构造函数中添加依赖项!
接下来,我们需要将消费者定义为服务,以便我们可以对其进行标记并使 AwsQueueBundle 知道它的存在:我们将使用两个标记。第一个标记告诉扩展包这是一个消费者,并定义了使用通道键的 SQS 队列名称。第二个标记告诉扩展包该消费者想要订阅哪个生产者。如果您想将此队列订阅给多个生产者,只需复制标记并相应地定义生产者名称。
AcmeBundle/Resources/config/services.yml
parameters: acme.my_awesome_consumer.class: Acme\AcmeBundle\Consumers\MyAwesomeConsumer services: acme.my_awesome_consumer: class: "%acme.my_awesome_consumer.class%" tags: - {name: "beyerz_aws_queue.consumer", channel: "awesome_consumer"} - {name: "beyerz_aws_queue.subscriber", producer: "awesome_producer"}
现在,您可以通过命令行运行您的生产者。
php app/console beyerz:consumer awesome_consumer
您的消费者将继续运行,除非您指定了最大消息限制或发生崩溃。最好开始使用任务管理系统,例如supervisor或jenkins。如果您有希望特定时间运行而不是持续运行的进程,您也可以使用crontab。