我试图制作一个提醒系统,我使用石英作为我的日程安排。然而,我想出了几种可能的方法,如何做我需要做的事情,但我不知道什么是最好的方式,如何测试它。
基本上,我有一个提醒系统,用户可以设置提醒。就像谷歌日历。您设置事件的日期和时间,然后通过说“15分钟前提醒我”来设置提醒。
所以你可以在2011年5月10日上午9点59分举行一个活动,你可以说"15分钟前“提醒我
那是5月10日上午10点44分
我将在一个托管的环境中。(我的站点和调度将在相同的环境中运行,甚至在相同的解决方案中运行。所以它不能让用户浏览我的网站的速度慢很多。)
我还使用nhibernate和fluent nhibernate来进行数据库查询。我正在使用asp.net mvc 3作为我的网站。
选项1.
每分钟进行一次数据库查询,并获得应在该分钟内发出的所有提醒。当然,这意味着每分钟都有一个数据库查询,对于共享环境来说可能过于密集。
选项2.
每5分钟进行一次数据库查询,并抓取在该5分钟块中应该发送的所有提醒,并将它们存储在一个集合中(因此内存),然后每分钟检查需要发送哪些提醒。
当然,这会减少所做的查询量,但不确定这是否会导致极大的内存密集型。
选项3
与选项2相同,但每15分钟发送一次查询并存储在集合中。
当然,这意味着更少的数据库查询,但更多的存储在内存中。
选项4
每15分钟进行一次数据库查询,并获取该块中的所有提醒并立即将其触发。
这意味着它们不会被很长时间存储在内存中,并且减少了查询量。然而,取决于用户设置提醒的时间,电子邮件可能到达的时间早于他们设置的时间。
例如,他们说在上午10点44分提醒我我会让我的调度程序从上午10:00开始,从上午10:00到10:15,然后从上午10:15到10:30,然后从上午10:30到10:45。
因此,这封电子邮件实际上会比预期的提前14分钟到达。
发布于 2011-05-10 17:09:04
以下是我如何解决这个问题的方法。
DB层的
这种技术的优点之一是,当代理代理检查队列时,不让代理代理应用业务规则。如果您希望它每分钟都醒来(例如,检查是否有需要发送的新消息),那么您只需确保这个队列总是每分钟都有一个事件(该事件可能具有不发送消息的类型,“唤醒”消息没有目标)。代理将唤醒并执行检查。然后,如果您想要应用更复杂的调度规则,它们是很容易的。您不必对代理进行重新编码,只需更改队列中的消息。(例如,系统高使用率时每10分钟检查一次,低使用率时每20分钟检查一次,晚上备份时停止检查)。所有这些都可以在不更改代理代码的情况下完成(并更改)。
一个简单的现实世界的例子
QueueTable
----------
ID int
deliverTime datetime
nagCount int
expireTime datetime
active bool
processed datetime (null)
' maybe some audit stuf...
' content of the message -- or external link
' etc开始:代理人打这样的电话
SELECT TOP 1 *
FROM QueueTable
WHERE active = true and processed is null
ORDER BY deliverTime DESC然后,代理将查看deliverTime时间:
我最初是以布尔值的形式处理的,但是如果您使用null等于not processed,那么它可以加倍为审核字段。
无论发生什么情况,每10分钟检查一次。
这是如何工作的:,因为结果是按时间排序的,最快的结果会出现在顶部。我们要做的是从现在开始在结果集中添加一个项目10分钟。因此,最重要的项目将永远不会超过10分钟从目前的时间。
SELECT TOP 1 *
FROM QueueTable
WHERE active = true and processed is null
UNION ALL
SELECT NULL, DATEADD(min,GETDATE(),10), null, null, false, null, ...
ORDER BY deliverTime DESC注意,这里使用active列作为标志,以显示不执行任何操作。这个记录只是唤醒特工的一个标记。此方法还根据其他规则进行调整(例如白天的时间,因为晚上不需要经常检查等等)。
发布于 2011-05-10 16:45:26
如果选项4不符合您的要求,我可能会立即放弃它。
其他选项实际上依赖于您的系统配置文件(有多少人使用它?在任何一段5/15分钟的时间内,有多少次提醒?)这些是你需要回答的问题。另外,服务器上已经发生了多少活动?如果它还没有承受很大的压力,那么每一分钟的查询都不是很多。
最后,请记住,如果您仅每5/15分钟查询一次,那么如果在查询之后发生更改/添加/删除,并且提醒应该落在5/15分钟的窗口中,那么您可能会错过日程的更改/添加/删除。同样,这取决于应用程序的要求,即这是否可以接受。
https://stackoverflow.com/questions/5953393
复制相似问题