1

展望未来,何时创建网络农场......

我们有各种 Windows 服务应用程序执行各种后台任务:发送电子邮件、缩略图/处理文件等。

在服务器场环境中,理论上我们可以在每台机器上安装和运行每个服务,但是由于基于业务对象的“先写双赢”或不希望的任务重复,例如:发送相同的电子邮件,可能会出现冲突。次。

可以通过解决问题或跳过项目的代码或逻辑来克服“先写获胜”的情况。(如果它是一个基本的排队机制(查询列表和进程记录),它将再次尝试)

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

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

这听起来像是一个合理的解决方案,还是应该在那个阶段采用更好的基于消息队列的解决方案(也不确定这在农场环境中如何工作?

技术:C# / ASP.NET / SQL Server

4

1 回答 1

2

我可以想到两种机制。

  1. 如果您的所有任务都来自数据库活动,您可以创建一个新的“任务”表并在活动上设置触发器,以便插入包含任务信息的新记录。然后,您的 Windows 服务可以轮询“任务”表并使用原子选择和删除事务来确保只有一个服务可以执行此操作。

  2. 您可以使用消息队列并将您的任务放在上面,然后让您的 Windows 服务轮询队列。每个排队的消息只能由单个服务出列,因此您可以确保每个任务只完成一次。当然,您必须担心消息队列上的负载。根据您的应用程序,您可以使用 Amazon 的 Simple Queue Service 之类的东西,这将减轻您对可靠性和可扩展性的担忧。

于 2009-09-14T09:57:25.630 回答