azure - 使用 Azure IoT SDK 中的 ServiceClient.GetFeedbackReceiver() 获取 ACK 消息

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

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

我有两个 IEventProcessor 实例,用于处理来自 IoT HUB 的消息 - 一个用于冷路径,另一个用于热路径。 如果需要更多数据,每个事件处理器可以向设备发送消息。

我需要处理来 self 向其发送消息的设备的 ACK。所以我有一个像这样的“ stub 代码”:

        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) 是完全随机的!
  • 两个事件处理器都是分开的,因此我不能将收到的 ACK 从一个事件处理器传递到另一个事件处理器;

我需要什么:

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

最佳答案

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

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

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

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

备注:

  • 请务必为一个 IoT 中心仅运行一个反馈接收器实例 (ServiceClient.GetFeedbackReceiver() + ReceiveAsync)。这保证了所有 ACK 都将以确定的方式收到。

关于azure - 使用 Azure IoT SDK 中的 ServiceClient.GetFeedbackReceiver() 获取 ACK 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34993386/

相关文章:

c# - 在 Azure 中锁定模拟

c# - Windows Azure 云服务 - 访问已部署的 xml 文件被拒绝

azure - SQL Azure 分发大量读取查询以进行报告

c# - 将长时间运行的任务从 MVC Web App 迁移到 WebJob 引用相同的项目和代码重用

powershell - 如何为 Azure RM 订阅设置默认存储帐户

sql-server - 将 Excel 数据从 Azure Data Lake 加载到 Azure SQL 的理想方法

Azure Key Vault - 异地复制?

asp.net-web-api - VSTS 版本定义中的通配符

Azure WebJobs - 基于用户的单例 WebJob

azure - 在 Azure 数据工厂数据流表达式生成器中使用 contains 函数