第一步始终是正确的需求分析。假设我是项目经理。我登录到系统,它将我唯一的项目显示为准时。一位开发人员来到我的办公室,告诉我他的活动有延迟。我选择开发人员的活动并更改其持续时间。系统仍然显示我的项目准时,所以我很高兴地离开了工作。
如果我在凌晨 3:00 接到客户的电话,要求我解释为什么项目不再准时,您认为我会有什么感觉?显然,很惊讶,因为系统并没有以任何方式警告我。为什么会这样?因为我必须等待 30 秒(为什么不只等待 1 秒?)才能让下一次运行计划作业来更新项目状态。
那不可能是一个解决方案。即使运行该IsStale()
过程需要 30 秒,也必须立即向用户发送警告。向用户显示loading...
图像或其他任何内容,但要确保用户拥有准确的数据。
现在,关于实施,没有什么可以逃避上一个问题:当影响某些到期日期的事情发生变化时,您将不得不运行该过程。但是,您可以做的不是不必要地运行该过程。例如,您提到您可以在用户登录时运行它。如果 2 个或更多用户登录并看到同一个项目并且没有更改任何内容怎么办?没有必要运行该过程两次。
更重要的是,如果您确保在用户更新项目时运行该流程,您将不需要在任何其他时间运行该流程。综上所述,与“轮询”方案相比,这种模式有以下优点和缺点:
优点
- 没有预定的工作
- 没有不需要的进程运行(这是有争议的,因为您可以
dirty
在项目上设置一个标志,并且只有在它是时才运行它true
)
- 没有不需要的
dirty
值查询
- 用户将始终被告知项目的当前和真实状态(这是迄今为止在所提供的任何解决方案中要解决的最重要的项目)
缺点
- 如果用户更新了一个项目,然后在几秒钟内再次对其进行更新,则该进程将运行两次(在轮询模式中,该进程甚至可能不会在该期间运行一次,具体取决于它已安排的频率)
- 更新项目的用户将不得不等待该过程完成
更改为以与 StackOverflow 类似的方式实现通知系统的方式,这是一个完全不同的问题。我猜您与用户和项目之间存在多对多的关系。最简单的解决方案是将单个属性添加到这些实体之间的关系(中间表):

基数:一个用户有很多项目。一个项目有很多用户
这样,当您运行该过程时,您应该Has_pending_notifications
使用新结果更新每个用户。例如,如果用户更新了一个项目并且它不再准时,那么您应该设置为true
所有用户Has_pending_notifications
字段,以便他们了解情况。同样,将其设置为false
项目准时(我知道您只是想确保在项目不再准时时显示通知)。
以 StackOverflow 为例,当用户阅读通知时,您应该将标志设置为false
. 确保您不使用时间戳来猜测用户是否已阅读通知:登录并不意味着阅读通知。
最后,如果通知本身足够复杂,您可以将其从用户和项目之间的关系中移开,并采用如下方式:

基数:一个用户有很多项目。一个项目有很多用户。一个用户有很多通知。通知有一个用户。一个项目有很多通知。通知有一个项目。
我希望我说的有些道理,或者给你一些更好的主意:)