使用EventHub和Async的突发模式请求

时间:2015-09-09 09:33:43

标签: c# async-await iot azure-eventhub

我正在尝试将wav设备中的音频文件(IoT)发送到Eventhub。由于Eventhub每条消息的大小限制为64Kb,因此每条消息都会分块为7kb字节数组并发送到Eventhub。我正在尝试从客户端实现 [未超过阈值] 的最大发送速率。

录制现场音频,将其保存在文件流中并将其分块以便发送。我通过自定义流实现避免了这部分

public class CustomAudioStream : IRandomAccessStream{
    public IAsyncOperationWithProgress<uint, uint> WriteAsync(IBuffer buffer)
        {
            return AsyncInfo.Run<uint, uint>((token, progress) =>
             {
                 return Task.Run(() =>
                 {
                     using (var memoryStream = new MemoryStream())
                     {
                         using (var outputStream = memoryStream.AsOutputStream())
                         {
                             outputStream.WriteAsync(buffer).AsTask().Wait();

                             var byteArray = memoryStream.ToArray();

                             //bytes are ready to send from here 
                             ChunkedEventSender(this, byteArray);
#if DEBUG
                             Debug.WriteLine("Array Length:  " + byteArray.Length + "    MemoryStream length:" + memoryStream.Length);
#endif 
                             return (uint)memoryStream.Length;
                         }
                     }
                 });
             });
        }
   }

但是我无法使用REST实现以相同的速度发送字节。发送我正在使用第三方包装,所以我不能在那边做。

但我可以跨越线程以使应用程序响应,同时进行交互,所以我使用

 Task.Factory.StartNew(()=>{ 
          BackgroundSender(byte[data]);
        });

我不想等待任务完成任务的结果。但是当我这样做时,我的大部分请求都是“Request Timed out”而应用程序因为这些请求而卡住了。< / p>

无论如何,我可以在不阻塞线程的情况下使应用程序响应。

编辑:当前已应用Parallel.Invoke并且没有丢失单个消息,应用程序也响应,但发送量大幅下降到2-3条消息/秒

我应该切换到多线程模型而不是使用Async。找到了这样的模拟问题Is async HttpClient from .Net 4.5 a bad choice for intensive load applications?

2 个答案:

答案 0 :(得分:0)

你被天蓝色的eventhub扼杀了。计算您的入口和出口总数,然后选择所需的吞吐量数量。

每个吞吐量单元都具有以下功能:1 MB / s Ingress,2 MB / s出口和高达84 GB的事件存储。转到服务总线命名空间中的scale选项卡,并根据需要增加吞吐量单位。 enter image description here

答案 1 :(得分:0)

“请求超时”并不一定意味着你被扼杀了我猜。我会查找detail属性并检查错误代码。如果您将50002视为错误代码,则表示您受到限制,您可以根据需要增加TU。仅供参考,单个TU每秒最多支持1000个事件。

希望这有帮助!