【问题标题】:Architecture to manage multiple instances of a worker?管理多个工作人员实例的架构?
【发布时间】:2012-10-26 00:38:08
【问题描述】:

我应该选择什么架构?有一个工作进程将消息从队列中取出并逐一处理。现在我可以让许多 Windows 服务实例来完成这项工作,或者我可以让一个 WCF 服务作为 Windows 服务托管,以充当某种服务器,我可以在该服务器上为每个实例启动一个线程。

哪种方法可以更好地扩展?当我们谈论扩展速度非常快的云类基础架构以及非基于云的基础架构时,我希望获得观点。

【问题讨论】:

    标签: .net wcf architecture windows-services cloud


    【解决方案1】:

    您不能简单地将工作人员托管在服务中并使其成为多线程吗? Wcf 只是把事情搞砸了,因为您必须创建一个读取队列并调用服务的调度程序。通过让消费者作为服务工作,您也可以将其安装在多台机器上,配置为从同一个队列中读取,这样您就可以纵向和横向扩展。我假设您正在使用MSMQ 或其他类似的队列机制,如果没有,请考虑使用它。

    【讨论】:

    • 我想到了一个托管 WCF 服务的 Windows 服务……因为我需要通过某种通信方式在服务上启动线程。所以我认为WCF是它......!我没明白你所说的调度员是什么意思……那是什么模式?
    【解决方案2】:

    云中最具可扩展性的方法是配置一个实例,使用 WCF 或 Web-api 处理服务(如果您正在设计 RESTFUL 服务,则最好使用)。这样的实例将是可扩展的。在 Azure 的情况下,将其视为由 IIS 托管的 Web 角色。 IIS 旨在根据来自客户端的传入请求进行扩展。另一个优势是您可以获得 IIS 和 asp.net 基础架构来管理安全性和其他内容。但是,如果您不需要使用 Windows 服务托管的 WCF 或 Web-api 服务。然后,Web 服务实例会将消息排队或说工作负载到队列中。在 Azure 的情况下,队列可以是服务总线队列。然后,您可以使用 Windows 服务或 Azure 辅助角色从队列中提取工作项。通常一个工作人员从队列中拉出多条消息并处理它。这样做时,这些消息对其他工作人员不可用。工作人员完成后,从队列中删除消息或工作负载。因为一段时间后,其他工作人员可以看到它们,因此有可见性设置,例如在亚马逊 SQS 中有可见性超时设置。 *在单个工作线程中提取 5 到 10 条消息,并将它们作为线程池线程作为“任务”并行运行。

    请注意,在前端具有可扩展服务实例、在后端接收传入请求和工作人员角色以尽快清除工作项的架构依赖于云提供的分布式、健壮和可扩展队列,例如 Azure服务总线和 Amazon SQS。否则,您可能会遇到争用问题。

    对于内部(非云)部署,如果没有分布式队列,这里可以让 IIS 托管服务实例做所有事情,或者让 Windows 服务做所有事情或组合。我建议使用 IIS 托管 HTTP 服务来服务网页和接收传入请求(REST 服务)。 IIS 在这方面做得很好。但是,如果长时间没有请求,IIS 池可能会被回收并且可能无法运行。因此,如果需要在后端运行计划任务或作业,windows 服务很擅长这一点。让 Windows 服务来做所有事情当然是可行的,但根据我使用 IIS 和 asp.net 处理传入请求的经验,这有助于提高工作效率。您可以与服务和 Web 应用程序共享安全性。我更喜欢在前端使用 IIS,在后端使用 Windows 服务。有了这个,我不必使用 Windows 服务来管理安全性。尝试 NServiceBus 用于内部队列 @9​​87654321@。我没有评估它。

    【讨论】:

    • NServiceBus 只会在没有付费许可证的情况下运行单线程。
    • 就像拥有某种 http 服务(通过 iis 托管)来执行实际“过程”的想法。但是我想象一个工作人员一次处理一条消息 - 工作人员应该是一个多线程应用程序吗?
    • 是的,worker 应该是多线程的,以利用实例上的多个 CPU 和内核。如果失败,您需要运行更多实例来提高系统的响应能力,而每个实例都没有更充分地利用 CPU 和内核。这会增加成本。有很多方法可以设计这个。让一个线程从队列中获取许多消息,并以并行方式在线程池中执行消息。或者您可以让多个线程轮询队列并执行消息。等等。我喜欢第一种使用线程池线程的方法。
    【解决方案3】:

    我会将每个工作人员托管在一个单线程 Windows 服务中。这有以下好处:

    1. 易于编码和测试(无多线程)。
    2. 轻量级
    3. Dispatcher 没有必要 - 工作人员将在没有干预的情况下进行负载平衡。
    4. 易于部署/管理。如果工作人员出现问题,只需重新启动服务即可。

    【讨论】:

      猜你喜欢
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      相关资源
      最近更新 更多