X

AWS CDK 101 – Flux Dynamodb dĂ©clenchant un deleteItem par lot le jour


🔰 DĂ©butants qui dĂ©couvrent AWS CDK, veuillez consulter mes articles prĂ©cĂ©dents un par un dans cette sĂ©rie.

Si au cas oĂč vous auriez manquĂ© mon article prĂ©cĂ©dent, retrouvez-le avec les liens ci-dessous.

🔁 Message prĂ©cĂ©dent original sur 🔗 Dev Post

🔁 RepubliĂ© le post prĂ©cĂ©dent Ă  🔗 dev Ă  @aravindvcyber

Dans cet article, affinons mon article prĂ©cĂ©dent qui montrait l’utilisation d’un lot de flux dynamodb pour supprimer des Ă©lĂ©ments d’une autre table. Ici, nous convertissons la simple action deleteItem en une action batchWrite, ce qui prĂ©sente de grands avantages.

Avantages dans cette approche 💩

  • Comme indiquĂ© prĂ©cĂ©demment dans l’article prĂ©cĂ©dent, nous essayons de rendre cette configuration de nettoyage aussi efficace que possible.
  • Cette intĂ©gration est entiĂšrement asynchrone et ne bloque pas le flux de processus existant, et elle utilise le moins d’appels d’API et de ressources, comme indiquĂ© ci-dessous.
  • Impliquer batchWrite nous fait effectuer une opĂ©ration de suppression sur une taille de bloc maximale de 25.
  • Étant donnĂ© qu’une seule demande est utilisĂ©e Ă  la place de 25 appels, les scĂ©narios de limitation des demandes d’écriture peuvent Ă©galement ĂȘtre Ă©vitĂ©s lorsque nous avons des capacitĂ©s provisionnĂ©es plus petites.
  • D’ici lĂ , vous devez Ă©galement vĂ©rifier le UnprocessedItems pour rĂ©essayer toutes les clĂ©s ayant Ă©chouĂ© si elles sont renvoyĂ©es dans le pire des cas.
  • Dans un rĂ©sumĂ© incluant l’article prĂ©cĂ©dent, nous sommes maintenant en mesure d’effectuer un batch get stream object avec une taille de 100 max qui Ă  son tour effectue une Ă©criture batch de 25 max Ă  la fois.
  • Moins d’invocations de gestionnaire et moins d’appels d’API dynamodb.

Planification et construction 🚣

Comme dĂ©jĂ  mentionnĂ©, nous allons optimiser le prĂ©cĂ©dent deleteItem fonction d’assistance et convertir notre invocation de flux en une action batchWrite sur la table dynamodb avec des morceaux de 25 max.

En commençant par rĂ©fracteur mon prĂ©cĂ©dent lambda un peu pour atteindre les objectifs d’optimisation des effets souhaitĂ©s.

Ici, vous constaterez peut-ĂȘtre que nous ciblons un nom d’évĂ©nement Ă  INSERTde mĂȘme, nous pouvons avoir un contrĂŽle plus prĂ©cis sur le rĂ©sultat souhaitĂ© lors de ces appels de flux, comme indiquĂ© ci-dessous.

Importations nĂ©cessaires 💼

Les importations ci-dessous sont utilisées dans cet article.

import { DynamoDBStreams } from "aws-sdk";
import {
  DeleteItemInput,
  BatchWriteItemInput,
  WriteRequest,
} from "aws-sdk/clients/dynamodb";

Nouvelle logique de fonction de gestionnaire ⚓

Ici, nous avons optimisĂ© le gestionnaire lambda comme suit, cela implique la crĂ©ation d’un keyMap Ă  partir des donnĂ©es de flux, et en les dĂ©coupant davantage en morceaux d’un maximum de 25 pour effectuer batchWrite opĂ©ration invoquant notre mĂ©thode d’assistance.

exports.created = async function (event: any) {
  console.log("Received stream:", JSON.stringify(event, undefined, 2));

  const keyMap: any[] = [];
  event.Records.map((Record: DynamoDBStreams.Record) => {
    console.log(JSON.stringify(Record, undefined, 2));
    if (Record.eventName === "INSERT") {
      keyMap.push(Record.dynamodb?.Keys);
    }
  });

  const chunkList = [...chunks(keyMap, 25)];
  await Promise.all(
    chunkList.map(async (chunk: any[]) => {
      const results = await batchDeleteDbItems(chunk);
      Object.entries(results).forEach((entry) => {
        console.log(JSON.stringify(entry, undefined, 2));
      });
    })
  );
};

Fonction d’assistance dynamodb deleteItem 💐

Fonction d’assistance simple pour effectuer deleteItem à partir d’une table dynamodb.

Ici, nous utilisons la liste de clés pour générer une collection de WriteRequest de Delete agir comme suit.

const batchDeleteDbItems: any = async (keys: any) => {
  console.log("Deleting: ", { keys });

  const writeItems: WriteRequest[] = [];
  keys.map((key: any) => {
    const writeItem: WriteRequest = {
      DeleteRequest: {
        Key: {
          ...key,
        },
      },
    };
    writeItems.push(writeItem);
  });
  const params: BatchWriteItemInput = {
    RequestItems: {
      stgMessagesTable: writeItems,
    },
    ReturnConsumedCapacity: "TOTAL",
    ReturnItemCollectionMetrics: "SIZE",
  };

  console.log("deleteItem: ", JSON.stringify(params, undefined, 2));

  return await dynamo.batchWriteItem(params).promise();
};

Modifications mineures de la dĂ©finition de la table dynamodb 🍊

J’ai mis en Ă©vidence les changements nĂ©cessaires, nous devons effectuer la gĂ©nĂ©ration de flux dynamodb pour notre table.

Plus important encore, je n’ai demandĂ© que des clĂ©s, qui contiendront toutes les donnĂ©es nĂ©cessaires dont nous avons besoin ici.

D’ailleurs dans cet article, nous essayons d’optimiser autant que possible pour le moins d’encombrement.

const messages = new dynamodb.Table(this, "MessagesTable", {
      tableName: process.env.messagesTable,
      sortKey: { name: "createdAt", type: dynamodb.AttributeType.NUMBER },
      partitionKey: { name: "messageId", type: dynamodb.AttributeType.STRING },
      encryption: dynamodb.TableEncryption.AWS_MANAGED,
      readCapacity: 5,
      writeCapacity: 5,
      stream: dynamodb.StreamViewType.KEYS_ONLY
});

Exemple de flux dynamodb avec un enregistrement đŸ„Ł

J’ai partagĂ© l’objet de flux dynamodb utilisĂ© comme charge utile pour appeler notre gestionnaire lambda ci-dessous.

{
  "eventID": "961320567faf6d890d6498a08fd1f34c",
  "eventName": "INSERT",
  "eventVersion": "1.1",
  "eventSource": "aws:dynamodb",
  "awsRegion": "ap-south-1",
  "dynamodb": {
    "ApproximateCreationDateTime": 1652637075,
    "Keys": {
      "createdAt": {
        "N": "1652637067000"
      },
      "messageId": {
        "S": "615f1e20-8261-4492-bb69-c281d3ea3382"
      }
    },
    "SequenceNumber": "36634400000000018872472773",
    "SizeBytes": 61,
    "StreamViewType": "KEYS_ONLY"
  },
  "eventSourceARN": "arn:aws:dynamodb:ap-south-1:57*****7078*****55:table/MessagesTable/stream/2022-05-15T17:48:27.902"
}

Journal de la console pendant l’exĂ©cution 🍿

Enfin, aprĂšs l’exĂ©cution, nous pourrions trouver la charge utile JSON ci-dessus que nous avons reçue dans le event objet et qui est ensuite utilisĂ© pour supprimer par lots de notre table intermĂ©diaire. Vous pouvez trouver les rĂ©sultats ci-dessous dans les journaux de surveillance du cloud.

Ici, un simple test de charge k6 est effectuĂ© pendant une pĂ©riode de 15s avec 10 cibles et nous pouvons obtenir 27 requĂȘtes dont 25 sont rĂ©ussies. les 2 ont Ă©chouĂ© en raison de la limite de dĂ©bit de notre passerelle API.

Journaux Cloudwatch avec 25 enregistrements de clĂ©s â›Č

RĂ©sultat BatchWrite â›Č

Visualisation de la latence impliquĂ©e 🚁

Ici, nous prenons en compte 25 puts rĂ©ussis, 25 requĂȘtes get et un seul lot supprime des fonctions de gestionnaire distinctes. Bien que chaque demande soit d’un type diffĂ©rent, le facteur commun impliquĂ© dans l’utilisation des appels d’API dynamodb sur le rĂ©seau est l’endroit oĂč il y a d’autres frais gĂ©nĂ©raux comme la latence.

RequĂȘtes PutItem

Demandes GetItem

Demandes de suppression d’élĂ©ments par lots

Ainsi batchWrite ou batchGet est beaucoup plus efficace en Ă©vitant la latence, et nous avons donc essayĂ© batchWrite pour la suppression des donnĂ©es indĂ©sirables. Quant Ă  nous, j’apprends que 25 est la limite maximale pour la collection de requĂȘtes d’écriture par lots.

Aussi, il est indispensable de vĂ©rifierUnprocessedItems dans le rĂ©sultat de l’opĂ©ration batchWrite peut ĂȘtre inspectĂ© et il est recommandĂ© de vĂ©rifier et de rĂ©essayer l’échec une fois, lorsque nous avons des exceptions dues Ă  la capacitĂ© ou d’autres Ă©checs dus Ă  la taille du message.

Dans le prochain article, nous montrerons comment nous utiliserons une approche similaire pour supprimer l’objet de S3, que nous avons prĂ©cĂ©demment crĂ©Ă©.

Nous ajouterons plus de connexions à notre pile et la rendrons plus utilisable dans les prochains articles en créant de nouvelles constructions, alors pensez à suivre et à vous abonner à ma newsletter.

⏭ Nous avons notre prochain article en serverless, consultez

🎉 Merci pour votre soutien ! 🙏

Ce serait formidable si vous aimez ☕ Achetez-moi un cafĂ©, pour aider Ă  stimuler mes efforts.

🔁 Message original sur 🔗 Dev Post

🔁 RepubliĂ© Ă  🔗 dev Ă  @aravindvcyber

đŸŒș AWS CDK 101 – 🚂 Flux Dynamodb dĂ©clenchant un batch deleteItem sur une autre table dynamodb @hashnode

En savoir plus sur ma pagehttps://t.co/CuYxnKr0Ig#TheHashnodeWriteathon#aws #awscdk #dynamodb #manuscrit #thwcloud-informatique https://t.co/b3sOi0UmBu

— Aravind V (@Aravind_V7) 15 mai 2022