ludovicose/transaction-outbox

Laravel Pub-Sub 包使用事务性出站模式

3.5.0 2024-04-08 12:05 UTC

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)。有关更多信息,请参阅许可证文件