L'Architecture en Microservices : Approfondissement et Schémas
Pourquoi passer d'un monolithe à une structure en microservice ?
Bien que Prisma soit rapide et efficace par défaut, il existe plusieurs façons d'améliorer encore les performances de vos applications utilisant Prisma avec NestJS
Dans cet article, nous examinerons les meilleures pratiques et les fonctionnalités avancées pour optimiser les performances de Prisma.
Lorsque vous développez des applications à grande échelle, les performances deviennent cruciales. Des temps de réponse lents peuvent nuire à l'expérience utilisateur et la rentabilité de l'application. Prisma, avec ses nombreuses fonctionnalités, offre plusieurs solutions pour optimiser les performances des requêtes et des transactions de base de données.
---
Les indexes permettent d'accélérer les recherches dans la base de données. Dans Prisma, vous pouvez définir des indexes directement dans le schéma. Voici un exemple :
model User {
id Int @id @default(autoincrement())
name String
email String @unique
createdAt DateTime @default(now())
posts Post[]
comments Comment[]
@@index([email])
}
L'utilisation d'indexes sur des colonnes fréquemment recherchées peut considérablement accélérer les opérations de lecture.
---
Au lieu d'exécuter des requêtes séquentiellement, vous pouvez les exécuter en parallèle pour améliorer les performances. NestJS et Prisma permettent d'utiliser Promise.all pour cet effet.
const [users, posts] = await Promise.all([
this.prisma.user.findMany(),
this.prisma.post.findMany()
]);
Cette technique permet de réduire le temps total d'exécution des requêtes en les exécutant simultanément.
---
Pour les ensembles de données volumineux, il est essentiel d'implémenter une pagination efficace pour éviter le chargement de toutes les données en mémoire.
const pageSize = 10;
const page = 1;
const users = await this.prisma.user.findMany({
skip: (page - 1) * pageSize,
take: pageSize,
});
En utilisant les options skip et take, vous pouvez récupérer des données par morceaux.
---
Prisma permet de charger uniquement les champs nécessaires pour une opération donnée, réduisant ainsi la quantité de données transférées et le temps de traitement.
const user = await this.prisma.user.findUnique({
where: { id: 1 },
select: { id: true, email: true, profile: false },// Exclure le chargement du profil
});
En utilisant select et include, vous pouvez contrôler exactement quelles données sont chargées.
---
Les transactions peuvent être coûteuses en termes de performance, surtout si elles impliquent plusieurs requêtes complexes. Utilisez les transactions Prisma pour regrouper les opérations atomiques et réduire les allers-retours entre l'application et la base de données.
await this.prisma.$transaction(async (prisma) => {
await prisma.user.update({
/* ... */
});
await prisma.post.update({
/* ... */
});
En regroupant les opérations connexes dans une transaction unique, vous pouvez réduire le temps total de traitement.
---
Prisma Accelerate est une fonctionnalité avancée pour optimiser les performances des requêtes Prisma.
Elle peut être configurée via Prisma Data Platform
https://console.prisma.io/
Une fois configuré de ce côté, il ne vous reste plus qu'à rajouter la nouvelle url fournie par Prisma Data Platform
.env
DATABASE_URL="prisma://accelerate.prisma-data.net/?api_key=__API_KEY__"
DIRECT_DATABASE_URL="postgresql://user:password@host:port/db_name?schema=public"
schema.prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DIRECT_DATABASE_URL")
}
---
L'optimisation des performances avec Prisma dans une application NestJS nécessite une approche multifacette : de l'utilisation d'indexes à la parallélisation des requêtes, en passant par une pagination efficace et l'utilisation des transactions. En intégrant ces meilleures pratiques, vous pouvez garantir que votre application reste rapide et réactive, même sous des charges importantes.
Surveillez régulièrement les performances de vos requêtes et ajustez vos configurations en conséquence pour maintenir une application optimale.