2009-09-14 51 views
1

展望未来,当一个Web农场将被创建以...Windows服务在Web场(如何防止并发冲突)

我们必须执行各种回地面任务的各种窗口服务应用程序:发送电子邮件,缩略图/处理文件等。

在服务器场环境中,我们可以理论上在每台计算机上安装并运行每项服务,但由于基于业务对象的“首写赢”或不合需要的重复任务例如:发送多次的相同电子邮件。

可以通过解决问题或跳过项目的代码或逻辑来克服“首写”方案。 (如果它的基本排队机制(查询列表和过程记录),它只会再次尝试)

对于任务重复,可以在事务中执行任务以防止其他进程获取相同的资源,但是我猜他们会等待,我们需要根据事情再次处理一些登录?情况会是这样吗?

为了防止重复的任务,我想建立一些机制,将一个“锁定标志”写入数据库,该数据库将由启动的第一个服务设置。该标志将会注明日期并引用该服务的实例。 “拥有”标志的服务将运行任务并定期更新此日期。在服务不拥有该标志的情况下,每个服务也会有超时/容限设置,它将检查容差并在需要时接管。

这听起来像一个合理的解决方案还是一个应该去一个更好的消息,在这个阶段(排队基础的解决方案还不能确定,将如何在农场工作environement

TECNOLOGIES:C#/ ASP.NET/SQL Server的

+0

如果某个服务在锁定某些记录后出现故障并完成了任务,但在写入之前会发生什么? – 2009-09-14 09:48:45

+0

这个想法是记录不会被锁定,它只是一个标志,表明哪个服务正在做这项工作。日期标记将向其他服务表明某些失败。在这种情况下,另一项服务将接管(类似于在同一台机器上重新启动一项服务)超时/容忍时间将需要超过任务(或多项任务)需要完成的预期时间长度。 – 2009-09-14 09:57:05

回答

2

我能想到的两种机制。

  1. 如果所有的任务是从数据库导出activites你可以创建一个新的“任务”表,并设置触发的活动,让一个新纪录任务信息不存在特德。然后,您的Windows服务可以轮询“任务”表并使用原子选择和删除事务来确保只有一个服务执行它。

  2. 您可以使用消息队列并在其上放置任务,然后让Windows服务轮询队列。每个排队的消息只能通过一个服务进行排队,因此您可以确保每个任务只进行一次。当然,你必须担心消息队列的负载。根据您的应用程序,您可以使用像亚马逊的简单队列服务这样可以减轻您不必担心可靠性和可伸缩性的问题。

+0

投票支持第二种解决方案 – 2009-09-14 10:06:05

+0

第二种解决方案的确证实了我的想法,即更多的企业消息传递排队系统是最佳选择。 – 2009-09-14 10:08:57

相关问题