งานที่เริ่มใหม่เมื่อเสร็จ?

สิ่งที่ฉันพยายามสร้างคือระบบที่อ่าน/แยกวิเคราะห์ข้อมูลจากเว็บไซต์ภายนอกมากกว่าหนึ่งโหล

ตัวอย่างเช่น สมมติว่าฉันต้องการสร้างระบบที่แยกวิเคราะห์โพสต์ 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));
    }
}

person user6605184    schedule 18.07.2016    source แหล่งที่มา
comment
คุณกำลังมองหาโพสต์ Twitter จริง ๆ หรือไม่? หากเป็นเช่นนั้น คุณควรดูจุดสิ้นสุดการสตรีมของพวกเขา การสร้างงานที่ไม่มีวันสิ้นสุดจะค่อนข้างง่ายโดยใช้การวนซ้ำ while ตามสถานะของการเชื่อมต่อ   -  person ExoticChimp    schedule 19.07.2016
comment
ไม่ ฉันไม่ได้มองหาโพสต์บน Twitter ตัวอย่างของฉันคือการทำให้แนวคิดทั่วไปง่ายขึ้น   -  person user6605184    schedule 19.07.2016


คำตอบ (2)


ฉันไม่ได้ลองสิ่งนี้ แต่ฉันคิดว่าคุณสามารถสร้างงานแบบเรียกซ้ำได้

งานแบบเรียกซ้ำนี้จะรันโค้ดทั้งหมดที่จำเป็น จากนั้นเมื่อสิ้นสุดการดำเนินการ มันจะสร้างงานใหม่และพุชงานนั้นเข้าสู่คิว ซึ่งจะเริ่มทำงานทันทีที่คิวพร้อม

หากงานล้มเหลวในเวลาใดก็ตาม คุณจะไม่ได้สร้างงานใหม่ ดังนั้น คุณจะไม่มีงานของผู้ใช้คนเดียวกันทำงานพร้อมกัน งานที่ล้มเหลวก็จะถูกลองใหม่อีกครั้ง และเมื่อสำเร็จก็จะสร้างงานใหม่ขึ้นมา

person swatkins    schedule 18.07.2016

คุณสามารถใช้การรวมกันได้ สร้างคำสั่งเช่น 'RetrieveDataCommand' หรืออะไรก็ได้ คำสั่งนี้ควรส่งงานเข้าสู่คิวสำหรับผู้ใช้แต่ละรายซึ่งจะดึงข้อมูลสำหรับผู้ใช้นั้น (และอาจเป็นงานแยกต่างหากสำหรับการประมวลผลจริงหากจำเป็น) งานควรคำนึงถึงพารามิเตอร์ '$from' ซึ่งเป็นการประทับเวลาหากมีการรันคำสั่ง 'ก่อนหน้า' เมื่อทำงาน จะดึงข้อมูลทั้งหมดสำหรับผู้ใช้ทั้งหมดในช่วงเวลา $from to now()

จากนั้นคุณสามารถให้งาน cron รันคำสั่งทุกๆ 10 วินาทีหรืออะไรก็ได้ $from สามารถคำนวณได้โดยการจัดเก็บ (ในแคช / DB / บางอย่างแบบกึ่งถาวร) การประทับเวลาของเวลาปัจจุบันทันทีที่คำสั่งถูกรันโดย cron ดังนั้นคำสั่งถัดไปจึงสามารถค้นหาสิ่งนี้ได้เมื่อมันรันแล้ว เขียนทับสำหรับการเรียกใช้ครั้งถัดไป หรือเพียงแค่ทำ now() ลบช่วงเวลา cron แม้ว่าจะมีความยืดหยุ่นน้อยกว่าก็ตาม

จากนั้นคุณสามารถลบการลบตัวเองออกและส่งสิ่งต่างๆ ออกจากงานของคุณได้

person ExoticChimp    schedule 18.07.2016