devise问题:您将如何devise一个循环事件系统?

如果你的任务是build立一个支持重复事件的事件调度系统,你会怎么做? 当一个重复的事件被删除,你如何处理? 你怎么能看到未来事件何时会发生?

即创build活动时,您可以select“每天重复”(或每周,每年等)。

每个响应一个devise请。 我习惯于Ruby / Rails,但使用任何你想expression的devise。

我在接受采访的时候被问到了这个问题,不能拿出我喜欢的很好的回答。

注意: 已经在这里提出/回答。 但是我希望能得到一些更实用的细节,具体如下:

  • 如果有必要能够评论或以其他方式将数据添加到定期事件的一个实例,那么这将如何工作?
  • 如何更改和删除事件?
  • 你如何计算未来事件发生的时间?

我开始实施Martin Fowler概述的一些时间expression。 这需要注意确定预定项目何时应该发生。 这是一个非常优雅的方式。 我最终得到的仅仅是文章内容的构build。

接下来的问题是弄清楚世界上如何存储expression式。 另一个问题是当你读出expression式时,这些expression式如何适合一个不那么dynamic的用户界面? 有人说只是把expression式序列化成一个BLOB,但是走expression式树很难知道它是什么意思。

解决scheme(在我的情况下)是存储适合用户界面支持的有限数量的参数,并从那里使用该信息来dynamic生成时态expression式(可以在为优化创build时序列化)。 所以,Schedule类最终有几个参数,如偏移量,开始date,结束date,星期几等等,并且从中可以生成时间expression式来完成辛苦的工作。

至于有任务的实例,有一个“服务”,生成N天的任务。 由于这是对现有系统的集成,并且需要所有实例,所以这是有道理的。 但是,这样的API可以很容易地用来投影重复,而不需要存储所有的实例。

在我pipe理项目的数据库结束之前,我必须这样做。 我要求将每个事件存储为单独的事件。 这可以让你删除一个事件,或者你可以移动一个范围。 删除倍数比试图修改单个事件并将其变为两倍要容易得多。 然后,我们可以创build另一个简单的包含循环信息的recurrenceID表。

Joe Van Dyk问道:“你能看看未来,看看即将到来的事件是什么时候吗?”

如果您想查看/显示事件的下一次出现,他们必须提前计算并存储在某处,或者b)立即计算并显示。 这对于任何晚上的框架都是一样的。

a)的缺点是你必须在某个地方设置限制,之后你必须使用b)。 更容易使用b)开始。

调度系统不需要这些信息,只需要知道下一个事件是什么时候。

当保存事件时,我会将时间表保存到商店(我们称之为“ 时间表 ”),然后计算事件何时下次启动并保存,例如在“ 事件 ”中。看看“ 事件 ”,并找出下一个事件发生的时间,然后去睡觉。

当应用程序“醒来”它将计算事件何时应该再次发生,再次存储在“ 事件 ”,然后执行事件。

重复。

如果睡眠时创build事件,则会中断并重新计算睡眠。

如果应用程序正在从睡眠事件或类似事件中启动或恢复,请检查“ 事件 ”以查看已通过的事件并采取相应的措施(具体取决于您对丢失事件所做的操作)。

像这样的东西将是灵活的,不会占用不必要的CPU周期。

closures我的头顶(在打字/思考的同时修改了一些东西):

确定所需的最小重复分辨率; 这是应用运行的频率。 也许是每天,也许是每五分钟。

对于每个重复发生的事件,如果需要,存储最近的运行时间,运行时间间隔以及其他好处,如过期时间。

每次运行应用程序时,都会检查所有事件,比较(today / now + recurrenceResolution)到(recentRunTime + runInterval),如果它们一致,则触发该事件。

当我几年前为自己写了一个日历应用程序时,我基本上只是从cron偷了调度机制,并将其用于重复性事件。 例如,除了一月份的第二个星期六发生的事情,将包括“重复= * 2-12 8-14 6”(每年2-12个月,第二周从8日到14日, 6星期六,因为我在一周中使用了0为基础的编号)。

虽然这可以很容易地确定事件是否发生在任何给定的date,但它不能够处理“每N天”的再发生,对于不懂unix的用户来说也是不太直观的。

为了处理个别事件实例和移除/重新计划的唯一数据,我只是跟踪事件已计算了多远,并将结果事件存储在数据库中,然后在那里可以修改,移动或删除,而不影响原始经常性事件信息。 当添加新的循环事件时,所有实例立即计算出来,直到现有的“上次计算”date为止。

我并不认为这是做这件事的最好方法,但这是一种方法,在我之前提到的限制范围内工作得很好。

如果你有一个简单的重发事件,例如每周,每周或几天,在scheduler / cron / at functionallity中使用buildt有什么问题? 创build可执行文件/控制台应用程序并设置运行时间? 没有复杂的日历,事件或时间pipe理。

🙂

// w ^