2

我刚刚针对我的 Azure 代码运行了 Visual Studio 2010 线程分析器,并注意到我遇到了很多争用。我的代码被阻塞的频率比它运行的频率高!

我的工人根本没有自定义线程逻辑。这是一个简单的 While 循环,它询问各种队列是否有工作。我创建了 QueueRepositoryClass 的实例,然后调用 GetQueueMessage 函数。

看起来由于某种原因,多个线程正在访问我的 GetQueueMessage 方法并使用相同的 queueClient 实例。也许是我使用 CloudStorageAccount 对象的结果?还是 CreateCloudQueueClient 扩展方法?

4

2 回答 2

3

在没有看到调用代码的情况下,这部分是推测,但看起来您正在一个相当紧凑的循环中调用 GetMessage()。GetMessage 是一个同步调用,这样做会使该特定线程在等待来自队列的响应时自行阻塞(其他线程继续运行)。在分析器中,这看起来真的很糟糕,因为循环逻辑的其余部分执行得如此之快(即您花费一到两毫秒执行代码和 50 毫秒来获取消息,看起来就像那样)。

另一个注意事项,出于以下几个原因,您需要非常小心地在紧密循环中查询队列:

1) 虽然每次 Tx 的费用很小,但它不是 0。我通常建议一些退避逻辑 - 即如果队列为空,请等待 100 毫秒后再检查。清空两次,回退到 500 毫秒,等等。显然,您必须平衡您想要的用户体验。

2) 如果您最终扩展应用程序 - 您有效地创建了针对队列的 DoS 攻击。100 个实例都在一个紧密的循环中冲击队列真的会损害性能。

于 2010-07-27T18:42:07.143 回答
0

我转而使用 Async QueueClient 方法,现在整个系统的性能要好得多。

于 2010-07-27T23:24:15.733 回答