处理异步服务器端操作
Handling asynchronous server-side operations
我需要在服务器端为 运行 异步操作实现一个系统,在考虑了很多选项之后,我不确定哪个是最好的和更具可扩展性的,或者在这种情况下通常使用什么。我一定是遗漏了什么,因为 none 的解决方案完全解决了问题。
上下文: 对于某些上下文,我有一个移动应用程序,用户可以在其中向其他用户发送请求以启动 activity。此操作在服务器端处理,如果请求没有其他用户的响应,它将在 15 分钟后过期并关闭。所以我在数据库中创建了一条包含此操作开始时间的记录,我需要在 15 分钟后更新其状态,因此是异步操作。需要恰好 15 分钟才能正确通知等待的用户。
可能的解决方案:
我正在使用 laravel,我正在考虑的解决方案是将延迟的作业推送到队列中。虽然一开始我认为这将是完美的解决方案,但我认为它可能无法扩展,因为这种请求的频率可能会变得太高,并且会有太多的作业排队。此外,不能保证队列作业在达到延迟后准确执行,并且可能解决得太晚。
我想到的另一个解决方案是每分钟在 cron 作业 运行 中处理所有这些,但是当请求量很大时它也有同样的问题。在性能方面,每分钟都执行此操作可能有点矫枉过正,尤其是在 activity 不常见的时候。
所以基本上,这些都是可以相对快速解决的小操作,但管理大量待处理操作的成本可能比操作本身更糟糕。是否有任何其他模式(甚至不减少到 laravel 或 php)将任务的执行延迟到未来的时间?
我认为您希望由 database/application(即 expires
列的范围)而不是队列守护程序来确定需要操作的用户请求。但是你希望这种决心以动态的速度发生。
Laravel中的一种可能解决方案:
创建一个在启动时添加到队列中并以动态速率重新排队的元作业。换句话说,您的队列中只有一个作业,它会评估所有未决的用户请求。完成后,它会将自己释放回队列,延迟取决于仍未决请求的数量(更多未决请求 = 更短延迟,更少未决请求 = 更长延迟)。用户请求永远不会自己放入队列中,只是由这个动态延迟的元作业处理。
此外,仅供参考,Laravel queue:work --daemon
使用 sleep()
来延迟其队列检查循环,这可能比使用 cron 作业(或queue:listen
进程),它会在每次调用时重新加载整个应用程序,但代价是必须手动重新启动以引入您可能对应用程序所做的任何更改。
我需要在服务器端为 运行 异步操作实现一个系统,在考虑了很多选项之后,我不确定哪个是最好的和更具可扩展性的,或者在这种情况下通常使用什么。我一定是遗漏了什么,因为 none 的解决方案完全解决了问题。
上下文: 对于某些上下文,我有一个移动应用程序,用户可以在其中向其他用户发送请求以启动 activity。此操作在服务器端处理,如果请求没有其他用户的响应,它将在 15 分钟后过期并关闭。所以我在数据库中创建了一条包含此操作开始时间的记录,我需要在 15 分钟后更新其状态,因此是异步操作。需要恰好 15 分钟才能正确通知等待的用户。
可能的解决方案:
我正在使用 laravel,我正在考虑的解决方案是将延迟的作业推送到队列中。虽然一开始我认为这将是完美的解决方案,但我认为它可能无法扩展,因为这种请求的频率可能会变得太高,并且会有太多的作业排队。此外,不能保证队列作业在达到延迟后准确执行,并且可能解决得太晚。
我想到的另一个解决方案是每分钟在 cron 作业 运行 中处理所有这些,但是当请求量很大时它也有同样的问题。在性能方面,每分钟都执行此操作可能有点矫枉过正,尤其是在 activity 不常见的时候。
所以基本上,这些都是可以相对快速解决的小操作,但管理大量待处理操作的成本可能比操作本身更糟糕。是否有任何其他模式(甚至不减少到 laravel 或 php)将任务的执行延迟到未来的时间?
我认为您希望由 database/application(即 expires
列的范围)而不是队列守护程序来确定需要操作的用户请求。但是你希望这种决心以动态的速度发生。
Laravel中的一种可能解决方案:
创建一个在启动时添加到队列中并以动态速率重新排队的元作业。换句话说,您的队列中只有一个作业,它会评估所有未决的用户请求。完成后,它会将自己释放回队列,延迟取决于仍未决请求的数量(更多未决请求 = 更短延迟,更少未决请求 = 更长延迟)。用户请求永远不会自己放入队列中,只是由这个动态延迟的元作业处理。
此外,仅供参考,Laravel queue:work --daemon
使用 sleep()
来延迟其队列检查循环,这可能比使用 cron 作业(或queue:listen
进程),它会在每次调用时重新加载整个应用程序,但代价是必须手动重新启动以引入您可能对应用程序所做的任何更改。