Dengan pembangunan berterusan industri Internet dan kemajuan teknologi yang berterusan, sistem penjadualan tugas berjadual menjadi semakin penting dalam pelbagai senario aplikasi peringkat perusahaan berskala besar. Perusahaan memerlukan sistem penjadualan tugas berjadual yang sangat tersedia dan mudah berskala untuk mengendalikan proses perniagaan harian secara kerap, seperti sandaran data, penghantaran e-mel, statistik biasa, dsb., untuk memastikan kestabilan dan kebolehpercayaan sistem. Artikel ini akan memperkenalkan cara membina sistem penjadualan tugas berjadual peringkat perusahaan yang sangat tersedia berdasarkan rangka kerja Swoole.
Swoole ialah enjin komunikasi rangkaian coroutine berdasarkan bahasa PHP, yang boleh menjadikan program PHP mempunyai ciri konkurensi tinggi dan prestasi tinggi yang sama seperti Node.js. Swoole menyediakan komunikasi rangkaian yang kaya dan fungsi IO tak segerak, yang boleh memberikan sokongan yang kuat untuk aplikasi peringkat perusahaan. Di bawah ini kami akan memperkenalkan secara terperinci cara menggunakan Swoole untuk membina sistem penjadualan tugas berjadual peringkat perusahaan yang sangat tersedia.
1. Idea Reka Bentuk
Apabila mereka bentuk sistem penjadualan tugasan berjadual, kita perlu mempertimbangkan aspek berikut:
1. Pengurusan tugasan: Bertanggungjawab mengurus dan menjadualkan semua tugas Tugas termasuk penciptaan tugas, pengubahsuaian tugas, pemadaman tugas, pengurusan status menjalankan tugas, dsb.
2. Pelaksanaan tugas: Bertanggungjawab untuk pelaksanaan tugas tertentu, termasuk memanggil kod logik perniagaan tertentu, merekodkan log pelaksanaan tugas, mengendalikan pengecualian tugas, dsb.
3. Penjadualan Tugas: Bertanggungjawab untuk memperuntukkan tugas kepada pelaksana yang sepadan mengikut selang masa dan peraturan yang telah ditetapkan.
4. Pemantauan tugas: Bertanggungjawab untuk memantau status berjalan semua tugas, menemui dan mengendalikan masalah yang tidak normal tepat pada masanya, dan memastikan kestabilan dan kebolehpercayaan sistem.
Berdasarkan idea di atas, kita boleh membahagikan keseluruhan sistem kepada lapisan berikut:
Lapisan penjadualan tugas: Bertanggungjawab untuk penjadualan dan pengagihan tugas, dan memberikan tugas kepada pelaksana yang sepadan.
Lapisan baris gilir mesej: digunakan untuk menyimpan maklumat tugas dan hasil pelaksanaan untuk meningkatkan keupayaan dan kestabilan pemprosesan sistem.
Lapisan pelaksanaan: Pelaksana tugas khusus, bertanggungjawab untuk melaksanakan tugas tertentu dan menulis keputusan ke baris gilir mesej.
Lapisan pemantauan: Pantau status berjalan keseluruhan sistem dan mengesan serta mengendalikan keabnormalan tepat pada masanya.
2. Seni Bina Teknikal
1. Penjadualan Tugasan
Penjadualan tugas ialah bahagian teras keseluruhan sistem, dan tugasan perlu dijadualkan dan diperuntukkan mengikut peraturan yang telah ditetapkan dan selang masa. Kita boleh menggunakan pemasa dan coroutine Swoole untuk melaksanakan fungsi penjadualan tugas. Mula-mula, kita perlu memulakan proses Swoole untuk melaksanakan logik penjadualan tugas berjadual:
$scheduler = new Scheduler();
$scheduler->add(function () use ($taskManager) {
$taskManager->assignTask();
}, '', SWOOLE_TIMER_INTERVAL * 1000);
Antaranya, $taskManager ialah objek pengurusan tugasan dalam fungsi assignTask()nya, kita boleh mulakan daripada Pilih tugasan yang sesuai daripada senarai tugasan dan berikannya kepada pelaksana yang sepadan:
fungsi awam assignTask()
{
$now = time(); foreach ($this->tasks as $task) { if ($task->nextExecTime == 0) { $task->nextExecTime = strtotime($task->cron); } if ($task->nextExecTime <= $now) { $task->nextExecTime = strtotime($task->cron, $now); $this->executeTask($task); } }
}
dalam fungsi executeTask( ), kita boleh meletakkan tugasan maklumat ke dalam baris gilir mesej dan tunggu pelaksana memproses:
fungsi awam executeTask($task)
{
// 将任务信息放入消息队列中 $this->queue->push($task);
}
2 >
Pelaksanaan tugas ialah satu lagi bahagian teras keseluruhan sistem Ia perlu memanggil kod logik perniagaan yang sepadan berdasarkan maklumat tugas dan menulis hasil pelaksanaan ke dalam baris gilir mesej. Memandangkan pengecualian mungkin berlaku semasa pelaksanaan tugas, pengendalian pengecualian perlu dilakukan semasa proses pelaksanaan dan log pelaksanaan mesti direkodkan. Kita boleh menggunakan coroutine Swoole dan fungsi IO tak segerak untuk mencapai fungsi pelaksanaan tugas berprestasi tinggi. Pertama, kita perlu memulakan beberapa sub-proses Swoole sebagai pelaksana tugas: untuk ($i = 0; $i < SWOOLE_PROCESS_NUM; $i++) {$worker = new Worker(); $worker->onWorkerStart = function ($worker) use ($queue) { while (true) { // 从消息队列中获取任务信息 $task = $queue->pop(); if (!$task) continue; // 执行任务 $result = $this->execute($task); // 将执行结果写入消息队列中 $this->queue->push($result); } }; $worker->listen();
{
// 调用业务逻辑代码 try { $result = $this->doTask($task); return $result; } catch (Exception $e) { // 异常处理 $errMsg = sprintf("Task failed: %s, error message: %s", $task->name, $e->getMessage()); $this->log($errMsg); return false; }
$server = new Server('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);
$server->on('receive', function ($server, $fd, $from_id, $data) use ($queue) {
// 将消息放入消息队列中 $queue->push($data);
$server- > start();
$this->queue->push($task);
$monitor->start();
{
// 注册信号处理函数 pcntl_signal(SIGUSR1, array($this, 'handleSignal')); while (true) { $cpuUsage = $this->getCpuUsage(); $memUsage = $this->getMemUsage(); $this->log(sprintf('CPU usage: %.2f%%, Memory usage: %.2fMB', $cpuUsage, $memUsage)); sleep(MONITOR_INTERVAL); }
其中,getCpuUsage()函数用于获取当前进程的CPU使用率,getMemUsage()函数用于获取当前进程的内存使用情况,handleSignal()函数用于处理信号并进行相应的处理。
三、系统部署
在系统部署方面,我们可以使用Docker容器化的方式,来实现系统的快速部署和迁移。首先,我们需要构建一组Docker镜像:
docker build -t task-scheduler:latest .
docker build -t task-executor:latest .
docker build -t task-queue:latest .
docker build -t task-monitor:latest .
其中,task-scheduler镜像用于运行任务调度进程,task-executor镜像用于运行任务执行进程,task-queue镜像用于运行消息队列进程,task-monitor镜像用于运行监控进程。
接着,我们可以使用docker-compose来启动和管理整个系统:
version: '3'
services:
scheduler:
image: task-scheduler:latest restart: always
executor:
image: task-executor:latest restart: always scale: 5
queue:
image: task-queue:latest restart: always
monitor:
image: task-monitor:latest restart: always
其中,scheduler服务用于启动任务调度进程,executor服务用于启动任务执行进程,queue服务用于启动消息队列进程,monitor服务用于启动监控进程。可以根据实际情况,调整服务的数量和启动参数。
四、总结
本文介绍了如何基于Swoole框架构建一套高可用的企业级定时任务调度系统,其中涵盖了任务调度、任务执行、消息队列和监控等方面。Swoole的高性能和异步IO特性,为企业级应用提供了强大的支持,能够满足各种大规模应用的需求。通过本文的介绍,相信读者可以更好地了解Swoole框架的应用和实践。
Atas ialah kandungan terperinci Bina sistem penjadualan tugas berjadual peringkat perusahaan yang sangat tersedia berdasarkan Swoole. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!