C# 的设计模式 Windows 发送日期驱动消息的服务
Design Patterns for C# Windows Services that send date driven messages
为简单起见,我将使用向约 1,000,000 名客户(存储在数据库中)的客户群发送生日电子邮件的场景,因为我试图解决的场景与此类似。
通常,我设计的解决方案是创建一个 Windows 服务,使用 Quartz.net 安排,它会轮询整个 table 的客户(尽管已编入索引)寻找与今天日期匹配的生日(或服务 运行s 时)。该服务将循环访问客户列表并发送电子邮件等。这将被安排为 运行,比如说,每天一次。
我想知道这是解决这个问题的正常方法,还是有更好的方法/不同的模式?轮询数据库给我的感觉...有点臭..
我在想,既然我们在客户注册的时候就知道他们的生日,(例如,他们的生日可能是一周后),我是否应该在注册的时候,主动设置日程安排到运行呢?
我试图避免的一件事是在我们知道那天没有任何生日时轮询数据库(例如,在 1,000,000 名客户中,您会期望有几个!.. .但让我们假装整个月都没有任何东西..) - 什么解决方案可以避免这个问题?
谢谢
如果您计划每天调用一次数据库,我不会实施 windows 服务。由 Task Scheduler 触发的控制台应用程序就足够了。
如果您采用每天一次的方式 - 为什么不完全在数据库中执行此操作。创建一个执行您的 sql 的作业并从 SQL 服务器发送电子邮件(假设您使用的是 SQL 服务器)。
正如您提到的,您可以在客户注册时设置时间表。如果你走那条路,你可以用 SqlDependancy 检测变化,然后在 OnDependencyChange 事件中创建一个时间表。
void OnDependencyChange(object sender, SqlNotificationEventArgs e )
{
// Create schedule.
}
为简单起见,我将使用向约 1,000,000 名客户(存储在数据库中)的客户群发送生日电子邮件的场景,因为我试图解决的场景与此类似。
通常,我设计的解决方案是创建一个 Windows 服务,使用 Quartz.net 安排,它会轮询整个 table 的客户(尽管已编入索引)寻找与今天日期匹配的生日(或服务 运行s 时)。该服务将循环访问客户列表并发送电子邮件等。这将被安排为 运行,比如说,每天一次。
我想知道这是解决这个问题的正常方法,还是有更好的方法/不同的模式?轮询数据库给我的感觉...有点臭..
我在想,既然我们在客户注册的时候就知道他们的生日,(例如,他们的生日可能是一周后),我是否应该在注册的时候,主动设置日程安排到运行呢?
我试图避免的一件事是在我们知道那天没有任何生日时轮询数据库(例如,在 1,000,000 名客户中,您会期望有几个!.. .但让我们假装整个月都没有任何东西..) - 什么解决方案可以避免这个问题?
谢谢
如果您计划每天调用一次数据库,我不会实施 windows 服务。由 Task Scheduler 触发的控制台应用程序就足够了。
如果您采用每天一次的方式 - 为什么不完全在数据库中执行此操作。创建一个执行您的 sql 的作业并从 SQL 服务器发送电子邮件(假设您使用的是 SQL 服务器)。
正如您提到的,您可以在客户注册时设置时间表。如果你走那条路,你可以用 SqlDependancy 检测变化,然后在 OnDependencyChange 事件中创建一个时间表。
void OnDependencyChange(object sender, SqlNotificationEventArgs e )
{
// Create schedule.
}