สิ่งที่ฉันพยายามสร้างคือระบบที่อ่าน/แยกวิเคราะห์ข้อมูลจากเว็บไซต์ภายนอกมากกว่าหนึ่งโหล
ตัวอย่างเช่น สมมติว่าฉันต้องการสร้างระบบที่แยกวิเคราะห์โพสต์ Twitter บนหน้าโปรไฟล์ของผู้ใช้รายใดรายหนึ่ง ฉันต้องการทำสิ่งนี้ให้กับผู้ใช้มากกว่าสิบคน
นอกจากนี้ ฉันต้องการให้งานแยกต่างหากสำหรับผู้ใช้แต่ละคน ดังนั้นหากมีผู้ใช้ 12 คน ฉันต้องการงาน 12 งานที่กำลังดำเนินอยู่
เมื่องานเสร็จสิ้น (เช่น เมื่อแยกวิเคราะห์โพสต์ของผู้ใช้ทั้งหมดบนเพจแล้ว) ฉันต้องการให้งานเริ่มต้นใหม่อีกครั้ง (เพื่อแยกวิเคราะห์โพสต์ใหม่)
ดังนั้นในท้ายที่สุด หากมีผู้ใช้ 12 คน ฉันควรมี 12 งานที่ดำเนินการอยู่ตลอดเวลา ซึ่งจะแยกวิเคราะห์โพสต์ใหม่ที่สร้างโดยผู้ใช้ 12 คนเหล่านี้
เท่าที่ฉันรู้มีสองวิธีในการทำเช่นนี้ อย่างแรกคือการใช้ งาน cron อย่างที่สองคือการใช้ ระบบการจัดคิว
วิธีที่ดีที่สุดในการแก้ปัญหานี้คืออะไร? งาน Cron หรือคิว? ฉันจะนำไปใช้อย่างถูกต้องได้อย่างไร
สำหรับงาน cron ปัญหาสองประการที่ฉันคิดได้คือ cron ทำงานตามเวลา ไม่ใช่ขึ้นอยู่กับความสมบูรณ์ของงาน ซึ่งหมายความว่าหากงานเสร็จสิ้นก็จะต้องรอจนกว่างาน cron จะถูกเรียกอีกครั้ง (เช่น ทุก ๆ 5 นาที). อีกประเด็นคือคาบเกี่ยวกัน จะเกิดอะไรขึ้นถ้างานไม่เสร็จทันเวลาแต่ cron เรียกงานอีกครั้ง?
นี่คือลักษณะการใช้งานคิวปัจจุบันของฉันในเวอร์ชันที่เรียบง่าย อย่างไรก็ตาม ฉันสังเกตเห็นว่าการใช้งาน CPU ของฉันกระโดดไปที่ระหว่าง 75-90%:
<?php
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Models\Page;
class PageParser extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
protected $page;
public function __construct(Page $page)
{
$this->page = $page;
}
public function handle()
{
// Parsing done here, removed for simplicity
$this->delete();
dispatch(new PageParser($this->page));
}
}