View a markdown version of this page

Utiliser des instructions par lots dans Amazon Keyspaces - Amazon Keyspaces (pour Apache Cassandra)

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.

Utiliser des instructions par lots dans Amazon Keyspaces

Vous pouvez combiner plusieurs DELETE opérations INSERTUPDATE, et dans une BATCH instruction. LOGGEDles lots sont les lots par défaut.

batch_statement ::= BEGIN [ UNLOGGED ] BATCH [ USING update_parameter( AND update_parameter)* ] modification_statement ( ';' modification_statement )* APPLY BATCH modification_statement ::= insert_statement | update_statement | delete_statement

Lorsque vous exécutez une instruction par lots, le pilote combine toutes les instructions du lot en une seule opération par lots.

Pour décider du type d'opération par lots à utiliser, vous pouvez suivre les instructions suivantes.

Utilisez des lots enregistrés dans les cas suivants :
  • Vous avez besoin de garanties de transaction atomiques.

  • Des latences légèrement plus élevées constituent un compromis acceptable.

Utilisez des lots non enregistrés dans les cas suivants :
  • Vous devez optimiser les opérations à partition unique.

  • Vous souhaitez réduire la surcharge du réseau.

  • Vous avez des exigences en matière de haut débit.

Pour plus d'informations sur les quotas de relevés par lots, consultezQuotas pour Amazon Keyspaces (pour Apache Cassandra).

Lots non enregistrés

Avec les lots non enregistrés, Amazon Keyspaces traite plusieurs opérations en une seule demande sans tenir à jour de journal des lots. Dans le cas d'une opération par lots non enregistrée, il est possible que certaines actions aboutissent alors que d'autres échouent. Les lots non enregistrés sont utiles lorsque vous souhaitez :

  • Optimisez les opérations au sein d'une seule partition.

  • Réduisez le trafic réseau en regroupant les demandes associées.

La syntaxe d'un lot non enregistré est similaire à celle d'un lot enregistré, avec l'ajout du UNLOGGED mot clé.

BEGIN UNLOGGED BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe'); INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Smith'); APPLY BATCH;

Lots enregistrés

Un lot enregistré combine plusieurs actions d'écriture en une seule opération atomique. Lorsque vous exécutez un lot enregistré :

  • Toutes les actions réussissent ensemble ou échouent ensemble.

  • L'opération est synchrone et idempotente.

  • Vous pouvez écrire dans plusieurs tables Amazon Keyspaces, à condition qu'elles se trouvent dans le même AWS compte et Région AWS.

Les lots enregistrés peuvent présenter des latences légèrement plus élevées. Pour les applications à haut débit, pensez à utiliser des lots non enregistrés.

L'utilisation des lots enregistrés dans Amazon Keyspaces est gratuite. Vous ne payez que pour les écritures qui font partie de vos opérations par lots. Amazon Keyspaces effectue deux écritures sous-jacentes sur chaque ligne du lot : l'une pour préparer la ligne pour le lot et l'autre pour valider le lot. Lorsque vous planifiez la capacité des tables qui utilisent des lots enregistrés, n'oubliez pas que chaque ligne d'un lot nécessite deux fois la capacité d'une opération d'écriture standard. Par exemple, si votre application exécute un lot enregistré par seconde avec trois lignes de 1 Ko, vous devez provisionner six unités de capacité d'écriture (WCU) contre seulement trois WCU pour les écritures individuelles ou les lots non enregistrés.

Pour plus d'informations sur les tarifs, consultez la rubrique Tarification d'Amazon Keyspaces (pour Apache Cassandra).

Utiliser des instructions préparées dans des lots enregistrés

Les lots enregistrés prennent en charge les instructions préparées (liées) avec une exécution atomique complète (tout ou rien). Vous pouvez combiner les performances des instructions préparées avec les garanties d'atomicité d'un lot enregistré.

Vous pouvez créer un lot consigné d'instructions préparées de deux manières. Les exemples suivants utilisent un pilote Java compatible avec Apache Cassandra.

Dans la première approche, vous préparez chaque instruction individuellement et vous ajoutez les instructions liées à unBatchStatement. Cette approche prend en charge les lots qui couvrent plusieurs tables dans le même AWS compte et Région AWS. L'exemple de code Java suivant illustre cette approche :

import com.datastax.driver.core.BatchStatement; import com.datastax.driver.core.PreparedStatement; import com.datastax.driver.core.Session; PreparedStatement psInsert = session.prepare( "INSERT INTO my_keyspace.orders (order_id, status) VALUES (?, ?)"); PreparedStatement psUpdate = session.prepare( "UPDATE my_keyspace.inventory SET qty = ? WHERE sku = ?"); BatchStatement batch = new BatchStatement(BatchStatement.Type.LOGGED); batch.add(psInsert.bind(orderId, "CONFIRMED")); batch.add(psUpdate.bind(newQty, sku)); try { session.execute(batch); } catch (Exception e) { // Handle the batch execution error. }

Dans la deuxième approche, vous préparez un BEGIN BATCH ... APPLY BATCH bloc entier sous la forme d'une instruction unique, puis vous le liez et vous l'exécutez. Cette approche est la mieux adaptée à un lot dont les instructions ciblent une seule table. Pour préparer un lot couvrant plusieurs tables, utilisez la première approche. L'exemple de code Java suivant montre comment préparer un bloc de commandes complet sous la forme d'une seule instruction :

import com.datastax.driver.core.PreparedStatement; import com.datastax.driver.core.Session; PreparedStatement psBatch = session.prepare( "BEGIN BATCH " + " INSERT INTO my_keyspace.orders (order_id, status) VALUES (?, ?); " + " INSERT INTO my_keyspace.orders (order_id, status) VALUES (?, ?); " + "APPLY BATCH"); try { session.execute(psBatch.bind(orderId1, "CONFIRMED", orderId2, "PENDING")); } catch (Exception e) { // Handle the batch execution error. }

Vous pouvez également utiliser des instructions préparées dans un lot enregistré avec les éléments suivants :

  • Déclarations conditionnelles (IF NOT EXISTSouIF)

  • Marqueurs de liaison nommés

  • Un mélange de relevés préparés et non préparés dans le même lot

  • Réutilisation d'une seule instruction préparée avec différentes valeurs limites dans le lot

Meilleures pratiques pour les opérations par lots

Prenez en compte les pratiques recommandées suivantes lorsque vous utilisez les opérations par lots Amazon Keyspaces.

  • Activez la mise à l'échelle automatique afin de disposer d'une capacité de débit suffisante pour que vos tables puissent gérer les opérations par lots et répondre aux exigences de débit supplémentaires des lots enregistrés.

  • Utilisez des opérations individuelles ou des lots non enregistrés lorsque les opérations peuvent être exécutées indépendamment sans affecter l'exactitude de l'application.

  • Concevez votre application de manière à minimiser les mises à jour simultanées des mêmes lignes, car les opérations par lots simultanées peuvent entrer en conflit et échouer.

  • Pour l'ingestion de données en masse à haut débit sans exigences d'atomicité, utilisez des opérations d'écriture individuelles ou des lots non enregistrés.

Cohérence et simultanéité

Amazon Keyspaces applique les règles de cohérence et de simultanéité suivantes pour les lots enregistrés :

  • Toutes les opérations par lots utilisent un niveau de LOCAL_QUORUM cohérence.

  • Les lots simultanés affectant différentes lignes peuvent être exécutés simultanément.

  • Les DELETE opérations INSERT UPDATE simultanées ou effectuées sur les lignes impliquées dans un lot en cours échouent en raison d'un conflit.

Opérateurs et conditions pris en charge

Opérateurs de WHERE clause pris en charge :
  • Égalité (=)

Opérateurs non pris en charge :
  • Opérateurs de plage (>, <, >=, <=)

  • Opérateur IN

  • Opérateur LIKE

  • Opérateur BETWEEN

Non pris en charge dans les lots enregistrés :
  • Plusieurs instructions affectant la même ligne

  • Opérations de contre-attaque

  • Suppressions de plages

Une DELETE instruction d'un lot enregistré doit cibler une seule ligne en spécifiant la clé primaire complète (toutes les colonnes de clé de partition et de clustering) avec des conditions d'égalité. Une suppression de plage, telle qu'une suppression par clé de partition seule ou sur une plage de colonnes de clustering, n'est pas prise en charge dans un lot enregistré. Pour exécuter une suppression de plage, utilisez une DELETE instruction autonome ou un lot non enregistré.

Conditions de défaillance des relevés de lots enregistrés

Une opération par lots enregistrée peut échouer dans l'un des cas suivants :

  • Les expressions conditionnelles (comme IF NOT EXISTS ouIF) sont évaluées à False.

  • Une ou plusieurs opérations contiennent des paramètres non valides.

  • La demande entre en conflit avec une autre opération par lots exécutée sur les mêmes lignes.

  • La table ne dispose pas d'une capacité provisionnée suffisante.

  • La taille d'une ligne dépasse la limite de taille maximale.

  • Le format des données d'entrée n'est pas valide.

Relevés par lots et réplication multirégionale

Dans les déploiements multirégionaux :

  • Les opérations de la région source sont synchrones et atomiques.

  • Les opérations de la région de destination sont asynchrones.

  • Toutes les opérations par lots sont répliquées vers les régions de destination, mais peuvent ne pas maintenir l'isolement pendant l'application.

Surveiller les opérations par lots

Vous pouvez surveiller les opérations par lots à l'aide CloudWatch des métriques Amazon pour suivre les performances, les erreurs et les modèles d'utilisation. Amazon Keyspaces fournit les CloudWatch mesures suivantes pour surveiller les opérations par lots par table :

  • SuccessfulRequestCount— Suivez les opérations par lots réussies.

  • Latency— Mesurez les performances des opérations par lots.

  • ConsumedWriteCapacityUnits— Surveillez la consommation de capacité des opérations par lots.

Pour de plus amples informations, veuillez consulter Métriques Amazon Keyspaces.

Outre les CloudWatch statistiques, vous pouvez les utiliser AWS CloudTrail pour enregistrer toutes les actions de l'API Amazon Keyspaces. Chaque action d'API du lot est enregistrée, CloudTrail ce qui facilite le suivi et l'audit des opérations par lots dans vos tables Amazon Keyspaces.

Exemples d'opérations par lots

Voici un exemple d'instruction de lot enregistrée de base.

BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe'); INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Smith'); APPLY BATCH;

Voici un exemple de lot qui inclut des DELETE instructions INSERTUPDATE, et.

BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe'); UPDATE users SET firstname = 'Johnny' WHERE id = 2; DELETE FROM users WHERE id = 3; APPLY BATCH;

Voici un exemple de lot utilisant des horodatages côté client.

BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Stiles') USING TIMESTAMP 1669069624; INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Doe') USING TIMESTAMP 1669069624; APPLY BATCH; BEGIN BATCH UPDATE users USING TIMESTAMP 1669069624 SET firstname = 'Carlos' WHERE id = 1; UPDATE users USING TIMESTAMP 1669069624 SET firstname = 'Diego' WHERE id = 2; APPLY BATCH;

Voici un exemple de lot conditionnel.

BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'Jane', 'Doe') IF NOT EXISTS; INSERT INTO users (id, firstname, lastname) VALUES (2, 'John', 'Doe') IF NOT EXISTS; APPLY BATCH; BEGIN BATCH UPDATE users SET lastname = 'Stiles' WHERE id = 1 IF lastname = 'Doe'; UPDATE users SET lastname = 'Stiles' WHERE id = 2 IF lastname = 'Doe'; APPLY BATCH;

Voici un exemple de lot utilisant Time to Live (TTL).

BEGIN BATCH INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe') USING TTL 3600; INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Smith') USING TTL 7200; APPLY BATCH;

Voici un exemple d'instruction batch qui met à jour plusieurs tables.

BEGIN BATCH INSERT INTO users (id, firstname) VALUES (1, 'John'); INSERT INTO user_emails (user_id, email) VALUES (1, 'john@example.com'); APPLY BATCH;

Voici un exemple d'opération par lots utilisant des types définis par l'utilisateur (UDT). L'exemple suppose que l'UDT address existe.

BEGIN BATCH INSERT INTO users (id, firstname, address) VALUES (1, 'John', {street: '123 Main St', city: 'NYC', zip: '10001'}); INSERT INTO users (id, firstname, address) VALUES (2, 'Jane', {street: '456 Oak Ave', city: 'LA', zip: '90210'}); APPLY BATCH; BEGIN BATCH UPDATE users SET address.zip = '10002' WHERE id = 1; UPDATE users SET address.city = 'Boston' WHERE id = 2; APPLY BATCH;