建立类似于Stackoverflow的"收件箱"功能的推荐方法是什么?

leo*_*ora 12 sql-server nhibernate asp.net-mvc caching inbox

我有一个asp.net-mvc网站,人们管理一个项目列表.根据一些算法,我可以判断一个项目是否已过时.当用户登录时,我希望它显示过时项目的数量(类似于我在收件箱中看到许多更新时).

计算陈旧项目的算法有点慢,所以如果每次用户登录,我必须:

  1. 对所有项目的所有项目运行查询
  2. 运行IsStale()算法
  3. 显示IsStale = true的计数

我的猜测是真的很慢.此外,在所有项目写入,我将不得不重新计算上面的内容,看看是否有变化.

我的另一个想法是创建一个表并在几分钟内运行一个工作来计算陈旧项目并将最新计数存储在此度量表中.然后只是在用户登录时查询.问题是我仍然需要保持该表同步,如果它每分钟仅重新计算一次,如果人们更新项目,它将不会在一分钟后更改值.

有任何想法以快速,可扩展的方式支持此收件箱概念,以提醒用户审查的项目数量?

Mos*_*cho 10

第一步始终是适当的需求分析.我们假设我是项目经理.我登录系统,它按时显示我唯一的项目.一位开发人员来到我的办公室告诉我他的活动有延迟.我选择开发人员的活动并更改其持续时间.系统仍按时显示我的项目,所以我很乐意离开工作.

如果我在凌晨3点接到客户的电话询问我为什么不能按时解释项目的原因,我觉得怎么样?显然,非常惊讶,因为系统没有以任何方式警告我.为什么会这样?因为我必须等待30秒(为什么不是1秒?)下一次运行预定作业来更新项目状态.

这只是一个解决方案.必须立即向用户发送警告,即使运行该IsStale()过程需要30秒.向用户显示loading...图像或其他任何内容,但请确保用户具有准确的数据.

现在,关于实现,不能做任何事情来逃避上一个问题:当影响某些到期日期的事情发生变化时,您将不得不运行该过程.但是,您可以做的不是不必要地运行该过程.例如,您提到可以在用户登录时运行它.如果2个或更多用户登录并查看同一个项目并且不更改任何内容,该怎么办?没有必要两次运行该过程.

更重要的是,如果您确保在用户更新项目时运行该过程,则无需在任何其他时间运行该过程.总之,与"轮询"解决方案相比,此模式具有以下优点和缺点:

好处

  • 没有预定的工作
  • 没有不需要的进程运行(这是有争议的,因为你可以dirty在项目上设置一个标志,只有它运行它true)
  • 没有不必要的dirty值查询
  • 将始终通知用户项目的当前和实际状态(这是迄今为止提供的任何解决方案中要解决的最重要的项目)

缺点

  • 如果用户更新项目然后在几秒钟内再次升级它,则该过程将运行两次(在轮询模式中,该过程甚至可能在该时间段内不运行一次,具体取决于已调度的频率)
  • 更新项目的用户必须等待该过程完成

更改为以与StackOverflow类似的方式实现通知系统的方式,这是一个完全不同的问题.我想你与用户和项目之间存在多对多的关系.最简单的解决方案是为这些实体(中间表)之间的关系添加单个属性:

基数:用户有很多项目.一个项目有很多用户

这样,当您运行该过程时,您应该Has_pending_notifications使用新结果更新每个用户.例如,如果用户更新项目并且不再按时,那么您应该设置为true所有用户Has_pending_notifications字段,以便他们了解情况.同样,将其设置false为项目准时时(我知道您只是想确保在项目不再准时时显示通知).

以StackOverflow为例,当用户读取通知时,您应该将标志设置为false.确保您不使用时间戳来猜测用户是否已阅读通知:登录并不意味着阅读通知.

最后,如果通知本身足够复杂,您可以将其从用户和项目之间的关系中移开,并执行以下操作:

基数:用户有很多项目.一个项目有很多用户.用户有很多通知.通知有一个用户.一个项目有很多通知.通知有一个项目.

我希望我所说的有道理,或者给你一些其他更好的主意:)


Fra*_*ese 6

你可以这样做:

  1. 对每个用户记录添加一个日期时间字段,表示上次完成慢速计算的时间.称之为LastDate.
  2. 为每个项目添加一个布尔值来说明是否必须列出.叫它:选中
  3. 运行Slow过程设置时,更新Selected fileds
  4. 现在,当用户记录LastDate足够接近现在时,您使用最后一次慢速计算的结果,并将所有项目选为 true.否则你的计算速度慢了.上述过程是最佳的,因为它只在实际需要的情况下重新计算慢速程序,同时以固定的时间间隔运行程序......有浪费时间的风险,因为用户可能会使用计算结果.