基於 EasySwoole 實現通用隊列

基於 EasySwoole 實現通用隊列

  • 支持消費數據先落盤防止異常丟失數據
  • 支持隊列數據消費日誌保留
  • 支持基於Redis延遲隊列
  • 支持基於Redis的隊列
  • 支持MemcacheQ

後續會支持更多消息中間件的消費驅動

安裝

composer require huizhang/universal-queue

定義消費者

<?php
namespace App\DelayQueue;

use Huizhang\UniversalQueue\Core\ConsumerAbstract;

class DelayQueue1 extends ConsumerAbstract
{
   
   

    public $queue;

    public function deal(array $data)
    {
   
   

    }

}

服務註冊

<?php
namespace EasySwoole\EasySwoole;

use EasySwoole\EasySwoole\Swoole\EventRegister;
use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\Redis\Config\RedisConfig;
use Huizhang\UniversalQueue\Driver\RedisDelayQueue;
use Huizhang\UniversalQueue\Driver\RedisQueue;
use Huizhang\UniversalQueue\Driver\MemcacheQ;
use Huizhang\UniversalQueue\UniversalQueue;
use App\DelayQueue\DelayQueue1;

class EasySwooleEvent implements Event
{
   
   

    public static function initialize()
    {
   
   
        // TODO: Implement initialize() method.
        date_default_timezone_set('Asia/Shanghai');
    }

    public static function mainServerCreate(EventRegister $register)
    {
   
   
        // TODO: Implement mainServerCreate() method.
        $redisConfig = new RedisConfig();
        \EasySwoole\RedisPool\RedisPool::getInstance()->register(
            $redisConfig,
            'redis1'
        );
        $config = \Huizhang\UniversalQueue\Config::getInstance()
            ->setQueues([
                // redis 延遲隊列
                'redis_delay_queue' => [
                    'limit' => 3, // 每個協程取出的最大消息數
                    'driver' => new RedisDelayQueue(), // 隊列驅動
                    'consumer' => new DelayQueue1(), // 消費者
                    'coroutineNum' => 1, // 協程數
                    'retainLogNum' => 3, // 消費日誌最大保存個數(以小時分割)
                    'driverConfig' => [
                        'redisAlias' => 'redis1', // 延遲隊列redis所需配置
                        'delayTime' => 3 // 延遲時間
                    ]
                ],
                // redis 隊列
                'redis_queue' => [
                    'limit' => 3, // 每個協程取出的最大消息數
                    'driver' => new RedisQueue(), // 隊列驅動
                    'consumer' => new DelayQueue1(), // 消費者
                    'coroutineNum' => 1, // 協程數
                    'retainLogNum' => 3, // 消費日誌最大保存個數(以小時分割)
                    'driverConfig' => [
                        'redisAlias' => 'redis1'
                    ]
                ],
                // memcacheq
                'mcq' => [
                    'limit' => 3, // 每個協程取出的最大消息數
                    'driver' => new MemcacheQ(), // 隊列驅動
                    'consumer' => new DelayQueue1(), // 消費者
                    'coroutineNum' => 1, // 協程數
                    'retainLogNum' => 3, // 消費日誌最大保存個數(以小時分割)
                    'driverConfig' => [
                        'servers' => [
                            '0.0.0.0:11211:3',
                            '0.0.0.0:11211:3',
                        ]
                    ]
                ],
            ]);
        UniversalQueue::getInstance($config)->attachServer(ServerManager::getInstance()->getSwooleServer());
    }

}

生產消息

    UniversalQueue::getInstance()->push('redis_delay_queue', 123);

驅動

  1. redis 延遲隊列

use Huizhang\UniversalQueue\Driver\RedisDelayQueue;

  1. redis 隊列

use Huizhang\UniversalQueue\Driver\RedisQueue;

  1. MemcacheQ

use Huizhang\UniversalQueue\Driver\MemcacheQ;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章