【问题标题】:Design Patterns for C# Windows Services that send date driven messages发送日期驱动消息的 C# Windows 服务的设计模式
【发布时间】: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


【解决方案1】:

如果您计划每天进行一次数据库调用,我不会实施 Windows 服务。由任务计划程序触发的控制台应用程序就足够了。

如果您采用每天一次的路线 - 为什么不完全在数据库中执行此操作。创建一个执行您的 sql 的作业并从 SQL Server 发送电子邮件(假设您使用的是 SQL Server)。

正如您所提到的,您可以在客户注册时设置时间表。如果您走这条路,您可以使用SqlDependancy 检测更改,然后在 OnDependencyChange 事件中创建计划。

void OnDependencyChange(object sender, SqlNotificationEventArgs e )
{
  // Create schedule.
}

【讨论】:

    猜你喜欢
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多