View a markdown version of this page

InfluxDB - 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.

InfluxDB

Choisissez cette action lorsque vous souhaitez interroger la télémétrie des appareils pour connaître les tendances opérationnelles ou surveiller les données chronologiques en temps réel. Vous pouvez utiliser le traitement par lots côté client ou côté serveur pour combiner plusieurs points dans une seule demande d'écriture. AWS IoT Core convertit chaque message en protocole de ligne InfluxDB et l'écrit dans la base de données et la table spécifiées. Pour plus d'informations sur le format, consultez le protocole de ligne InfluxDB dans la InfluxData documentation. Pour plus d'informations sur les clusters gérés, consultez Amazon Timestream pour InfluxDB.

Conditions préalables

Cette action de règle comporte les conditions préalables suivantes :

  • Une destination d'action InfluxDB — Créez une destination d'action InfluxDB qui spécifie le point de terminaison, la version et les informations d'identification de votre instance InfluxDB. AWS IoT Core valide la propriété du terminal avant d'envoyer du trafic. Consultez Destination d’action InfluxDB.

  • Un rôle IAM qui AWS IoT peut assumer d'écrire dans vos bases de données InfluxDB et d'effectuer l'GetSecretValueopération sur le secret qui stocke vos informations d'identification InfluxDB. Pour plus d’informations, consultez Octroi d'un AWS IoT réglez l'accès dont il a besoin.

  • Informations d'identification InfluxDB stockées dans AWS Secrets Manager — Pour InfluxDB V3, Amazon Timestream for InfluxDB fournit automatiquement un secret Secrets Manager lorsque vous créez le cluster InfluxDB. Le secret contient les informations d'identification du cluster. Pour InfluxDB V2, générez un jeton All Access ou un jeton d'API personnalisé à partir de votre instance InfluxDB. Stockez la valeur du jeton sous forme de code secret en texte brut dans AWS Secrets Manager. Pour plus d'informations sur la création d'un jeton, consultez la section Création d'un jeton dans la InfluxData documentation. Au moment de l'exécution, l'action de la règle appelle secretsmanager:GetSecretValue à récupérer ces informations d'identification avant de vous authentifier auprès de votre point de terminaison InfluxDB.

  • Horodatage dans la charge utile du message — Chaque objet de la charge utile du message doit contenir une clé nommée timestamp (en distinguant majuscules et minuscules) avec une valeur d'époque Unix entière. L'unité d'horodatage peut également être définie dans la définition des règles IoT. AWS IoT Core ne génère pas d'horodatage pour l'action InfluxDB, sauf lorsque InfluxDB est utilisé comme action d'erreur.

    Note

    Un alias tel que ts ou time ne peut pas être utilisé à la place detimestamp.

  • Connectivité HTTPS — Votre instance InfluxDB doit être accessible via HTTPS. AWS IoT Core Les ports sortants pris en charge sont : 443, 8443, 8086 (port par défaut pour InfluxDB V2) et 8181 (port par défaut pour InfluxDB V3).

  • JSON-format charge utile — L'action InfluxDB traite uniquement les charges utiles JSON. Si vos appareils publient des données binaires ou Protobuf, utilisez la decode()fonction de votre règle SQL pour les convertir en JSON avant l'exécution de l'action.

Destination d’action InfluxDB

Avant de pouvoir utiliser l'action de règle InfluxDB, vous devez créer une destination d'action InfluxDB. La destination définit les paramètres de connexion pour votre instance InfluxDB. AWS IoT Core valide ensuite la propriété du terminal.

Création d'une destination

Utilisez l'CreateTopicRuleDestinationAPI pour créer une destination InfluxDB :

{ "destinationConfiguration": { "influxDBConfiguration": { "endpoint": "https://my-instance.timestream-influxdb.us-west-2.amazonaws.com:8086", "influxDBVersion": "V2", "secretId": "arn:aws:secretsmanager:us-west-2:111122223333:secret:my-influxdb-credentials-AbCdEf" } } }

Paramètres de destination

Paramètre Type Obligatoire Description
endpoint Chaîne Oui L'URL du point de terminaison HTTPS de votre instance InfluxDB. HTTP n'est pas pris en charge. Ports pris en charge : 443, 8086, 8181, 8443.
influxDBVersion Chaîne Oui La version d'InfluxDB. Valeurs valides : V2, V3.
secretId Chaîne Oui Le nom ou l'ARN du AWS Secrets Manager secret qui contient votre jeton InfluxDB.
secretType Chaîne Non Type de valeur secrète. Valeurs valides : SecretString, SecretBinary.
secretKey Chaîne Non La clé contenue dans le code JSON secret qui contient le jeton d'authentification. Obligatoire uniquement lorsque le secret est un objet JSON avec plusieurs clés.

Validation de propriété des terminaux

Lorsque vous créez une destination d'action InfluxDB, vous AWS IoT Core validez la propriété du point de terminaison en vous authentifiant auprès de l'API InfluxDB à l'aide des informations d'identification que vous avez fournies :

  • InfluxDB V2 : AWS IoT Core appelle le /api/v2/me point de terminaison.

  • InfluxDB V3 : AWS IoT Core appelle le point de terminaison des bases de données de liste (). GET /api/v3/configure/database

Une réponse réussie (2xx) définit le statut de destination surENABLED. En cas d'échec, AWS IoT Core définit le statut surERROR. Pour réessayer la validation, appelez UpdateTopicRuleDestination avec le statut défini sur. IN_PROGRESS

Cartographie terminologique InfluxDB

Les termes suivants diffèrent entre InfluxDB V2 et V3.

AWS IoT Core paramètre Terme InfluxDB V2 Terme InfluxDB V3
databaseName Compartiment Base de données
tableName Mesure Table
Note

Si vous migrez depuis l'action de règle Amazon Timestreamdimensions, le paramètre correspond aux balises de l'action InfluxDB et les attributs du résultat de la requête correspondent aux champs.

Parameters

Lorsque vous créez une AWS IoT règle avec l'action InfluxDB, vous devez spécifier les informations suivantes :

destinationArn

L'ARN de la destination de l'action InfluxDB. Consultez Destination d’action InfluxDB. Prend en charge les modèles de substitution : Non

roleArn

L'ARN du rôle IAM qui accorde AWS IoT l'autorisation d'accéder au secret Secrets Manager. Consultez Conditions préalables. Prend en charge les modèles de substitution : Non

databaseName

Le nom de la base de données InfluxDB (appelée bucket dans InfluxDB v2 ou base de données dans InfluxDB v3) dans laquelle écrire des enregistrements. Supporte les modèles de substitution : Non. Pour acheminer les données vers différentes bases de données, créez des actions de règles distinctes pour chaque base de données.

tableName

Le nom de la table (appelée mesure dans InfluxDB v2 ou table dans InfluxDB v3) dans laquelle écrire des enregistrements. Prend en charge les modèles de substitution : Oui

organization

Nom de l'organisation InfluxDB. Requis pour InfluxDB v2. Si vous incluez ce paramètre pour InfluxDB v3, il est ignoré. Supporte les modèles de substitution : Non.

tags

Métadonnées pour chaque point, spécifiées sous forme de carte. Chaque clé de carte est un nom de balise, et chaque valeur de carte est la valeur de balise correspondante. Les balises sont indexées en fonction des performances des requêtes.

  • Dans InfluxDB V3, chaque nom de balise doit être unique dans une table et ne peut pas dupliquer un nom de champ.

  • Les valeurs de balise prennent en charge les modèles de substitution par élément et par étendue du message.

timestampUnit

Précision de la valeur d'horodatage dans la charge utile. Valeurs valides : s (secondes) | ms (millisecondes) | us (microsecondes) | (nanosecondes). ns Valeur par défaut : ms. Supporte les modèles de substitution : Non.

batchConfig

Configuration de traitement par Server-side lots (facultatif). Pour plus d’informations, consultez Traitement par lot.

  • maxBatchSize— Nombre maximum de points par lot. Plage valide : 1 à 500.

  • maxBatchOpenMs— Durée maximale en millisecondes pour maintenir un lot ouvert. Plage valide : 5 à 1 000.

  • maxBatchSizeBytes— Taille totale maximale en octets avant le vidage. Plage valide : 100 à 131 072.

  • batchAcrossTopics : booléen. Quandtrue, le lot inclut des points provenant de messages sur différents sujets. Valeur par défaut : false.

Traitement par lot

L'action InfluxDB prend en charge deux modes de traitement par lots.

Client-side mise en lots

Votre appareil IoT regroupe les données chronologiques sous forme de tableau JSON et les publie sous forme de message MQTT unique. Avec le traitement par lots côté client, chaque élément du tableau devient un point de protocole de ligne dans une seule demande d'écriture. Vous n'avez pas besoin de configuration supplémentaire.

Server-side mise en lots

Utilisez le traitement par lots côté serveur pour regrouper les messages individuels avant de les écrire dans InfluxDB. Configurez le traitement par lots côté serveur à l'aide du paramètre. batchConfig Le lot est vidé lorsqu'une limite configurée (maxBatchSizemaxBatchOpenMs, oumaxBatchSizeBytes) est atteinte pour la première fois.

Note

Le traitement par lots côté serveur et le traitement par lots côté client (charges utiles du tableau JSON) peuvent être configurés simultanément.

L'action InfluxDB est mesurée en fonction de la taille de la charge utile sortante par incréments de 5 KiB. Line-protocol les échecs de conversion sont également mesurés.

Per-element modèles pour les charges utiles des réseaux

Lorsque vos appareils IoT envoient des données de séries chronologiques par lots sous forme de tableau JSON, vous pouvez utiliser les « modèles de substitution par élément » pour résoudre les valeurs de chaque élément de tableau individuel. Cela permet d'acheminer chaque point de données vers une table différente ou d'appliquer des balises spécifiques à un élément. Pour plus d’informations, consultez Per-element substitution des charges utiles du réseau dans AWS IoT rules.

Syntaxe de deux modèles de substitution

  • ${expression}— Résout à la portée du message, par rapport au message entrant sur l'appareil. Évalué une fois pour chaque message ; la même valeur s'applique à chaque point du tableau.

  • @{expression}— Résout à la portée de l'élément, par rapport à un élément individuel de la charge utile produite par l'instruction SQL SELECT de la règle. Re-evaluated pour chaque élément du tableau, afin que chaque point puisse obtenir une valeur différente. Pour plus d'informations, consultez la @{expression}référence.

Utilisez @{...} les valeurs in tableName et tag pour résoudre l'expression par rapport à chaque élément du tableau individuellement.

Exemple

Compte tenu de la charge utile de l'appareil suivante (tableau JSON) :

[ {"measurement_type": "temperature", "room": "kitchen", "timestamp": 1700000000000, "value": 23.5}, {"measurement_type": "humidity", "room": "bedroom", "timestamp": 1700000001000, "value": 60.1} ]

Et la configuration d'action suivante :

{ "influxDB": { "destinationArn": "arn:aws:iot:us-west-2:111122223333:ruledestination/influxdb/abc123", "roleArn": "arn:aws:iam::111122223333:role/iot-influxdb-role", "databaseName": "sensor_data", "tableName": "@{measurement_type}", "tags": { "room": "@{room}" }, "timestampUnit": "ms" } }

La sortie du protocole de ligne qui en résulte contient deux points :

temperature,room=kitchen value=23.5 1700000000000 humidity,room=bedroom value=60.1 1700000001000
Note

Un champ référencé par @{...} est supprimé de l'ensemble de champs du protocole de ligne, il n'apparaît donc pas également sous forme de champ. Dans cet exemple, measurement_type devient le nom de la table et room devient une balise, de sorte qu'aucun des deux n'apparaît dans le groupe de champs, c'valueest le seul champ.

Restrictions

  • @{...}n'est pris en charge que dans la configuration des actions InfluxDB (tableNameet les valeurs des balises).

  • Vous ne pouvez pas utiliser @{...} dans les règles du SQL (SELECT/WHEREclauses), des définitions d'actions d'erreur ou toute autre action de règle.

  • Seules les références aux champs sont prises en charge à l'intérieur@{...}. Les fonctions ne sont pas prises en charge.

  • Chaque valeur prend en charge au maximum un @{...} marqueur. Plusieurs marqueurs dans une seule valeur produisent une exception d'API.

  • Vous ne pouvez pas mélanger ${...} et @{...} saisir la même valeur. Le mixage produit une exception d'API.

  • Un seul objet JSON est traité comme un tableau à un élément.

Contenu de l'enregistrement InfluxDB

Pour chaque enregistrement du résultat de la requête post-SQL, le point de protocole de ligne InfluxDB qui en résulte contient les composants suivants :

Composant Source
Table La valeur tableName du paramètre
Étiquettes Les paires clé-valeur issues du paramètre tags
Champs Les attributs de charge utile restants ne sont pas utilisés comme balises, nom de table ou horodatage
Horodatage La timestamp clé extraite de la charge utile

Conversion du type de données

AWS IoT Core convertit les valeurs JSON en types de protocole de ligne InfluxDB comme suit :

Type JSON Type de protocole de ligne Exemple
Entier (−2³ à 2³−1) Entier signé (isuffixe) 42 → 42i
Entier (2 ³ à 2 3) Entier non signé (usuffixe) 9223372036854775808 → 9223372036854775808u
Entier extérieur (−2³ à 2−1) Rejeté (action d'erreur déclenchée) —
Flottant/décimal IEEE-754 Float 64 bits 23.5 → 23.5
Booléen t ou f true → t
Chaîne Chaîne entre guillemets "active" → "active"
Null Omis (non écrit) —
Objet ou tableau Chaîne JSON compactée (espaces supprimés) {"a":1} → "{\"a\":1}"

Restrictions de dénomination

  • Les clés de champ et de balise ne peuvent pas être vides ou commencer par un trait de soulignement (_).

  • Dans InfluxDB V3, le nom de la table et la clé de balise doivent commencer par une lettre ou un chiffre.

  • Les virgules, les signes égaux et les espaces dans les clés de champ, les clés de balise et les valeurs de balise sont automatiquement ignorés.

  • Mesures : les virgules et les espaces sont automatiquement ignorés.

  • Les balises sont triées alphabétiquement par clé avant la sérialisation afin d'améliorer les performances d'ingestion.

  • Les valeurs de balise vides sont omises de la sortie.

Clés réservées

Les clés de charge utile suivantes sont supprimées du champ défini lors de la conversion par protocole de ligne :

  • timestamp— Utilisé comme horodatage du point.

  • Clés référencées par tableName (via ${...} ou@{...}) : utilisées comme nom de table.

  • Clés référencées par valeur de balise (via ${...} ou@{...}) : utilisées comme valeurs de balise.

Actions d'erreur

Si l'action InfluxDB échoue, l'action d'erreur configurée est déclenchée.

Utilisation d'InfluxDB comme action d'erreur

Vous pouvez configurer l'action InfluxDB comme action d'erreur pour n'importe quelle règle. L'intégralité de la charge utile est écrite dans un seul tableName enregistrement. Message-scope les modèles de substitution (${...}) sont pris en charge dans les actions d'erreur tableName ettags.

Sortie d'action en cas d'erreur

Lorsque l'action d'erreur est déclenchée, la charge utile de sortie contient : ruleNametopic,cloudwatchTraceId,clientId,sourceIp, base64OriginalPayload (message Base64-encoded d'origine) et un failures tableau où chaque entrée contientfailedAction,failedResource, eterrorMessage.

Dans le cas du traitement par lots côté serveur, la charge utile utilise payloadsWithMetadata une entrée pour chaque message MQTT entrant distinct. affectedIdsLes valeurs de chaque échec font référence aux id valeurs de ces entrées de message ; il ne s'agit pas d'indices de points. Un tableau JSON côté client est un message entrant même s'il produit plusieurs points InfluxDB. Pour le format complet de la charge utile, voirActions d'erreur liées au traitement par lots.

Scénario de défaillance Description
Destination DÉSACTIVÉE ou ERREUR La destination de l'action InfluxDB n'est pas activée. Vérifiez que la validation de la propriété du terminal a réussi.
ARN de destination non valide La destination spécifiée n'existe pas.
ARN de rôle non valide Le rôle IAM n'existe pas ou ne dispose pas d'autorisations.
Échec de la récupération du secret Le secret ou configuré secretKey n'existe pas, ou le rôle d'action de règle ne peut pas récupérer ou déchiffrer le secret.
Horodatage manquant La charge utile ne contient pas de timestamp clé. Chaque objet de la charge utile doit inclure un timestamp champ avec une valeur d'époque Unix entière.
Valeur d'horodatage non valide La valeur d'horodatage n'est pas un entier (par exemple, une chaîne, un float ou une ISO-8601 date). La valeur doit être une époque Unix entière dans l'unité spécifiée par. timestampUnit
Charge utile non valide (aucun champ) La charge utile ne contient aucun champ valide pour le protocole de ligne après la suppression des clés réservées.
Clé de champ non valide Une clé de champ est vide ou commence par_.
Le lot client contient un point non valide Un ou plusieurs éléments d'un tableau JSON ont échoué à la validation du protocole de ligne.
Les tags et les champs dépassent la limite de colonnes Les clés de balise et de champ combinées dépassent le nombre maximal de colonnes (250).
Échec de connexion AWS IoT Core Impossible de se connecter au point de terminaison InfluxDB.
Échec d’authentification Le jeton InfluxDB n'est pas valide ou a expiré. Mettez à jour le secret dans AWS Secrets Manager.
Ressource introuvable La base de données, la table ou l'organisation spécifiée n'existe pas dans InfluxDB.
Conflit de type de champ Un ou plusieurs champs entrent en conflit avec le schéma existant. L'écriture par lots dans son intégralité échoue.
Erreur du serveur InfluxDB Une erreur interne s'est produite dans InfluxDB.
Service InfluxDB non disponible InfluxDB est temporairement indisponible. Le moteur de règles réessaie avec un recul exponentiel.
Important

Un conflit de type de champ à n'importe quel point d'un lot entraîne l'échec de l'écriture du lot dans son intégralité. InfluxDB ne valide pas partiellement les points : soit tous les points réussissent, soit l'écriture entière est rejetée.

Les erreurs réessayables (503) sont réessayées avec un retard exponentiel. Pour une réponse HTTP 401, AWS IoT Core recharge le jeton depuis AWS Secrets Manager et réessaie la demande une fois. Non-retryable les erreurs (404, 422) déclenchent immédiatement l'action d'erreur. Pour connaître les limites de nouvelles tentatives, consultez la section Quotas AWS IoT Core de service.

Exemples

Action de règle InfluxDB

{ "topicRulePayload": { "sql": "SELECT * FROM 'devices/+/telemetry'", "ruleDisabled": false, "awsIotSqlVersion": "2016-03-23", "actions": [ { "influxDB": { "destinationArn": "arn:aws:iot:us-west-2:111122223333:ruledestination/influxdb/a1b2c3d4", "roleArn": "arn:aws:iam::111122223333:role/iot-influxdb-role", "organization": "my-org", "databaseName": "sensor_data", "tableName": "device_metrics", "tags": { "device_id": "${clientid()}", "location": "building-a" }, "timestampUnit": "ms" } } ] } }

Exemple de charge utile :

{ "timestamp": 1700000000000, "temperature": 23.5, "humidity": 60.1, "pressure": 1013.25, "battery_level": 87 }

Protocole de ligne résultant :

device_metrics,device_id=myDevice123,location=building-a temperature=23.5,humidity=60.1,pressure=1013.25,battery_level=87i 1700000000000

L'ordre des champs dans la sortie peut varier : les champs ne sont pas triés par ordre alphabétique.

Client-batched charge utile du tableau avec modèles par élément

{ "influxDB": { "destinationArn": "arn:aws:iot:us-west-2:111122223333:ruledestination/influxdb/a1b2c3d4", "roleArn": "arn:aws:iam::111122223333:role/iot-influxdb-role", "organization": "my-org", "databaseName": "sensor_data", "tableName": "@{measurement_type}", "tags": { "sensor_id": "@{sensor_id}", "location": "${topic(2)}" }, "timestampUnit": "ns" } }

Exemple de charge utile (publiée surdevices/floor3/telemetry) :

[ {"measurement_type": "temperature", "sensor_id": "sensor-42", "timestamp": 1700000000000000000, "value": 23.5}, {"measurement_type": "humidity", "sensor_id": "sensor-42", "timestamp": 1700000001000000000, "value": 60.1}, {"measurement_type": "pressure", "sensor_id": "sensor-43", "timestamp": 1700000002000000000, "value": 1013.25} ]

Protocole de ligne résultant :

temperature,location=floor3,sensor_id=sensor-42 value=23.5 1700000000000000000 humidity,location=floor3,sensor_id=sensor-42 value=60.1 1700000001000000000 pressure,location=floor3,sensor_id=sensor-43 value=1013.25 1700000002000000000

Server-side traitement par lots avec InfluxDB

Pour ajouter le traitement par lots côté serveur à n'importe quelle action InfluxDB, incluez batchConfig dans la configuration de l'action :

"batchConfig": { "maxBatchSize": 50, "maxBatchOpenMs": 1000, "maxBatchSizeBytes": 65536, "batchAcrossTopics": false }

Politique IAM pour le rôle d'action des règles

Politique de confiance :

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Service": "iot.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }

Politique d'autorisation :

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:us-west-2:111122223333:secret:my-influxdb-secret-a1b2c3" } ] }

Traitement par lots combiné côté client et côté serveur (réorganisation par points)

Lorsque vous activez à la fois le traitement par lots côté client (charges utiles du tableau JSON) et le traitement par lots côté serveur (batchConfig), sachez que le lot côté serveur peut réorganiser les points à partir d'une charge utile par lots côté client. Le moteur de règles accumule les points provenant de plusieurs messages entrants en un seul lot côté serveur. Comme les messages arrivent de manière asynchrone à partir de différents appareils ou sujets, les points qui ont été ordonnés dans la charge utile du client d'origine peuvent être entrelacés avec des points provenant d'autres messages lors de l'écriture finale.

Configuration de l'action :

{ "influxDB": { "destinationArn": "arn:aws:iot:us-west-2:111122223333:ruledestination/influxdb/abc123", "roleArn": "arn:aws:iam::111122223333:role/iot-influxdb-role", "databaseName": "sensor_data", "tableName": "@{measurement_type}", "tags": { "device_id": "${topic(2)}", "floor": "@{floor}" }, "timestampUnit": "ms", "batchConfig": { "maxBatchSize": 100, "maxBatchOpenMs": 500, "maxBatchSizeBytes": 65536, "batchAcrossTopics": true } } }

L'appareil A publie devices/deviceA/telemetry à l'instant T :

[ {"measurement_type": "temperature", "floor": "1", "timestamp": 1700000000000, "value": 22.1}, {"measurement_type": "temperature", "floor": "2", "timestamp": 1700000000100, "value": 23.4}, {"measurement_type": "humidity", "floor": "1", "timestamp": 1700000000200, "value": 55.0} ]

L'appareil B publie à l'devices/deviceB/telemetryheure T+10 ms :

[ {"measurement_type": "temperature", "floor": "3", "timestamp": 1700000000050, "value": 21.8}, {"measurement_type": "humidity", "floor": "3", "timestamp": 1700000000150, "value": 62.3} ]

Les deux messages arrivent dans le délai de 500 ms (maxBatchOpenMs), de sorte que le moteur de règles combine les cinq points en un seul lot côté serveur.

Protocole de ligne résultant (écriture par lots côté serveur) :

temperature,device_id=deviceB,floor=3 value=21.8 1700000000050 temperature,device_id=deviceA,floor=1 value=22.1 1700000000000 temperature,device_id=deviceA,floor=2 value=23.4 1700000000100 humidity,device_id=deviceB,floor=3 value=62.3 1700000000150 humidity,device_id=deviceA,floor=1 value=55.0 1700000000200

Notez que les points ne sont plus dans l'ordre dans lequel ils apparaissaient dans la charge utile de chaque client. Les trois points du périphérique A (horodatages 1700000000000, 1700000000100, 1700000000200) sont entrelacés avec les deux points du périphérique B (horodatages 1700000000050, 1700000000150). Le lot côté serveur ne garantit pas la commande originale dans chaque message. InfluxDB utilise le champ d'horodatage pour placer chaque point sur la chronologie, de sorte que la réorganisation n'affecte pas l'exactitude des requêtes. Toutefois, si votre application s'appuie sur la sémantique de l'ordre d'écriture (par exemple, pour gérer les conflits de type de champ ou la déduplication des dernières écritures gagnantes dans la même milliseconde), sachez que l'ordre d'écriture effectif peut être différent de l'ordre de publication.