1

ServiceClient.GetFeedbackReceiver()Azure IoT SDK を使用してデバイスから確認応答を受信するために使用するための良い方法を探しています。

IoT HUB からのメッセージを処理するインスタンスが 2 つありますIEventProcessor。1 つはコールド パス用で、もう 1 つはホット パス用です。さらにデータが必要な場合、各 EventProcessor はデバイスにメッセージを送信できます。

メッセージを送信したデバイスからの ACK を処理する必要があります。したがって、次のような「スタブコード」があります。

        var sc = ServiceClient.CreateFromConnectionString(connectionString);
        var fr = sc.GetFeedbackReceiver();

        while (true)
        {
            var feedbackBatch = await fr.ReceiveAsync();
            if (feedbackBatch == null) continue;

            var myName = GetType().Name;
            Console.WriteLine(myName +": ack list: {0}", string.Join(", ", feedbackBatch.Records.Select(f => f.StatusCode + " for " + f.OriginalMessageId + ";")));

            await fr.CompleteAsync(feedbackBatch);
        }

問題は:

  • このコードを両方の EventProcessor (ホットとコールド) で実行すると、フィードバック応答 (ack) が得られるのは完全にランダムです!
  • 両方の EventProcessor が分離されているため、受信した ACK を一方から他方に渡すことはできません。

必要なもの:

  • メッセージの発信元である EventProcessor に戻るには ACK が必要です
  • または、問題を解決するためのその他の一般的で優れた慣行、標準的な解決策。
4

1 に答える 1

2

誰もより良い答えを投稿していないので、私の解決策と共有します。

免責事項:それが最善の解決策であるかどうかはまだわかりません。

すべてのデバイスからのすべての ACK フィードバックを処理する、常に 1 つのインスタンスとして実行される 3 つ目の (新しい別の) イベント プロセッサ ( IEventProcessor)を作成しました。

したがって、全体的なソリューションは 3 つのイベント プロセッサに基づいています (2 つはコールド パスとホット パスの通常のメッセージを受信し、3 つ目は ACK を受信します)。それらのすべて (特定のロジックを除く) は、受信したメッセージをドメイン イベントに変換し、イベント ハブに配置します。私のシステムの他のコンポーネントは、このハブを監視し、ドメイン ロジックを処理します。

備考:

  • 1 つの IoT Hub に対してフィードバック レシーバー ( ServiceClient.GetFeedbackReceiver()+ ) のインスタンスを 1 つだけ実行することが重要です。ReceiveAsyncこれにより、すべての ACK が確定的に受信されることが保証されます。
于 2016-03-01T09:50:13.957 に答える