مقیاس‌پذیری وارد کردن فایل‌های CSV با استفاده از Laravel Job Batching

مشتریان B2B SaaS اغلب فایل‌های حجیمی را آپلود می‌کنند. یک فایل CSV با ۱۰۰,۰۰۰ ردیف را تصور کنید.

اکثر توسعه‌دهندگان مرتکب یک اشتباه می‌شوند. آن‌ها از یک حلقه برای ارسال ۱۰۰,۰۰۰ جاب (job) مجزا در پس‌زمینه استفاده می‌کنند. این کار مشکلاتی ایجاد می‌کند.

اگر جاب شماره ۴۵,۰۰۰ با خطا مواجه شود، راهی برای اطلاع‌رسانی به کاربر ندارید. نمی‌توانید پیشرفت کار را ردیابی کنید. نمی‌توانید پس از اتمام کامل فایل، یک ایمیل واحد ارسال کنید. این جاب‌ها از هم جدا هستند.

برای حل این مشکل، به Laravel Job Batching نیاز دارید.

راه حل: Bus::batch()

Job batching هزاران جاب را در قالب یک واحد گروه‌بندی می‌کند. Laravel به این واحد یک ID منحصربه‌فرد اختصاص می‌دهد. فرانت‌اند شما از این ID برای نمایش نوار پیشرفت (progress bar) استفاده می‌کند. همچنین این قابلیت قلاب‌هایی (hooks) برای مدیریت موفقیت یا شکست فراهم می‌کند.

نحوه پیاده‌سازی:

  • از یک generator ایمن از نظر حافظه برای خواندن CSV خود استفاده کنید.
  • داده‌های خود را به قطعات قابل مدیریت تقسیم (chunk) کنید.
  • از Bus::batch() برای گروه‌بندی جاب‌ها استفاده کنید.
  • از allowFailures() استفاده کنید تا یک ردیف خراب باعث توقف کل فرآیند نشود.

قلاب‌های چرخه حیات (lifecycle hooks) به این صورت عمل می‌کنند:

  • then(): تنها در صورتی اجرا می‌شود که تمام جاب‌ها با موفقیت انجام شوند.
  • catch(): زمانی که اولین خطا رخ می‌دهد، اجرا می‌شود.
  • finally(): زمانی که تمام جاب‌ها تمام می‌شوند، حتی اگر برخی با خطا مواجه شده باشند، اجرا می‌شود.

مزیت برای کاربران

فرانت‌اند React شما می‌تواند batch ID را پایش (poll) کند. این کار یک نوار پیشرفت ۰ تا ۱۰۰ درصد را نشان می‌دهد. این امر یک وظیفه پس‌زمینه مرموز را به یک تجربه شفاف تبدیل می‌کند.

ارزش مهندسی

شما کنترل بیشتری بر وظایف توزیع‌شده به دست می‌آورید. از شکست‌های بی‌صدا (silent failures) جلوگیری می‌کنید. داده‌های لحظه‌ای (real-time) را در اختیار کاربران خود قرار می‌دهید. اطمینان حاصل می‌کنید که منطق پس‌پردازش (post-processing) در زمان صحیح اجرا می‌شود.

منبع: https://dev.to/iprajapatiparesh/scaling-csv-imports-master-laravel-job-batching-iaa