展望未来,何时创建Web Farm ......

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

在服务器场环境中,理论上我们可以在每台机器上安装和运行每个服务,但是由于基于业务对象的“第一次写入 - 获胜”,可能存在冲突。或不期望的任务重复,例如:发送相同的电子邮件多次。

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

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

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

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

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

有帮助吗?

解决方案

我可以想到两种机制。

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

  2. 您可以使用消息队列并将任务放在其上,然后让您的Windows服务轮询队列。每个排队的消息只能由单个服务出列,因此您可以确保每个任务只执行一次。当然,您必须担心加载消息队列。根据您的应用程序,您可以使用亚马逊的简单队列服务,这样可以减轻您对可靠性和可扩展性的担忧。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top