Performance 处理异步服务器端操作

Performance 处理异步服务器端操作,performance,laravel,asynchronous,server,jobs,Performance,Laravel,Asynchronous,Server,Jobs,我需要实现一个在服务器端运行异步操作的系统,在考虑了许多选项之后,我不确定哪一个是最好的、更具可扩展性的,或者在这种情况下通常使用什么。我肯定错过了什么,因为没有一个解决方案能完全解决问题 上下文:对于某些上下文,我有一个移动应用程序,其中用户向其他用户发送请求以启动活动。此操作由服务器端处理,如果请求没有来自其他用户的响应,它将在15分钟内过期并关闭。因此,我在数据库中创建了一个记录,记录了这个操作的开始时间,我需要在15分钟后更新它的状态,这就是异步操作。它需要正好15分钟才能正确地通知等待

我需要实现一个在服务器端运行异步操作的系统,在考虑了许多选项之后,我不确定哪一个是最好的、更具可扩展性的,或者在这种情况下通常使用什么。我肯定错过了什么,因为没有一个解决方案能完全解决问题

上下文:对于某些上下文,我有一个移动应用程序,其中用户向其他用户发送请求以启动活动。此操作由服务器端处理,如果请求没有来自其他用户的响应,它将在15分钟内过期并关闭。因此,我在数据库中创建了一个记录,记录了这个操作的开始时间,我需要在15分钟后更新它的状态,这就是异步操作。它需要正好15分钟才能正确地通知等待的用户

可能的解决方案:

  • 我正在使用laravel,我正在考虑的解决方案是将延迟的作业推到队列中。虽然一开始我认为这是一个完美的解决方案,但我认为它可能不具有可扩展性,因为这种请求的频率可能会变得太高,并且会有太多的作业排队。此外,队列作业不能保证在达到延迟后完全执行,并且可能解决得太晚

  • 我考虑的另一个解决方案是在每分钟运行一次的cron作业中处理所有这些问题,但当请求量很大时,它也会遇到同样的问题。就性能而言,每分钟都这样做可能有点过分,尤其是在活动不频繁的时候


因此,基本上,这些都是小操作,解决起来相对较快,但管理大量未决操作的成本可能比操作本身更高。是否有任何其他模式(甚至不简化为laravel或php)将任务的执行延迟到未来时间?

我认为您希望由数据库/应用程序(即,范围由
expires
列)而不是队列守护进程来确定需要执行的操作的用户请求。但你希望这种决心以动态的速度发生

Laravel中一种可能的解决方案:

创建一个元作业,该作业在启动时添加到队列中,并以动态速率重新排队。换句话说,队列上只有一个作业,它会评估所有挂起的用户请求。完成后,它将自己释放回队列,延迟取决于仍然挂起的请求数(更多挂起的请求=更短的延迟,更少的挂起的请求=更长的延迟)。用户请求本身从不放入队列,只是由这个动态延迟的元作业处理


另外,仅供参考,Laravel
queue:work--daemon
使用
sleep()
延迟其队列检查循环,这可能比使用cron作业(或
queue:listen
进程)更有效,后者每次调用时都会重新加载整个应用程序,但是,在必须手动重新启动以获取您对应用程序所做的任何更改的权衡中。

Hi there wunch,我确实认为正确的方法可能与此类似,但需要注意一点。不是在启动时创建作业,而是在收到第一个请求时创建作业,以便它知道下次检查需要延迟多少时间(如果是在启动时创建的,但没有任何挂起的请求,我们也有相同的问题)。此外,如果到达不再有未决请求的点,则不应再次将其添加到队列中,它将在收到另一个新请求后创建。