デバイス間で大量のメッセージ/コマンドを交換する必要がある 1 つのプロジェクトに取り組んでいます。
コマンドを処理するために Cloud Service Worker ロールを使用し、Cloud to Device Direct Method を使用して関連するデバイスに送信します。
worker ロールの構成は A2V2-2 Core で 4 GB の RAM を搭載しています。worker ロールの容量に問題はありません。CPU とメモリはすべて制御されています。
メッセージ/コマンド処理の数が少ない場合 (例: 500 メッセージ)。しかし、メッセージ数が増えると、パフォーマンスの問題に直面します (例: 1000 メッセージ)。5 秒未満のレイテンシーを目標にしています。Worker ロールにログインしようとするとVM を調べたところ、TCP 接続の数が増加し続け、メッセージ/コマンドをデバイスに送信するときに速度が低下することがわかりました。
次のコード行は、ダイレクト メソッドを使用してメッセージを送信するために使用しています。各ダイレクト メソッド呼び出しの後に Service クライアント オブジェクトを破棄するより良い方法を探しています。
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();
}