本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
批处理 HTTP 操作消息
您可以使用批处理在单个请求中发送多个 HTTP 操作消息。
概述
批处理使您可以将消息从Amazon IoT Core规则引擎批量发送到您的 HTTP 终端节点。此功能可通过降低 HTTP 操作执行次数来帮助您降低成本,并通过减少与建立新连接相关的开销来提高效率。
注意
批处理的 HTTP 操作按单个操作计量。根据Amazon IoT Core规则引擎向下游服务发射的出站批处理有效载荷的大小,以 5 KiB 为增量进行计量。有关更多信息,请参阅 Amazon IoT Core 价格页面
当您在物联网规则操作的定义中启用批处理时,将可以使用以下参数进行配置:
重要
当您指定多个批处理参数时,批处理将在达到第一个限制时完成。例如,如果您将 100 毫秒指定为最大批处理打开时间,将 5 KiB 指定为最大批处理大小,而规则引擎在 100 毫秒内仅批处理 2 KiB,则将创建并发送 2 KiB 的批处理。
批量使用 HTTP 标头
当您在 HTTP 操作中使用标头时,批处理请求会使用最后一条添加到批处理中的消息(不一定是您发布的最后一条消息)中的标头值。我们建议使用以下任一标题值:
-
批次中的所有消息都相同
-
适用于所有消息(例如,身份验证凭据)
标头与 HTTP 请求一起发送,不是消息正文的一部分。
注意
启用批处理后:
批处理请求会自动包含
Content-Type: application/json标头,因为批处理是作为 JSON 数组发送的。我们无法保证批次中的最后一条消息是您发布的最后一条消息。这是进入批次的最后一条消息。
有效载荷示例
以下示例显示了发送到您的 HTTP 终端节点的批量消息负载的结构:
[ { "user_id": "user1", "steps_today": 1000 }, { "user_id": "user2", "steps_today": 21000 }, { "user_id": "user8", "steps_today": 1500 }, ... ]
限制
以下是批处理的限制:
Amazon IoT Core不能保证消息的整体顺序。批处理是在每台主机上本地执行的,这可能会导致批处理中的消息的顺序与接收顺序不同。
Amazon IoT Core不在接收方提供消息处理支持。您有责任确保将下游服务配置为批量接受和处理数据。
不支持跨账户批处理,即使消息的目的地是相同的资源标识符(HTTP URL 或资源 ARN)。
Amazon IoT Core不能保证批量大小符合您指定的配置。根据时间和消息流,批次可能会小于您配置的限制。
启用批处理后,不支持二进制负载(非 UTF-8 数据)。只接受 UTF-8 文本负载(例如 JSON)。要发送二进制数据,请先对其进行base64编码,然后再将其发送到 HTTP 操作,然后在接收端点对其进行解码。例如,您可以使用物联网规则中的编码功能对二进制有效负载进行编码。或者,您可以对物联网设备中的二进制有效负载进行编码并将其发布到。Amazon IoT Core
批处理的错误操作
您将无法在错误操作定义中定义单独的批处理逻辑。但是,如果您在主操作中定义了批处理逻辑,则您的错误操作将支持批处理。
当批量请求失败时,Amazon IoT Core规则引擎将遵循 HTTP 操作重试逻辑。在最后一次重试尝试之后,将对每条消息调用错误操作。
以下是启用批处理时的错误操作消息示例:
{ "ruleName": "FailedTopicRule", "topic": "topic/rulesengine", "payloadsWithMetadata": [ { "id": 1, "cloudwatchTraceId": "bebd6d93-6d4a-899e-9e40-56e82252d2be", "clientId": "Test", "sourceIp": "10.0.0.0", "base64OriginalPayload": "eyJ1c2VyX2lkIjogInVzZXI1NjQ3IiwgInN0ZXBzX3RvZGF5IjogMTMzNjUsICJ0aW1lc3RhbXAiOiAiMjAyNS0xMC0wOVQwNzoyMjo1OC45ODQ3OTAxNzZaIn0=" }, { "id": 2, "cloudwatchTraceId": "af94d3b8-0b18-1dbf-2c7d-513f5cb9e2e1", "clientId": "Test", "sourceIp": "10.0.0.0", "base64OriginalPayload": "eyJ1c2VyX2lkIjogInVzZXI1NjQ3IiwgInN0ZXBzX3RvZGF5IjogMTMzNjUsICJ0aW1lc3RhbXAiOiAiMjAyNS0xMC0wOVQwNzoyMjo1OC45ODQ3OTAxNzZaIn0=" }, { "id": 3, "cloudwatchTraceId": "ca441266-c2ce-c916-6aee-b9e5c7831675", "clientId": "Test", "sourceIp": "10.0.0.0", "base64OriginalPayload": "eyJ1c2VyX2lkIjogInVzZXI1NjQ3IiwgInN0ZXBzX3RvZGF5IjogMTMzNjUsICJ0aW1lc3RhbXAiOiAiMjAyNS0xMC0wOVQwNzoyMjo1OC45ODQ3OTAxNzZaIn0=" } ], "failures": [ { "affectedIds": [ 1, 2, 3 ], "failedAction": "HttpAction", "failedResource": "https://example.foobar.com/HttpAction", "errorMessage": "HttpAction failed to make a request to the specified endpoint. StatusCode: 500. Reason: Internal Server Error." }, { "affectedIds": [ 3 ], "failedAction": "S3Action", "failedResource": "amzn-s3-demo-bucket", "errorMessage": "Failed to put S3 object. The error received was The specified bucket does not exist" }, { "affectedIds": [ 3 ], "failedAction": "LambdaAction", "failedResource": "arn:aws:lambda:us-west-2:123456789012:function:dummy", "errorMessage": "Failed to invoke lambda function. Received Server error from Lambda. The error code is 403" } ] }
注意
批量操作失败还会生成更大的错误操作有效负载,这可能会增加由于大小而导致错误操作失败的概率。您可以使用该ErrorActionFailure指标监控错误操作失败。请参阅规则操作指标了解更多信息。
使用批处理 HTTP 操作消息 Amazon CLI
使用批处理创建或更新规则操作
-
使用相应的Amazon CLI命令创建或更新规则:
-
要创建新规则,请使用以下create-topic-rule命令:
aws iot create-topic-rule --rule-namemyrule--topic-rule-payload file://myrule.json -
要更新现有规则,请使用以下replace-topic-rule命令:
aws iot replace-topic-rule --rule-namemyrule--topic-rule-payload file://myrule.json
-
-
通过在主题规则负载中将 enableBatching 参数设置为 true 来启用批处理功能:
{ "topicRulePayload": { "sql": "SELECT * FROM 'some/topic'", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "http": { "url": "https://www.example.com/subpath", "confirmationUrl": "https://www.example.com", "headers": [ { "key": "static_header_key", "value": "static_header_value" }, { "key": "substitutable_header_key", "value": "${value_from_payload}" } ], "enableBatching": true, "batchConfig": { "maxBatchOpenMs":100, "maxBatchSize":5, "maxBatchSizeBytes":1024} } } ] } -
配置批处理参数。您无需指定所有批处理参数。您可以选择指定 1、2 或全部 3 个批处理参数。如果您未指定批处理参数,则规则引擎将使用默认值更新该参数。有关批处理参数及其默认值的更多信息,请参阅 HTTP 参数。