我很遗憾地定期使用内部版本的Service Bus来实现非常低的吞吐量。
正常情况下,发送消息大约需要10毫秒或更短时间,但是发送消息可能需要20秒或更长时间。这持续了2-3分钟,一段时间后消息超时或者服务总线设法处理所有消息的峰值。通过查看下面的Incomming消息性能计数器可以看到这一点。
系统在另一台计算机上运行带有SQL Server 2012的Service Bus 1.1。硬件为Intel Q6600 2.40GHz,4GB RAM和7200rpm磁盘,因此通常可以用于大多数测试目的。
我已经从我的应用程序中分离出一些代码来重现问题。
static void Main(string[] args)
{
var connectionString = ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"];
var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
namespaceManager.DeleteTopic("TestTopic");
namespaceManager.CreateTopic("TestTopic");
namespaceManager.CreateSubscription("TestTopic", "TestSubScription");
var topicClient = TopicClient.CreateFromConnectionString(connectionString, "TestTopic");
var msgCounter = 0;
var cts = new CancellationTokenSource();
Task.Run(() =>
{
while (!cts.IsCancellationRequested)
{
Task.Run(() =>
{
try
{
Interlocked.Increment(ref msgCounter);
var msg = new BrokeredMessage("Body");
msg.Properties["MyIntProperty"] = 123;
msg.Properties["MyStringProperty"] = "Hello SB";
var sw = Stopwatch.StartNew();
topicClient.Send(msg);
sw.Stop();
Trace.WriteLine(string.Format("Message {0} send duration {1}", msgCounter, sw.ElapsedMilliseconds));
}
catch (Exception e)
{
Trace.WriteLine("Exception: " + e);
}
}, cts.Token);
Thread.Sleep(20);
}
}, cts.Token);
Console.ReadLine();
cts.Cancel();
}
可以看出,这是一个非常低的消息频率,大约30个消息/秒,所以我不明白服务总线如何解决这种低吞吐量。当我将延迟时间延长到50毫秒时,问题仍然存在。
希望有人能够对此有所了解,或提供有关如何继续进行故障排除的见解。