如果线程正忙于等待,如何使 Azure 辅助角色缩放?

How do I make an Azure worker role scale if the thread is busy waiting?

我希望下面能解释我的问题。

我有一个工作者角色,它在 while(true) 循环中 运行ning。该工作人员正在从队列中取出消息并进行处理。它永远不会结束,只是不断地检查队列和处理消息。

在我收到一条消息要求我做一些需要时间的事情之前,这一直有效。一个示例可能是从服务请求信息。假设我们假设这个请求需要 10 秒。现在我的工作者角色在我的 while 循环中间等待这个响应。同时消息队列正在填满。

我想要的是一个可以阻止或减轻这种情况发生的解决方案。

我目前的现实世界解决方案是我有一个工作者角色,它使用任务并行库创建多个消息处理器,这些消息处理器 运行 并行并从队列中获取。但是如果我的消息处理器的所有线程 运行 都卡住等待服务,这个问题仍然可能发生。

我知道我应该对服务使用异步请求,但在其他示例中异步也无济于事。不想细说了。

所以我现在的计划是修改我当前的架构并创建一个消息处理服务。所以我将使用当前解决方案中的消息队列,并且只使用工作者角色将工作委托给我的 Web 服务(异步)。

这个辅助角色现在不会出现线程卡在等待中的情况。

但我对此并不满意。如果我使用任务并行库创建多个队列处理器的工作者角色不够快怎么办?我认为 CPU 甚至不会有压力,因为速度减慢将出现在检索消息并将其发送到 Web 服务时,两者都不是 CPU 密集的。

所以我需要更多的队列处理器,这些处理器必须根据队列的繁忙程度生成队列处理器的实例来创建。所以当队列中有很多项目时,Azure会创建一个新实例来帮助我处理它们。

我对这个解决方案没有信心。我觉得这应该更容易。为什么我现在要创建一个 Web 服务来使用从工作者角色发送的消息,而工作者角色又根据我的消息队列进行缩放。

我的解决方案是否有意义或是否有替代方案?

看看你需要扩展的原因

Hypothetically let us say this request takes 10 seconds. Now my worker role is in the middle of my while loop waiting for this response. Meanwhile the message queue is filling up.

问题不在于工作人员花费很长时间,而是 队列 得到备份 - 这正是 Azure 提供包括队列大小的缩放选项的原因。

此外,如果您的服务 CPU 密集,那么横向扩展只会将问题传播到多个实例上 - 遇到相同的瓶颈只是时间问题。

最终,您需要决定多长时间是太长,然后确定队列是否会在更多帮助(向外扩展)或更多力量(向上扩展)或两者结合的情况下处理得更快。