【问题标题】:Burst Mode of Request with EventHub and Async使用 EventHub 和 Async 的突发请求模式
【发布时间】:2015-09-09 09:33:43
【问题描述】:

我正在尝试将音频文件 (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 条消息/秒

我应该切换到多线程模型而不是使用异步。发现类似这样的问题Is async HttpClient from .Net 4.5 a bad choice for intensive load applications?

【问题讨论】:

  • Parallel.Invoke 是多线程的... ??
  • 不,不是那样,
  • 请阅读the documentation on Parallel.Invoke可能并行执行每个提供的操作。
  • 哈哈,可能是....实际上我正在尝试在 eventthub 上发送麦克风数据。当麦克风被激活时,我不是在等待它写入​​文件,而是自定义实现的 writeasync 并在我得到它们后立即发送字节。
  • 只有我试图避免写入一次又一次转换为字节。是的,事件中心也有 64K 大小限制

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


【解决方案1】:

你被 azure eventthub 限制了。计算总入口和出口并选择所需的吞吐量。

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

【讨论】:

    【解决方案2】:

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2012-09-17
      • 2020-10-24
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      相关资源
      最近更新 更多