2017-04-20 54 views
1

如何在Azure应用服务的多个横向扩展实例上分发任务?在扩展Azure应用服务时分发工作

任务将从一个队列中读取数据,每个队列聚合一分钟,然后将结果写入Blob存储区。

我的任务目标是这些:

  • 应该只有在任何时候每个队列一个任务运行。
  • 在所有实例中均匀分配任务
  • 如果有一个实例出现故障,那么所有在那里运行的任务都将在另一个正在运行的实例上启动。
  • 一旦实例返回,实例将被均匀分发。

我主要关心的不是工作负载性能,而是响应性/正常运行时间。 单个实例可以托管所有任务,但如果该实例重新启动,则会导致不需要的停机时间。

回答

1

根据我对您的要求的理解,我认为您不希望每个队列都运行一个任务。如果你的任务失败了,这会引入一个失败点。

相反,请考虑使用连续的WebJobs。您可以将所有WebJobs放在应用程序服务计划中的单个Web App上,然后将Web App扩展为两个或更多实例。因此,如果您有WebJobs A,B和C监控队列1,2和3,然后创建第二个Web应用程序实例,您将拥有WebJobs A1和A2监控队列1.如果出现故障,另一个出现故障在另一个实例正在恢复时松弛。

此外,如果您要求至少传递一次消息并且不超过一次,我建议使用服务总线队列。查看WebJobs的ServiceBusTrigger。请注意,当特定WebJob实例将服务总线队列消息出队时,该消息将被锁定,以便不会处理两次。

为了减少响应时间(如果您的队列备份),您可以添加更多Web App实例。您还可以将Web App的自动缩放比例设置为取决于队列长度,因此您可以根据队列是否开始备份来自动放大和缩小。

+0

我打算使用服务总线队列,仍然阅读它。 我的想法是偷看5分钟,将它们聚合并将其存储在一个blob中。然后在队列中标记这些项目已完成。如果进程崩溃,下一个会重新启动,重新启动的工作量将可以接受。问题/目标不是大数据,而是实时数据。 – hultqvist

+0

我可能会实时处理这些消息。服务总线队列可以以两种模式工作:查看并锁定或接收和删除。如果您使用Peek&Lock,则Peek操作会使消息在给定时段内不可见。成功处理邮件后,您将明确从队列中删除邮件。这样,如果您的WebJob在处理过程中崩溃,则锁定过期并且消息变为可见再次处理。 –

+0

@hultqvist,我原来的答案有错误。对于使用服务总线触发器,Webjob类型应该是连续的。我已经相应地更新了我的答案。 –

相关问题