我正在寻找有关如何可靠地运行后台操作的建议。我有许多服务器向 AWS SQS 发布操作消息,还有另一台服务器将在空闲时运行这些 CPU 密集型操作。
我需要某种轮询机制来时不时地检查 SQS 是否有新操作。cron 是实现此目的的最佳方法吗?我考虑将 PHP 脚本放入 cron 中并每 5 分钟轮询一次 - 这可靠吗?
我需要确保一次处理一个操作(来自 SQS 的消息)。某些处理可能需要超过 5 分钟 - 如果操作待处理,我该如何通知 cron 不要轮询?
如何仅在 CPU 空闲时运行操作?PHP 是否提供 CPU 数据?
最重要的是,我需要它具有高度可靠性。如果一个操作的处理失败,它不应该影响未来的操作。
有人能给我指明正确的方向吗?
答案1
我需要某种轮询机制来时不时地检查 SQS 是否有新操作。cron 是实现此目的的最佳方法吗?我考虑将 PHP 脚本放入 cron 中并每 5 分钟轮询一次 - 这可靠吗?
这应该是非常可靠的,除非你需要更细粒度的东西。
我需要确保一次处理一个操作(来自 SQS 的消息)。某些处理可能需要超过 5 分钟 - 如果操作待处理,我该如何通知 cron 不要轮询?
让 cron 中的程序检查是否存在某个标记文件。如果存在,则调用的 cron 程序将直接退出,而不执行更多工作。
如何仅在 CPU 空闲时运行操作?PHP 是否提供 CPU 数据?
如果你通过调度类 IDLE 运行 CPU 密集型操作,请使用chrt --idle command args
请注意,这将仅有的当处理器没有其他工作要做时,运行处理队列,您可能会发现这种行为会导致进程变得太慢!这种情况的后果是您的负载将始终低于 1(因为进程将在运行队列中停留很长时间而没有被安排)。
最后,您可以使用该batch
命令来安排在负载低于某个值时执行的任务——坦率地说,它不是很动态,一旦启动就不会受到阻碍。