Azure 每个实例运行多个WorkerRoles

Azure 每个实例运行多个WorkerRoles,azure,azure-worker-roles,Azure,Azure Worker Roles,我有几个WorkerRole,它们只在很短的时间内完成这项工作,将它们放在单个实例中是浪费金钱的。我们可以把它们合并成一个,但这将是一个混乱,在遥远的将来,当负载增加时,它们应该独立工作 有没有一种方法可以像创建“多站点”WebRole一样创建“多角色”WorkerRole 在否定的情况下,我认为我可以创建一个“主工作者角色”,它能够从给定的文件夹加载程序集,查找带有反射的RoleEntryPoint派生类,创建实例并调用.Run()或.OnStart()方法。此“主工作角色”还将重新引发意外异

我有几个
WorkerRole
,它们只在很短的时间内完成这项工作,将它们放在单个实例中是浪费金钱的。我们可以把它们合并成一个,但这将是一个混乱,在遥远的将来,当负载增加时,它们应该独立工作

有没有一种方法可以像创建“多站点”
WebRole
一样创建“多角色”
WorkerRole


在否定的情况下,我认为我可以创建一个“主工作者角色”,它能够从给定的文件夹加载程序集,查找带有反射的RoleEntryPoint派生类,创建实例并调用
.Run()
.OnStart()
方法。此“主工作角色”还将重新引发意外异常,并在主角色中调用
.OnStop()
时,在所有子
RoleEntryPoint
中调用
.OnStop()
。这样行吗?我应该知道什么?

为什么“多角色”会一团糟?您可以将每个工作人员角色实现编写为一个松耦合组件,然后从所有适当的组件中编写一个工作人员角色

当您以后需要将部分职责分离到单独的工作人员角色时,您可以仅使用此组件组成新的工作人员角色,同时将其从旧的工作人员角色中删除


如果您愿意,您可以使用后期绑定,这样甚至可以在不重新编译的情况下完成,但我通常认为这不值得付出努力。

多个工作者角色提供了一个非常干净的实现。但是,空闲角色实例的成本将远远高于单个工作角色

角色组合是我见过的一种常见模式,它与ISV在其Windows Azure部署中协作。您可以有一个经常唤醒并运行进程的后台线程。另一种常见的实现技术是使用Azure队列发送表示要执行的进程的消息。如果需要,可以有多个队列,也可以有一个命令队列。在任何情况下,都会有一个队列侦听器在后台线程中运行,该线程将在每个实例中运行。第一个得到消息的人处理它。您可以更进一步,让一个定时进程将这些消息推送到队列中(可能每24小时一次,或者每小时一次)

除了CPU和内存限制之外,请记住单个角色最多只能有5个端点(如果使用远程桌面,则更少)

编辑:截至2011年9月,角色配置变得更加灵活,因为在整个部署中有25个输入端点(可从外部访问)和25个内部端点(用于角色之间的通信)。MSDN文章是


我最近提到过,这有点相关。

正如其他人提到的,这是最大限度地利用实例的一种非常常见的技术。可能有一些示例和“框架”抽象了工作者基础结构和您想要完成的实际工作,包括(我们的)示例中的一个:(向下滚动到“实现内部”)

Te触发工作的最常见方式有:

  • 定时工作人员(如“cron” (工作)
  • 基于消息的工作者(由消息的存在触发的工作)
  • 上面提到的代码示例实现了对#2的进一步抽象,并且很容易对#1进行扩展

    但是请记住,与队列的所有交互都是基于轮询的。工作进程不会在队列中出现新消息时醒来。您需要主动查询队列中的新消息。过于频繁的查询会使Microsoft感到高兴,但可能不是您:-)。每个查询都算作一个计费的交易(其中10K=0.01美元)。一个好的做法是轮询队列中具有某种延迟回退的消息。此外,还可以批量获取消息


    最后,将这一点发挥到极致,您还可以在单个实例中组合web角色和工作者角色。请参见此处的示例:

    虽然为找到在单个辅助角色中执行多个辅助组件的方法而指出的解决方案没有实际问题,但我只希望您记住,首先定义不同辅助角色的整个要点是在出现故障时隔离。如果您只是将所有内容都推到一个Worker角色实例中,那么只有一个表现不好的Worker组件能够删除该角色中的所有其他Worker组件。现在,突然之间,您编写了大量的基础设施,以提供跨组件的隔离和容错,而这正是Azure为您提供的


    再说一遍,我并不是说严格地做一件事是绝对的。在某个地方,单个工作者角色下的多个组件是有意义的(尤其是在单成员角色下)。简单地说,您应该记住为什么它最初是以这种方式设计的,并在规划架构时适当地考虑到这一点。

    没错,但是您可以有多个工作者角色实例,每个实例都有许多容错任务。Windows Azure SLA仅适用于任何给定角色至少有2个实例的情况。金钱是一个伟大的动力:-)正是,正如尤金尼奥刚刚指出的。这个想法是在一个主WorkerRole中运行WorkerRoles A、B和C,并放置至少两个实例。然后,我们也得到了Azure的好处:PYou仍然必须在主角色中提供调度和容错,以确保,例如,如果内部角色A有一个由某个数据场景触发的错误,它不会消耗/删除主角色。在这种情况下,拥有多个实例是没有帮助的,因为可能两个实例都使用相同的源数据,这将在所有实例中触发相同的错误