𝗦𝗰𝗮𝗹𝗶𝗻𝗴 𝗖𝗦𝗩 𝗜𝗺𝗽𝗼𝗿𝘁𝘀 𝗪𝗶𝘁𝗵 𝗟𝗮𝗿𝗮𝘃𝗲𝗹 𝗝𝗼𝗯 𝗕𝗮𝘁𝗰𝗵𝗶𝗻𝗴
ลูกค้ากลุ่ม B2B SaaS มักจะอัปโหลดไฟล์ขนาดใหญ่ ลองจินตนาการถึงไฟล์ CSV ที่มีถึง 100,000 แถว
นักพัฒนาส่วนใหญ่มักทำผิดพลาด โดยการใช้ loop เพื่อส่ง background job แยกกันถึง 100,000 งาน ซึ่งสิ่งนี้จะสร้างปัญหาตามมา
หาก job ลำดับที่ 45,000 ล้มเหลว คุณจะไม่มีทางบอกผู้ใช้ได้เลย คุณไม่สามารถติดตามความคืบหน้าได้ และไม่สามารถส่งอีเมลเพียงฉบับเดียวเมื่อไฟล์ทั้งหมดประมวลผลเสร็จสิ้น เนื่องจากแต่ละ job นั้นไม่เชื่อมต่อกัน
คุณจำเป็นต้องใช้ Laravel Job Batching เพื่อแก้ไขปัญหานี้
ทางออก: Bus::batch()
Job batching จะรวมงานหลายพันงานเข้าเป็นหน่วยเดียวกัน โดย Laravel จะมอบ ID ที่ไม่ซ้ำกันให้กับหน่วยนี้ ซึ่ง frontend ของคุณสามารถใช้ ID นี้เพื่อแสดงแถบความคืบหน้า (progress bar) นอกจากนี้ยังมี hooks สำหรับจัดการเมื่อทำงานสำเร็จหรือล้มเหลวอีกด้วย
วิธีการนำไปใช้งาน:
- ใช้ generator ที่ประหยัดหน่วยความจำ (memory-safe) ในการอ่านไฟล์ CSV ของคุณ
- แบ่งข้อมูลเป็นส่วนๆ (chunk) เพื่อให้จัดการได้ง่ายขึ้น
- ใช้
Bus::batch()เพื่อรวมกลุ่มงาน - ใช้
allowFailures()เพื่อไม่ให้แถวที่ผิดพลาดเพียงแถวเดียวทำให้กระบวนการทั้งหมดหยุดชะงัก
Lifecycle hooks ทำงานดังนี้:
then(): จะทำงานก็ต่อเมื่อทุก job ประสบความสำเร็จเท่านั้นcatch(): จะทำงานเมื่อเกิดข้อผิดพลาดครั้งแรกfinally(): จะทำงานเมื่อทุก job เสร็จสิ้น แม้ว่าบางงานจะล้มเหลวก็ตาม
ประโยชน์สำหรับผู้ใช้งาน
Frontend ที่เขียนด้วย React ของคุณสามารถทำ polling เพื่อตรวจสอบ batch ID และแสดงแถบความคืบหน้าตั้งแต่ 0-100% สิ่งนี้จะเปลี่ยนงานเบื้องหลังที่ดูคลุมเครือให้กลายเป็นประสบการณ์ที่โปร่งใสและตรวจสอบได้
คุณค่าในเชิงวิศวกรรม
คุณจะสามารถควบคุมงานที่กระจายตัวอยู่ได้ (distributed tasks) หยุดปัญหาการล้มเหลวแบบเงียบๆ (silent failures) สามารถให้ข้อมูลแบบเรียลไทม์แก่ผู้ใช้ และมั่นใจได้ว่า logic ในการประมวลผลหลังเสร็จสิ้น (post-processing logic) จะทำงานในเวลาที่ถูกต้อง
ที่มา: https://dev.to/iprajapatiparesh/scaling-csv-imports-master-laravel-job-batching-iaa