ASP.Net为大规模系统调度定时事件

时间:2010-03-07 08:09:13

标签: c# asp.net exchange-server scheduled-tasks quartz-scheduler

如果不是数以千计的定时事件,最佳做法是什么?

我有一个基于C#ASP.Net网络的应用程序,该应用程序位于Microsoft Exchange和另一个基于Web的服务之间。对于用户约会,每小时检查一次Exchange,然后需要将这些约会转发到另一个基于Web的服务,但不是立即转发。应根据与约会的接近程度转发它们,因此请在约会开始前15分钟进行转发。我在考虑使用计划任务,但我不确定系统如何能够阻止大量用户呢?

检查Exchange确实不是问题,但根据从Exchange获取的数据触发另一个事件有点棘手。我看过Quartz.Net,也许这可能会有所帮助。我很好奇人们可以想到的其他设计解决方案以及我当前设计的问题。当然,一个理想的世界,Exchange插件将是首选的解决方案,但它暂时不是一个选择。

感谢收听!

2 个答案:

答案 0 :(得分:1)

应用程序可能不应该是一个Web应用程序 - 理想情况下应该是一个Windows服务,但我很欣赏它不一定那么简单,因此你需要确保所有你发射的代码都是自包含的最低限度依赖托管应用程序。

我认为在发送数据方面,我可能会这样做: 1)获取交换处理以确定每个项目的转发时间 - 因此您有一个表格,其中包含“发送”列和另一个“已发送”列。 2)然后,您每分钟运行一个流程,说明发送将要发送的所有未发送的内容。轻微的皱纹是,如果它超出你需要立即再次运行 - 如果它一直超支你有容量问题。

关于这一点是非常非常简单的 - 你有一个执行明确定义的任务的交换过程,并且你有一个高频率的任务没有做任何特别复杂的事情,它是一个简单的查询(从表中选择)其中sent = false并发送at< value) - 可能进入临时表,这样您就可以在完成发送后运行单个查询更新 - 您可以优化索引。你不是试图排队一大堆事件触发器,只是每分钟触发一次并处理到期事件。

答案 1 :(得分:0)

或许更好的解决方案是将事件存储在暂存区域并每分钟查询该表并将相关事件推送给用户。这意味着你每分钟只能查询一次,但是你如何回到用户我不确定。

这远不是一个完全考虑过的选项,但可能足以让你在不同的方向思考。