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

问题描述 投票:0回答:1

有一个在Edge IoT设备上运行的publisherconsumer自定义模块。无论publisher模块处理与否,consumer模块都会以恒定速率生成消息。 consumer模块将消息POST到外部服务,并且假设没有Internet连接,consumer模块想要重新排列消息,以免丢失并再次尝试。

我不喜欢写一个无限循环来继续重试;此外,如果重新启动模块,则消息将丢失。所以我更喜欢将消息重新排队到edgeHub / RocksDB。

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

if message.processed():
    return IoTHubMessageDispositionResult.ACCEPTED
else:
    return IoTHubMessageDispositionResult.??
azure-iot-hub azure-iot-sdk
1个回答
1
投票

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

如果没有与IotHub的连接,edgeHub将在edgeDevice上本地存储消息。一旦再次建立连接,它将自动开始发送这些消息(按正确的顺序)。

您可以配置edgeHub缓冲消息的时间长度如下:

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

如果您不配置任何内容,7200秒(2小时)也是默认值。

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

"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"
}

将HostStoragePath和ModuleStoragePath替换为所需的值。例:

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

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

更新:

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

class IoTHubMessageDispositionResult(Enum):
    ACCEPTED = 0
    REJECTED = 1
    ABANDONED = 2

更新2:

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

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

REJECTED消息不会再次添加到消息队列中。

© www.soinside.com 2019 - 2024. All rights reserved.