我们使用多个进程对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环境中造成此类冻结的潜在原因是什么?如果不是原因,是否有工具或指导可以帮助我们确定原因?
感谢。
答案 0 :(得分:0)
你能提供关于“暂停”多长时间的更多信息..你看到发送电话失败吗?你看多久暂停了?
没有任何理由让你看到这种停顿。
如果在SERVICEBUS或任何Azure基础架构中进行升级,则呼叫可能会在60秒(默认)后超时或者仅失败。但重试后它应该会成功。
答案 1 :(得分:0)
当您将MemoryStream包装在using语句中时,它可能是流的问题。
由于SendAsync是异步调用的,因此在服务总线上发送之前,内存流可能已经被处理掉了。
您可以尝试删除内存流上的using语句,而是调用:
var message = new BrokeredMessage(memoryStream,ownsStream:true);