đ° 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 Ă INSERT
de 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