ph4r05/laravel-queue-database-ph4

使用乐观锁的 Laravel 数据库队列驱动程序

v0.1.6 2020-11-01 15:54 UTC

README

Latest Stable Version Build Status Total Downloads StyleCI License

使用乐观锁实现的 Laravel 数据库队列。增加并发性,消除死锁。

安装

  1. 使用 composer 安装此包:
composer require ph4r05/laravel-queue-database-ph4
  1. 创建工作表
php artisan queue_ph4:table
php artisan migrate
  1. 队列配置
<?php
// config/queue.php

return [
    'database_ph4' => [
        'driver' => 'database_ph4',
        'table' => 'jobs_ph4',
        'queue' => 'default',
        'retry_after' => 4,
        'num_workers' => 1,
        'window_strategy' => 1,
    ],
];
  • num_workers 应该与队列中处理工作的工作进程数量相对应。
  • 窗口策略.
    • 0 表示工作进程选择一个可用的作业进行处理。吞吐量较小,作业顺序与悲观锁类似。
    • 1 表示工作进程将选择 num_workers 个下一个可用的作业,并随机选择一个。吞吐量较高,作业顺序略有调整(更多详情请参阅 博客

要使用乐观锁,现在可以更改您的 .env

QUEUE_DRIVER=database_ph4

使用方法

完成配置后,您可以使用 Laravel 队列 API。如果您使用了其他队列驱动程序,则无需更改任何其他内容。如果您不知道如何使用队列 API,请参阅官方 Laravel 文档:https://laravel.net.cn/docs/queues

测试

使用以下命令运行测试:

vendor/bin/phpunit

关于乐观锁的博客文章

https://ph4r05.deadcode.me/blog/2017/12/23/laravel-queues-optimization.html

优点

  • 无需显式事务。单条查询自动提交事务即可。
  • 无数据库级别锁定,因此无死锁。也适用于没有死锁检测的数据库(较老的 MySQL)。
  • 作业执行正好一次(与悲观默认数据库锁定相对比)
  • 高吞吐量。
  • 在 MySQL、PostgreSQL、Sqlite 上进行了测试。

缺点

  • 在多个工作进程的情况下,作业顺序可能会略有偏移(10,000 个作业中重新排序 0-70)

贡献

您可以通过发现错误和提交问题来为此包做出贡献。请务必在您创建的 pull request 或问题中添加包的版本。

捐赠

感谢您的所有支持!

Monero

87iMuZKqgBZbxjvjJaieTqLBsW3VKtkiuRXL2arcr8eiL4eK8kFi4QbaXCXGgmNWYp5Linpd9pj5McFZ8SQevkenGuZWMCT

Bitcoin

17hzavLCXqavzmWEEjtX54VeCJVmbrHZQC