ludovicose / transaction-outbox
Laravel Pub-Sub 包使用事务性出站模式
Requires
- php: >=8.1
- php-amqplib/php-amqplib: ^3.1
- symfony/property-access: ^6.0
- symfony/serializer: ^6.0
Requires (Dev)
- squizlabs/php_codesniffer: 3.*
- vimeo/psalm: ^4.18.1
README
当一个事件被发送到代理时,该事件被存储在数据库中,然后事件被发送到代理。如果事件成功发送到代理,我们将标记该事件已成功发送。
当订阅事件时,我们监听来自代理的事件。当接收到事件时,我们将它存储在数据库中。在数据库中保存后,我们发送一个内部事件进行处理。
库的目标是决定服务之间数据的致性、消息发送的顺序以及幂等性。
目前,代理是 Redis。未来我们将添加其他代理的消息。
安装
您可以通过 composer 安装此包
composer require ludovicose/transaction-outbox
该包将自动注册自己。
您可以使用以下命令发布迁移
php artisan vendor:publish --provider="Ludovicose\TransactionOutbox\PackageServiceProvider" --tag="migrations"
迁移发布后,您可以运行迁移来创建表
php artisan migrate
您可以使用以下命令发布配置文件
php artisan vendor:publish --provider="Ludovicose\TransactionOutbox\PackageServiceProvider" --tag="config"
使用
发布事件
创建事件文件并实现 ShouldBePublish 接口。如果实现了 ShouldBePublish 接口,则事件将自动发送到代理设置通道名称。通道名称是发送到代理的事件名称
namespace App\Events; use Ludovicose\TransactionOutbox\Contracts\ShouldBePublish; class PostCreatedEvent implements ShouldBePublish { ... public function getChannel(): string { return 'channelName'; } ... }
要向代理发送事件,您需要运行以下命令
event(new PostCreatedEvent($someData));
订阅
将通道名称添加到配置文件中,以了解要监听哪些事件。这些通道名称可以用作内部事件。
return [ ... 'subscribe_channels' => [ 'channelName' ], ... ];
在控制台运行命令以监听代理中的事件。
$ php artisan events:listen
将通道名称添加到 EventServiceProvider 文件中,以监听来自代理的事件。
namespace App\Providers; ... class EventServiceProvider extends ServiceProvider { protected $listen = [ ... 'channelName' => [ SomeListener::class ] ... ]; }
在 handle 方法中,您将获得来自代理的数据
namespace App\Listeners; class SomeListener { public function handle($event) { // $event data in event } }
重新提交事件
如果事件没有进入消息代理,则可以使用以下命令重新发送,指定起始日期和结束日期
$ php artisan events:repeat 2022-12-12
HTTP 请求
我们还可以记录 HTTP 请求。在发送请求时,我们将其保存,在接收到响应时,我们记录请求已成功完成。
要注册 HTTP 请求,必须在配置文件中启用选项
return [ ... 'enable_request_log' => true ... ];
重新提交请求
如果 HTTP 请求失败,则可以使用以下命令重新发送,指定起始日期和结束日期
$ php artisan request:repeat 2022-12-12
重新发送队列中的错误数据
如果我们处理队列中的数据时出现错误,则这些数据将进入队列(serviceName.errors)。
要重新发送队列(serviceName.errors)中的数据,我们需要运行以下命令
$ php artisan events:resend-errors
在配置文件中,您可以指定错误存储的队列名称
return [ ... 'error_queue' => 'errors' ... ];
清除数据库中的事件
如果您不清除数据库中的事件,则数据库中的条目可能会增加。要清理旧条目,您可以运行以下命令
$ php artisan events:clear
在配置文件中,您可以指定记录删除后的天数
return [ ... 'delete_last_event_in_day' => 10 ... ];
QUEUE
添加 rabbitmq 到 queue.php 配置
return [ ... 'connections' => [ ... 'rabbitmq' => [ 'driver' => 'rabbitmq', 'connection' => 'default', 'queue' => env('RABBITMQ_QUEUE', 'default'), ], ... ] ... ];
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅许可证文件。