0

我们正在开展一个项目,该项目需要在设备之间交换大量消息/命令。

我们使用 Cloud Service Worker 角色来处理命令并使用 Cloud to Device Direct 方法发送到相关设备。

Worker 角色配置为 A2V2-2 Core,4 GB RAM。worker 角色容量没有问题。CPU 和内存都在控制之中。

对于较少的消息/命令处理其工作正常(例如 500 条消息)。但是当没有消息增加时,我们将面临性能问题(例如 1000 条消息)。我们的目标是 <5 秒延迟。当我们尝试登录 Worker Role VM 并发现 TCP 连接的数量不断增加,并且在向设备发送消息/命令时导致速度变慢。

我们使用以下代码行使用直接方法发送消息。在每次直接方法调用后寻找更好的方法来处理服务客户端对象。

 var methodInvocation = new CloudToDeviceMethod(methodInfo.MethodName) { ResponseTimeout = TimeSpan.FromSeconds(methodInfo.ResponseTimeout) };
            //set the payload
            methodInvocation.SetPayloadJson(methodInfo.Payload);

            //invokes direct method
             var response = _serviceClient.InvokeDeviceMethodAsync(methodInfo.DeviceId, methodInvocation);

            if (_serviceClient != null)
            {
                //closes the service client connection
                _serviceClient.CloseAsync();
                _serviceClient.Dispose();
            }
4

1 回答 1

0

最后我们找到了解决方案。Azure Service Client 对象没有正确关闭和释放。我们在直接方法调用成功后显式关闭和释放了 Service Client 对象。

  //closes the service client connection
  await _serviceClient.InvokeDeviceMethodAsync(methodInfo.DeviceId, methodInvocation);
 _serviceClient.CloseAsync().Wait();
 _serviceClient.Dispose();
于 2018-08-16T19:48:17.280 回答