【问题标题】:Using ServiceClient.GetFeedbackReceiver() from Azure IoT SDK to get ACK messages使用 Azure IoT SDK 中的 ServiceClient.GetFeedbackReceiver() 获取 ACK 消息
【发布时间】:2016-01-25 13:05:55
【问题描述】:

我正在寻找使用 ServiceClient.GetFeedbackReceiver() 接收来自具有 Azure IoT SDK 的设备的确认的良好做法。

我有两个 IEventProcessor 实例来处理来自 IoT HUB 的消息 - 一个用于冷路径,另一个用于热路径。 如果需要更多数据,每个 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);
        }

问题是:

  • 当我在两个 EventProcessors(热和冷)中运行此代码时,我得到反馈响应 (ack) 是完全随机的!
  • 两个 EventProcessor 是分开的,所以我不能只将收到的 ACK 从一个传递到另一个;

我需要什么:

  • 我需要 ACK 来返回消息来源的 EventProcessor
  • 或解决问题的其他常见、良好实践、规范的解决方案;

【问题讨论】:

    标签: azure azure-web-roles azure-webjobs windowsiot azure-iot-hub


    【解决方案1】:

    没有人发布更好的答案,所以我将分享我的解决方案。

    免责声明:我仍然不知道这是否是最佳解决方案。

    我创建了第三个(新的、独立的)事件处理器 (IEventProcessor),始终作为一个实例运行,它处理来自所有设备的所有 ACK 反馈。

    所以整体解决方案基于三个事件处理器(两个接收正常消息用于冷热路径,第三个用于 ACK)。所有这些(除了特定的逻辑)都将接收到的消息转换为域事件并放入事件中心。我系统中的其他组件监视此 Hub 并处理域逻辑。

    备注:

    • 为一个 IoT 中心只运行一个反馈接收器实例 (ServiceClient.GetFeedbackReceiver() + ReceiveAsync) 很重要。这保证了所有 ACK 都将以确定性的方式接收。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      相关资源
      最近更新 更多