Azure Service Bus队列发送冻结

时间:2014-01-30 21:50:38

标签: azure load-testing azureservicebus

我们使用多个进程对Azure队列进行负载测试。我们注意到,在向队列发送消息时,所有计算机都会同时暂停。

暂停的长度不同。最常见的是半秒暂停,但是我们已经看到所有发送者暂停一整秒钟。

自从我最初发布以来,我们已经看到了使用HTTP绑定的Java客户端的相同行为。

此外,我们已经看到了影响除一个实例之外的每个实例的暂停。虽然有几个执行程序会同时停止,但其中一个将继续以相同的速率发送。

在所有情况下,暂停结束后,我们会看到所有实例都以旧费率恢复。我们在几秒钟内手动启动所有实例。

.NET代码如下所示:

using (var memoryStream = new MemoryStream())
{
    using (var streamWriter = new StreamWriter(memoryStream))
    {
        streamWriter.Write(messageText);
        streamWriter.Flush();
        memoryStream.Position = 0;

        var message = new BrokeredMessage(memoryStream, false);
        message.Properties["Name"] = "DeviceStatusProbed";
        message.Properties["MessageId"] = messageIdText;

        sender.SendAsync(message);

        if (messageNumber == 0)
        {
            stopwatch.Start();
        }

        messageNumber++;

        Console.WriteLine("MPS: " + 1000 * messageNumber / (double)stopwatch.ElapsedMilliseconds);

        Console.WriteLine("Sent message with MessageID = " + message.MessageId);
    }
}

Azure环境中造成此类冻结的潜在原因是什么?如果不是原因,是否有工具或指导可以帮助我们确定原因?

感谢。

2 个答案:

答案 0 :(得分:0)

你能提供关于“暂停”多长时间的更多信息..你看到发送电话失败吗?你看多久暂停了?

没有任何理由让你看到这种停顿。

如果在SERVICEBUS或任何Azure基础架构中进行升级,则呼叫可能会在60秒(默认)后超时或者仅失败。但重试后它应该会成功。

答案 1 :(得分:0)

当您将MemoryStream包装在using语句中时,它可能是流的问题。

由于SendAsync是异步调用的,因此在服务总线上发送之前,内存流可能已经被处理掉了。

您可以尝试删除内存流上的using语句,而是调用:

var message = new BrokeredMessage(memoryStream,ownsStream:true);