View a markdown version of this page

Traitement par lots de messages d’action HTTP - AWS IoT Core

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Traitement par lots de messages d’action HTTP

Vous pouvez utiliser le traitement par lots pour envoyer plusieurs messages d'action HTTP en une seule demande.

Vue d’ensemble

Le traitement par lots vous permet d'envoyer des messages depuis AWS IoT Core Rules Engine vers vos points de terminaison HTTP par lots. Cette fonctionnalité peut vous aider à réduire vos coûts en diminuant le nombre d'exécutions d'actions HTTP et à améliorer l'efficacité en réduisant les frais liés à l'établissement de nouvelles connexions.

Note

L'action HTTP groupée est mesurée comme une seule action. Vous êtes mesuré par incréments de 5 Ko, en fonction de la taille de la charge utile sortante par lots émise par le moteur de AWS IoT Core règles vers le service en aval. Pour plus d'informations, consultez la page de tarification AWS IoT Core.

Lorsque vous activez le traitement par lots dans la définition de votre action de règle IoT, les paramètres suivants sont disponibles pour la configuration :

maxBatchOpenMs

Durée maximale (en millisecondes) pendant laquelle un message sortant attend que d'autres messages soient créés par lot. Plus le paramètre est élevé, plus la latence de l'action HTTP par lots est longue.

Valeur minimale : 5 ms. Valeur maximale : 200 ms.

Valeur par défaut : 20 ms

Prend en charge les modèles de substitution : Non

maxBatchSize

Le nombre maximum de messages regroupés par lots lors de l'exécution d'une seule action de règle IoT.

Valeur minimale : 2 messages. Valeur maximale : 10 messages

Valeur par défaut : 10 messages

Prend en charge les modèles de substitution : Non

maxBatchSizeBytes

Taille maximale d'un lot de messages, en octets.

Valeur minimale : 100 octets. Valeur maximale : 131 072 octets

Valeur par défaut : 5120 octets

Prend en charge les modèles de substitution : Non

batchAcrossTopics

Autoriser ou non le regroupement de messages provenant de différents sujets MQTT en une seule requête HTTP. Par défaut, seuls les messages d'un même sujet sont regroupés par lots. Activez ce paramètre pour les cas d'utilisation de routage dans lesquels des messages provenant de sujets de plusieurs appareils sont destinés au même point de terminaison HTTP.

Valeur par défaut : false

Prend en charge les modèles de substitution : Non

Important

Lorsque vous spécifiez plusieurs paramètres de lot, le traitement par lots se termine lorsque la première limite est atteinte. Par exemple, si vous spécifiez 100 ms comme durée d'ouverture maximale du lot et 5 Ko comme taille de lot maximale, et que le moteur de règles ne traite que 2 Ko en 100 ms, un lot de 2 Ko sera créé et envoyé.

Note

Les messages sont toujours groupés dans le cadre du même compte, du même nom de règle, de l’URL du point de terminaison HTTP cible et du même groupe de facturation. Les messages dont l'un de ces attributs diffère ne sont jamais combinés dans le même lot, quel que soit le batchAcrossTopics paramètre.

Utilisation d'en-têtes HTTP dans un lot

Lorsque vous utilisez des en-têtes dans votre action HTTP, la demande par lots utilise la valeur d'en-tête du dernier message ajouté au lot (pas nécessairement le dernier message que vous avez publié). Nous vous recommandons d'utiliser des valeurs d'en-tête qui sont les suivantes :

  • Identique pour tous les messages du lot

  • Applicable à tous les messages (par exemple, les informations d'authentification)

Les en-têtes sont envoyés avec la requête HTTP et ne font pas partie du corps du message.

Note

Lorsque le traitement par lots est activé :

  • La demande groupée inclut automatiquement l'Content-Type: application/jsonen-tête, car le lot est envoyé sous forme de tableau JSON.

  • Nous ne pouvons pas garantir que le dernier message du lot soit le dernier message que vous avez publié. Il s'agit du dernier message qui a été ajouté au lot.

Exemple de charge utile

L'exemple suivant montre la structure d'une charge utile de messages groupés envoyée à votre point de terminaison HTTP :

[ { "user_id": "user1", "steps_today": 1000 }, { "user_id": "user2", "steps_today": 21000 }, { "user_id": "user8", "steps_today": 1500 }, ... ]

Limitations

Les limites du traitement par lots sont les suivantes :

  • AWS IoT Core ne garantit pas l'ordre général des messages. Le traitement par lots est effectué localement sur chaque hôte, ce qui peut entraîner le traitement des messages d'un lot dans un ordre différent de celui dans lequel ils ont été reçus.

  • AWS IoT Core ne fournit pas de support pour le traitement des messages côté récepteur. Il vous incombe de vous assurer que votre service en aval est configuré pour accepter et traiter les données par lots.

  • Cross-account le traitement par lots n'est pas pris en charge, même si les messages sont destinés au même identifiant de ressource (URL HTTP ou ARN de ressource).

  • AWS IoT Core ne garantit pas que la taille du lot correspondra à la configuration que vous avez spécifiée. Les lots peuvent être inférieurs aux limites que vous avez configurées en fonction du calendrier et du flux de messages.

  • Lorsque le traitement par lots est activé, les charges utiles binaires (autres que les UTF-8 données) ne sont pas prises en charge. Seules les charges utiles de UTF-8 texte (telles que JSON) sont acceptées. Pour envoyer des données binaires, encodez-les en base64 avant de les envoyer à l'action HTTP, puis décodez-les sur votre point de réception. Par exemple, vous pouvez utiliser la fonction d'encodage dans les règles IoT pour coder la charge utile binaire. Vous pouvez également encoder la charge utile binaire dans votre appareil IoT et la publier sur. AWS IoT Core

Actions d'erreur pour le traitement par lots

Vous ne pourrez pas définir de logique de traitement par lots distincte dans votre définition d'action d'erreur. Cependant, votre action d'erreur prendra en charge le traitement par lots si vous avez défini une logique de traitement par lots dans votre action principale.

Lorsqu'une demande par lots échoue, le moteur AWS IoT Core Rules suit la logique de nouvelle tentative d'action HTTP. Après la dernière tentative de nouvelle tentative, une action d'erreur sera invoquée pour l'ensemble du lot ayant échoué.

Voici un exemple de message d'action d'erreur lorsque le traitement par lots est activé :

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

Lorsque cette option batchAcrossTopics est activée, le format de charge utile de l'action d'erreur change. Le topic champ passe du niveau supérieur à l'intérieur de chaque payloadsWithMetadata entrée :

{ "ruleName": "FailedTopicRule", "payloadsWithMetadata": [ { "id": 1, "topic": "topic/sensor1", "cloudwatchTraceId": "bebd6d93-6d4a-899e-9e40-56e82252d2be", "clientId": "Test", "sourceIp": "10.0.0.0", "base64OriginalPayload": "eyJ1c2VyX2lkIjogInVzZXI1NjQ3IiwgInN0ZXBzX3RvZGF5IjogMTMzNjUsICJ0aW1lc3RhbXAiOiAiMjAyNS0xMC0wOVQwNzoyMjo1OC45ODQ3OTAxNzZaIn0=" }, { "id": 2, "topic": "topic/sensor2", "cloudwatchTraceId": "af94d3b8-0b18-1dbf-2c7d-513f5cb9e2e1", "clientId": "Test", "sourceIp": "10.0.0.0", "base64OriginalPayload": "eyJ1c2VyX2lkIjogInVzZXI1NjQ3IiwgInN0ZXBzX3RvZGF5IjogMTMzNjUsICJ0aW1lc3RhbXAiOiAiMjAyNS0xMC0wOVQwNzoyMjo1OC45ODQ3OTAxNzZaIn0=" } ], "failures": [ { "affectedIds": [1, 2], "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." } ] }
Note

Les échecs d'actions par lots génèrent également des charges utiles d'actions d'erreur plus importantes, ce qui peut augmenter la probabilité d'échec des actions d'erreur en raison de leur taille. Vous pouvez surveiller les échecs des actions d'erreur à l'aide de la ErrorActionFailure métrique. Pour plus d’informations, consultez Métriques d'action de règle.

Regrouper les messages d'action HTTP avec AWS CLI

Création ou mise à jour d'une action de règle avec traitement par lots

  1. Utilisez la AWS CLI commande appropriée pour créer ou mettre à jour une règle :

  2. Activez les fonctionnalités de traitement par lots en définissant le paramètre EnableBatching sur true dans la charge utile de votre règle thématique :

    { "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, "batchAcrossTopics": true } } } ] }
  3. Configurez les paramètres de traitement par lots. Il n'est pas nécessaire de spécifier tous les paramètres du lot. Vous pouvez choisir de spécifier 1, 2, 3 ou les 4 paramètres de lot. Si vous ne spécifiez aucun paramètre de lot, Rules Engine mettra à jour ce paramètre avec les valeurs par défaut. Pour plus d'informations sur les paramètres de traitement par lots et leurs valeurs par défaut, consultez la section Paramètres Parameters HTTP.