2

我正在尝试将音频文件(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”,并且由于这些请求,应用程序被卡住了。

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


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

我应该切换到多线程模型而不是使用异步。发现类似这样的类似问题.Net 4.5 中的异步 HttpClient 对于密集负载应用程序来说是一个糟糕的选择吗?

4

2 回答 2

0

你被 azure eventthub 扼杀了。计算您的总入口和出口并选择所需的吞吐量数量。

每个吞吐量单元具有以下功能:1 MB/s 入口、2 MB/s 出口和高达 84 GB 的事件存储。转到服务总线命名空间中的缩放选项卡,并根据需要增加吞吐量单位。 在此处输入图像描述

于 2015-11-05T18:30:25.757 回答
0

我猜“请求超时”并不一定意味着您受到限制。我会查找 detail 属性并检查错误代码。如果您看到 50002 作为错误代码,那么这意味着您受到限制,您可能会根据需要增加 TU。仅供参考,单个 TU 每秒最多支持 1000 个事件。

希望这可以帮助!

于 2015-12-08T18:44:31.913 回答