处理异步服务器端操作

Handling asynchronous server-side operations

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

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

可能的解决方案:

所以基本上,这些都是可以相对快速解决的小操作,但管理大量待处理操作的成本可能比操作本身更糟糕。是否有任何其他模式(甚至不减少到 laravel 或 php)将任务的执行延迟到未来的时间?

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

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

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

此外,仅供参考,Laravel queue:work --daemon 使用 sleep() 来延迟其队列检查循环,这可能比使用 cron 作业(或queue:listen 进程),它会在每次调用时重新加载整个应用程序,但代价是必须手动重新启动以引入您可能对应用程序所做的任何更改。