【发布时间】:2017-01-30 03:52:13
【问题描述】:
为简单起见,我将使用向大约 1,000,000 名客户(存储在数据库中)的客户群发送生日电子邮件的场景,因为我尝试解决的场景与此类似。
通常,我设计的解决方案是创建一个使用 Quartz.net 安排的 Windows 服务,该服务将轮询整个客户表(尽管已编入索引),寻找与今天日期匹配的生日(或服务运行时) .该服务将循环遍历客户列表并发送电子邮件等。这将被安排为每天运行一次。
我想知道这是否是解决此问题的正常方法,还是有更好的方法/不同的模式?轮询数据库给我感觉……有点臭……
我在想,既然我们知道客户在注册时的生日(例如,他们的生日可能在一周后),我是否应该在注册时主动设置时间表跑呢?
我试图避免的一件事是,例如,当我们知道那天没有生日时轮询数据库(好吧,在 1,000,000 名客户中,您希望有几个!...但是让我们假设整整一个月都没有......) - 什么解决方案可以避免这个问题?
谢谢
【问题讨论】:
-
每天查询一次数据,即使当天没有结果,看起来也不是问题。我确实质疑将 Windows 服务与调度系统一起使用,但调度的控制台应用程序似乎更适用于该场景。 (Windows 服务将始终运行,而不是计划。)
-
这也是我做的。我创建了执行这些类型任务的控制台应用程序,并使用 Task Scheduler 安排它们。
-
感谢您的回复 - 我使用 Topshelf 和 Quartz.net。它在本地作为控制台应用程序运行,但它安装/托管在 Windows 服务中。调度本身由 Quartz 控制。
-
如果你真的有一百万客户,那么有任何天没有生日的变化是极低的,不值得让你的设计复杂化。有了生日时的索引,投票就不会成为一个大问题。但是,每天运行一次程序可能还不够(除非您的所有客户都在同一时区,这不太可能)。否则,您最终可能会在深夜向某些客户发送电子邮件,并且不太可能直到第二天才能阅读
标签: c# design-patterns windows-services scheduled-tasks quartz.net