将Azure队列与NServiceBus一起使用时,Bus.Send被阻塞

将Azure队列与NServiceBus一起使用时,Bus.Send被阻塞,nservicebus,azure-queues,Nservicebus,Azure Queues,我正在用Azure队列后端测试NServiceBus。我使用所有默认设置配置了NServiceBus,并使用以下代码发送消息: while ((data = Console.ReadLine()) != null) { Stopwatch sw = new Stopwatch(); sw.Start(); Bus.Send("testqueue", new Message() {Data = data}); sw.Stop(); Console.WriteLine(

我正在用Azure队列后端测试NServiceBus。我使用所有默认设置配置了NServiceBus,并使用以下代码发送消息:

while ((data = Console.ReadLine()) != null)
{
   Stopwatch sw = new Stopwatch();
   sw.Start();
   Bus.Send("testqueue", new Message() {Data = data});
   sw.Stop();
   Console.WriteLine("Sent time: " + sw.ElapsedMilliseconds);
}
在我的开发人员机器上运行时,需要约700毫秒才能将消息发送到队列。队列很遥远,直接使用Azure存储客户端写入时约350毫秒

现在我有两个问题:

我不希望线程在总线上阻塞。发送呼叫。一个选项是使用async\await模式。另一种选择是使用内存队列来传递消息,类似于0MQ。最后一个选项当然不能保证交付,但假设有一些监控功能,我可以接受。 为什么发送消息需要两倍于对队列进行简单写入的时间?这可以优化吗?
数据属性的大小是多少

我只是使用字符串作为数据自己运行了这个测试,我看到每个远程发送的平均延迟约为50毫秒,每15秒有一个节流阀,使得调用在这一点上大约需要300毫秒

请注意,azure storage是一个基于http的远程服务,因此会因距离而延迟,据我所知,它在这里也没有发布性能目标。此外,它还具有主动节流功能,可以在数据移动时向后推送数据,这大约每15秒发生一次。请查看我的存储内部对话,了解幕后发生了什么

关于异步/等待的主题。如果您的目的是解除对UI线程的阻止,那么请继续这样做

await Task.Factory.StartNew(() => _bus.Send(new Message{
       Whatever = data
})).ConfigureAwait(false);
如果您的目的是实现更高的吞吐量,那么应该使用更多的发送线程,因为线程无论如何都需要等待http响应,这是发送线程或从async/await触发的后台线程。但是,请注意,无论您使用多少发送威胁,每个队列也会以每秒数百MSG的速度被单独限制

PS:还建议更改.net servicepoint管理器上的以下设置,以针对大量小型http请求对其进行优化

ServicePointManager.UseNagleAlgorithm = false;
ServicePointManager.Expect100Continue = false;
ServicePointManager.DefaultConnectionLimit = 48;

希望这有助于……

感谢您的回复。问题不在于延迟太长。预计距离我的开发机器300毫秒。问题是没有async\Wait选项,在发送消息时必须阻止线程。我们希望在一台机器上每秒处理1000个请求。如果我们这样做,至少会有1000个线程正在旋转并等待NServiceBus的响应。执行async\wait时,线程将在等待期间释放。否则,线程只是处于等待状态并阻塞。这是团队的雷达上提供的,但现在我建议您使用多个发送线程,例如,通过并行包装发送,并使用多个队列,顺便说一句,无论使用多少线程,您都无法通过单个队列一致地填充数千条消息