iotedge:如何重新排队无法处理的消息

时间:2019-02-14 10:52:23

标签: azure-iot-hub azure-iot-sdk

Edge IoT设备上正在运行publisherconsumer自定义模块。无论publisher模块是否处理消息,consumer模块始终以恒定的速率生成消息。 consumer模块将消息发布到外部服务,并且由于没有Internet连接,因此consumer模块希望重新排列消息,以免丢失并再次尝试。

我不想编写无限循环来保持重试;同样,如果模块重新启动,该消息也会丢失。所以我更喜欢将消息重新排队到edgeHub / RocksDB。

在哪里可以找到有关可以为IoTHubMessageDispositionResult提供的可用响应的文档?如果需要重新排队消息,发送的响应是什么?

if message.processed():
    return IoTHubMessageDispositionResult.ACCEPTED
else:
    return IoTHubMessageDispositionResult.??

1 个答案:

答案 0 :(得分:1)

您不必实现自己的消息重新排队。 IotEdge提供了此blog post和此documentation page中所述的离线功能。

如果没有与IotHub的连接,edgeHub将在本地将消息存储在edgeDevice上。重新建立连接后,它将自动开始以正确的顺序发送这些消息。

您可以配置edgeHub将这样的消息缓冲多长时间:

some_sub(\@myarray);

如果您未进行任何配置,则默认设置为7200秒(2小时)。

默认情况下,消息将被写入edgeHub docker容器内的文件夹中。如果要将它们存储在其他位置,则可以使用以下配置:

"$edgeHub": {
    "properties.desired": {
        "schemaVersion": "1.0",
        "routes": {},
        "storeAndForwardConfiguration": {
            "timeToLiveSecs": 7200
        }
    }
}

用所需的值替换 HostStoragePath ModuleStoragePath 。示例:

"edgeHub": {
    "type": "docker",
    "settings": {
        "image": "mcr.microsoft.com/azureiotedge-hub:1.0",
        "createOptions": {
            "HostConfig": {
                "Binds": ["<HostStoragePath>:<ModuleStoragePath>"],
                "PortBindings": {
                    "8883/tcp": [{"HostPort":"8883"}],
                    "443/tcp": [{"HostPort":"443"}],
                    "5671/tcp": [{"HostPort":"5671"}]
                }
            }
        }
    },
    "env": {
        "storageFolder": {
            "value": "<ModuleStoragePath>"
        }
    },
    "status": "running",
    "restartPolicy": "always"
}

请注意,您可能必须手动授予iotEdge用户(或所有用户)对该文件夹的访问权限(使用chmod)。

更新

如果您只是在寻找 IoTHubMessageDispositionResult 的可用值,则会找到答案here

"createOptions": {
                "HostConfig": {
                  "Binds": [
                    "/etc/iotedge/storage/:/iotedge/storage/"
                  ],
                  ...
                }
              }
            },
            "env": {
              "storageFolder": {
                "value": "/iotedge/storage/"
              },
              ...

更新2:

已接受的邮件已从邮件队列中删除,因为它们已成功传递。

已被已取消的消息再次添加到消息队列中,模块将尝试按照retryPolicy中的定义再次发送。有关retryPolicy的更多信息,您可以阅读此thread

拒绝的邮件不会再次添加到邮件队列中。