Rumah > rangka kerja php > Swoole > Bina sistem penjadualan tugas berjadual peringkat perusahaan yang sangat tersedia berdasarkan Swoole

Bina sistem penjadualan tugas berjadual peringkat perusahaan yang sangat tersedia berdasarkan Swoole

王林
Lepaskan: 2023-06-13 19:13:05
asal
1221 orang telah melayarinya

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();
Salin selepas log masuk

}, '', 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);
    }
}
Salin selepas log masuk

}

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);
Salin selepas log masuk

}

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();
Salin selepas log masuk

}

Dalam fungsi execute(), kita boleh memanggil kod logik perniagaan yang sepadan berdasarkan maklumat tugas, dan melakukan pengendalian pengecualian dan pengelogan:

public function execute($task)

{

// 调用业务逻辑代码
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;
}
Salin selepas log masuk

}

3. Baris Gilir Mesej

Baris gilir mesej ialah hab komunikasi keseluruhan sistem, digunakan untuk menyimpan maklumat tugas dan hasil pelaksanaan serta meningkatkan keupayaan dan kestabilan pemprosesan sistem. Kita boleh menggunakan fungsi IO coroutine dan tak segerak yang disediakan oleh Swoole untuk melaksanakan fungsi baris gilir mesej berprestasi tinggi. Mula-mula, kita perlu memulakan proses Swoole sebagai baris gilir mesej:

$queue = new Channel();

$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);
Salin selepas log masuk

});

$server- > start();

Semasa proses pelaksanaan tugas tertentu, kita boleh menulis maklumat tugas dan hasil pelaksanaan ke dalam baris gilir mesej dan menunggu komponen lain untuk memproses:

// Letakkan maklumat tugas Masukkan baris gilir mesej

$this->queue->push($task);

4. Sistem pemantauan

Sistem pemantauan adalah sebahagian daripada keseluruhan Sistem Penggunaan Ia digunakan untuk memantau status berjalan keseluruhan sistem, mengesan dan menangani masalah yang tidak normal tepat pada masanya, dan memastikan kestabilan dan kebolehpercayaan sistem. Kita boleh menggunakan pengurusan proses dan fungsi pemprosesan isyarat Swoole untuk melaksanakan fungsi sistem pemantauan. Kita boleh memulakan proses Swoole sebagai proses pemantauan:

$monitor = new Monitor();

$monitor->start();

dalam fungsi start() kelas Monitor , kita boleh menggunakan pengurusan proses dan fungsi pemprosesan isyarat Swoole untuk melaksanakan fungsi sistem pemantauan:

public function 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);
}
Salin selepas log masuk

}

其中,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
Salin selepas log masuk

executor:

image: task-executor:latest
restart: always
scale: 5
Salin selepas log masuk

queue:

image: task-queue:latest
restart: always
Salin selepas log masuk

monitor:

image: task-monitor:latest
restart: always
Salin selepas log masuk

其中,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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan