ReadyScheduler
Easyswoole 基礎(chǔ)組件1.8.7版本起,提供了一個(gè)基于Swoole Table實(shí)現(xiàn)的就緒計(jì)劃程序,用于解決主服務(wù)啟動(dòng)時(shí),部分子服務(wù)未就緒問題。
基礎(chǔ)測(cè)試使用
namespace EasySwoole\Component\Tests;
use EasySwoole\Component\ReadyScheduler;
use PHPUnit\Framework\TestCase;
use Swoole\Coroutine;
class ReadySchedulerTest extends TestCase
{
function testNormal()
{
ReadyScheduler::getInstance()->addItem('worker');
ReadyScheduler::getInstance()->addItem('rpc');
ReadyScheduler::getInstance()->addItem('fastCache');
go(function (){
Coroutine::sleep(1);
ReadyScheduler::getInstance()->ready('worker');
ReadyScheduler::getInstance()->ready('rpc');
});
$this->assertEquals(false,ReadyScheduler::getInstance()->waitReady(['rpc','worker'],0.1));
$this->assertEquals(true,ReadyScheduler::getInstance()->waitReady('rpc'));
$this->assertEquals(true,ReadyScheduler::getInstance()->waitReady(['rpc','worker']));
$this->assertEquals(false,ReadyScheduler::getInstance()->waitReady(['rpc','worker','fastCache'],1.1));
}
}
EasySwoole服務(wù)中使用
以Http服務(wù)作為基礎(chǔ)例子
namespace EasySwoole\EasySwoole;
use EasySwoole\Component\ReadyScheduler;
use EasySwoole\EasySwoole\Swoole\EventRegister;
use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\Http\Request;
use EasySwoole\Http\Response;
use Swoole\Coroutine;
class EasySwooleEvent implements Event
{
public static function initialize()
{
// TODO: Implement initialize() method.
date_default_timezone_set('Asia/Shanghai');
}
public static function mainServerCreate(EventRegister $register)
{
/*
* 主進(jìn)程初始化table
*/
ReadyScheduler::getInstance();
/*
* 假設(shè),服務(wù)啟動(dòng)的時(shí)候,依賴 serviceOne,serviceTwo 兩個(gè)服務(wù),例如鏈接第三方api等。
* 在服務(wù)未就緒的時(shí)候,我們不希望本機(jī)器開始對(duì)外服務(wù)
*/
$register->add($register::onWorkerStart,function ($serv, $workerId){
if($workerId == 0){
/*
* 若不是強(qiáng)制準(zhǔn)備,請(qǐng)注意addItem,unready,ready實(shí)現(xiàn)方法
*/
Coroutine::sleep(3);
ReadyScheduler::getInstance()->ready('serviceOne',true);
var_dump('r1');
}else if($workerId == 1){
Coroutine::sleep(4);
ReadyScheduler::getInstance()->ready('serviceTwo',true);
var_dump('r2');
}
});
}
public static function onRequest(Request $request, Response $response): bool
{
/*
* 鏈接進(jìn)來的時(shí)候,判斷依賴的服務(wù)是否就緒,等待時(shí)間為1s (tcp,ws服務(wù)也同理)
* 在服務(wù)未就緒的時(shí)候,我們先拒絕服務(wù)
*/
if(!ReadyScheduler::getInstance()->waitReady(['serviceOne','serviceTwo'],1.0)){
$response->write('not ready,try again');
return false;
}
return true;
}
public static function afterRequest(Request $request, Response $response): void
{
}
}