我需要设置一个每分钟运行一次的自动化任务,并在队列中发送电子邮件。我正在使用ASP.NET 4.5和C#。目前,我使用一个从global.asax开始的调度程序类,并使用缓存和缓存回调。我读过这会导致一些问题。
我这样做的原因是因为这个应用程序在多个负载平衡的服务器上运行,这使我可以在一个地方执行,即使一个或多个服务器处于脱机状态,代码也会运行。
我正在寻找一些方法来改善这一点。我读过Quartz.NET但从未使用过它。 Quartz.NET是否从应用程序中调用方法?还是从Windows服务?还是来自网络服务?
我还阅读了有关使用Windows服务的内容,但据我所知,这些服务直接安装在服务器上。问题是,我需要执行任务,无论有多少服务器在线并且不想复制它。例如,如果我在服务器1和服务器2上设置了计划任务,它们将一起运行,从而复制请求。但是,如果服务器1处于脱机状态,我需要服务器2来运行该任务。
有关如何向前推进的任何建议,还是global.asax方法是多服务器环境的最佳方式?顺便说一句,Web服务器正在运行带有IIS 8的Win Server 2012。
修改
在请求更多信息时,队列存储在数据库中。我还应该提到数据库服务器与Web服务器是分开的。有两个数据库服务器,但一次只能运行一个。他们都读取了一个中央存储,因此只有一个数据库实例。当一个数据库服务器出现故障时,另一个数据库服
话虽如此,将Windows服务部署到两个数据库服务器会更有意义吗?这样可以确保一次只运行一个。
另外,您对从应用程序运行Quartz.NET有何看法?正如millimoose所提到的,我并不一定需要在Web前端运行它,但这样做可以让我不将Windows服务部署到多台机器上,我认为不会出现性能差异。想法?
感谢大家到目前为止的输入。如果需要任何其他信息,请告诉我。
答案 0 :(得分:1)
您必须更加具体地了解您的架构。电子邮件队列在哪里;在内存或数据库?如果它们存在于数据库中,您可以拥有一个名为“processing”的标志列,当一个任务从队列中抓取一封电子邮件时,它只会抓取当前未处理的电子邮件,并为其抓取的电子邮件将处理标志设置为true。然后将并发问题留给数据库。