在 Laravel 中是否可以基于作业批处理进行计划任务?

问题描述 投票:0回答:1

我有一个系统可以读取 FTP 服务器上的大文件,将它们存储在数据库中,然后将它们发送到 API,该 API 会对该数据进行一些处理。我必须对数据进行分块,因为它可能有数十万个寄存器并且处理需要一段时间。该处理是在作业上完成的,因此我对这些作业进行批处理以了解文件何时完成并继续下一个文件。 这里的事情是,我被要求自动执行检查是否有新文件的过程,以便调度程序进行检查并启动漫长的过程。 我完成了任务并将其编程为每 5 分钟运行一次,但之前的工作会花费更长的时间,这就是我知道它不会等到第一个任务结束的方式。我认为 withoutOverlapping 会阻止这种情况发生,但因为它没有用,我不知道是否有办法实现。

php laravel task jobs schedule
1个回答
0
投票

听起来您正在使用任务调度程序来检查新文件并启动数据处理作业。但是,您遇到的问题是,当调度程序启动下一个作业时,上一个作业可能仍在运行,从而导致重叠和潜在的数据处理错误。

此问题的一个解决方案是使用文件锁来防止调度程序在前一个作业仍在运行时启动新作业。当处理作业开始时,它会获取特定文件的文件锁,调度程序会在开始新作业之前检查此文件锁是否仍然存在。如果锁还在那里,调度器会等到锁被释放后再开始下一个作业。

另一个解决方案可能是使用队列系统来管理数据处理作业。您可以将它们排入队列系统,例如 RabbitMQ 或 Apache Kafka,而不是直接从调度程序启动作业。然后,处理工作将由工作进程接管,工作进程可以根据需要扩大或缩小规模,以处理传入的工作量。这样,您就可以确保按照接收到的顺序处理作业,而不会出现重叠或错误的风险。

总的来说,使用文件锁或队列系统可以帮助您自动化检查新文件和启动数据处理作业的过程,同时还确保作业以受控和安全的方式执行。

© www.soinside.com 2019 - 2024. All rights reserved.