homedoctor-es / laravel-eventbridge-sqs-consumer
一个用于从EventBridge事件消费sqs消息的Laravel插件
Requires
- php: ^7.3|^8.0
- ext-json: *
- aws/aws-sdk-php: ^3.155
- illuminate/support: ^8.52|^9.0|^10.0|^11.0
README
我们只需要监听推送到SQS队列的消息并对此做出反应。这里的唯一区别是我们不使用默认的Laravel SQS驱动程序,因为推送的消息并不遵循从Laravel应用程序推送的作业/事件的标准Laravel JSON有效负载。EventBridge和SNS的消息更简单。
先决条件
- 安装并配置此软件包
- 至少一个SQS队列 - 每个订阅Laravel应用程序一个队列
- 至少一个事件桥接事件总线
- 在您的EventBus和SQS队列之间设置SQS订阅。
- 配置相关的访问策略,特别是如果您想直接从AWS控制台发布消息的话。
安装
您可以通过composer在Laravel 8+应用程序上安装此软件包
composer require homedoctor-es/laravel-eventbridge-sqs-consumer
然后,将 HomedoctorEs\EventBridgeSqs\EventBridgeSqsServiceProvider::class
添加到 config/app.php
文件中以自动加载驱动程序。
配置
确保根据需要定义您的 环境变量
# both drivers require: AWS_DEFAULT_REGION=you-region AWS_ACCESS_KEY_ID=your-aws-key AWS_SECRET_ACCESS_KEY=your-aws-secret
安装完软件包后,与标准Laravel SQS队列类似,您需要在 config/queue.php
配置文件中添加以下连接并配置您的凭证。
'connections' => [ // ... 'eventbridge-sqs' => [ 'driver' => 'eventbridge-sqs', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'endpoint' => env('AWS_URL'), 'prefix' => env('EVENTBRIDGE_SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 'queue' => env('EVENTBRIDGE_SQS_QUEUE', 'app1_queue'), 'suffix' => env('EVENTBRIDGE_SQS_SUFFIX'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], // ... ],
一旦您的队列配置正确,您将需要能够定义您希望为哪种传入事件使用哪些监听器。为了做到这一点,您需要创建Laravel监听器并通过软件包为您创建的服务提供者关联事件。
注册事件和监听器
您需要一个服务提供者来定义每个订阅事件及其监听器的映射。您可以使用独立的一个,或者您可以将 $listen 属性添加到任何您拥有的提供者中。
listen
属性包含一个包含所有事件(键)及其监听器(值)的数组。与标准的Laravel EventServiceProvider
不同,您可以为每个事件定义一个监听器,但是您可以添加尽可能多的事件到这个数组中,以满足您的应用程序需求。
使用广播名称
您可以通过使用其广播名称来订阅事件,例如,如果您广播了一个名为orders.shipped的事件
use App\Listeners\PubSub\SendShipmentNotification; /** * The event handler mappings for subscribing to PubSub events. * * @var array */ protected $listen = [ 'orders.shipped' => [ SendShipmentNotification::class, ], ];
您可以从通用的 OrdersListener
中做任何事情,甚至可以在您的应用程序内部调度更多事件。
定义监听器
在这里,我们简单地重用了标准的Laravel事件监听器。唯一的不同之处在于主要 handle()
方法的函数定义略有不同。我们不是期望传递一个事件类实例,我们只是接收 payload
和(如果找到的话)subject
。
/** * Handle the event. * * @return void */ public function handle(array $payload, string $subject = '') { // ... }
像处理标准Laravel监听器一样处理这些监听器。
注意:您仍然需要确保您期望的提供者中的映射已配置。
鸣谢
- laravel-aws-pubsub 提供了一些灵感
许可
MIT许可证。请参阅许可证文件获取更多信息。