基於 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);
驅動
- redis 延遲隊列
use Huizhang\UniversalQueue\Driver\RedisDelayQueue;
- redis 隊列
use Huizhang\UniversalQueue\Driver\RedisQueue;
- MemcacheQ
use Huizhang\UniversalQueue\Driver\MemcacheQ;