WEB 应用程序中的通知调度问题

Problem with notification scheduling in WEB Applications

上下文

我目前正在实施一项功能,使用 PHP 和 Firebase 通过 Web 表单安排特定时间段的通知。

为了发送通知,我使用 Firebase 并将通知发送到 Android/Ios。

为了安排通知,我使用 AT linux 服务,因为它似乎比 cron 更适合,因为 cron 运行s 在某些频率而 AT 没有,它在特定时间 运行s。

关于 AT 的手册页:man page AT

示例代码

/usr/bin/php `send_notification.php` | at 2021-07-11 15:40

这将在 linux 上创建一个文件,该文件将 运行 在 2021-07-11 15:40 期间仅一次。

问题

AT 服务与 CRON 一样,在操作系统的目录中创建代表作业的文件。

1 - 如果扩展 AWS 上的一台机器,作业可能会重复,因此会不止一次发送通知。 (注意:我不太了解机器缩放,但我相信它应该发生)

2 - 如果机器由于包含某些功能或类似的东西而停机,我相信目前的方式不会执行作业。

3 - 另一个问题,但不是主要问题,是如果我使用的是 docker 容器。由于 Ubuntu + PHP 在容器内,如果我重新启动容器,作业文件可能会丢失,所以在这种情况下,我认为解决方案是使用卷,但事实并非如此我现在的问题是,目前该应用程序在 AWS EB 上仅使用一台带有 PHP 图像的机器。

疑惑

我认为你需要一个地方来持久化计划和完成的通知,独立于你正在使用的东西,cron 或 at。

如果我有这样的任务,我会坚持这样的解决方案:运行 特殊脚本,“scheduler.php”每个 cron 1(或更多,例如 5)分钟,它将检查一些日志文件(或多台机器的远程数据库)并查看是否有任何新行。如果出现新行并且它包含过去的时间戳和状态“已安排”,那么脚本将锁定它并且 运行 你的“sender.php”。之后它将把该行标记为“完成”。存储中的每一行都应包含一个到 运行 的时间戳和三个状态之一“已安排”、“运行ning”和“完成”。

使用这种方法,您可以通过在存储中添加包含所需时间和状态“已安排”的行来计划新通知。请注意,根据 cron 间隔,计划时间和实际通知之间可能会有一点延迟,但我认为这并不重要。

这将允许您 运行 在不同的机器上执行任意数量的 cron,并保证每项工作都会完成一次。

重要提示:如果您将采用此方案,请确保您的 scheduler.php 在单个原子操作中读取和更新存储,以防止多个 cron 之间的竞争条件。文件锁,或“select for update”都可以。