Maison >interface Web >js tutoriel >NestJS vs Encore.ts : choisir le bon framework pour vos microservices TypeScript

NestJS vs Encore.ts : choisir le bon framework pour vos microservices TypeScript

Patricia Arquette
Patricia Arquetteoriginal
2024-11-03 03:10:02695parcourir

Présentation

Lorsque les applications Web grandissent, la complexité du développement et de la maintenance du système augmente également. Une manière courante de résoudre ce problème consiste à utiliser l'architecture de microservices, dans laquelle les développeurs décomposent les systèmes en composants plus petits et bien gérés qui peuvent être gérés et mis à l'échelle individuellement.

Pour y parvenir efficacement, il est souvent utile d’utiliser un framework de microservices. Mais choisir le bon framework qui prend en charge nativement les microservices peut s’avérer difficile. Dans cet article, nous allons examiner Encore.ts et Nest.js comme deux alternatives pertinentes, car elles prennent toutes deux en charge nativement les architectures de microservices et TypeScript.

Encore.ts est un framework open source plus récent qui se distingue par ses fonctionnalités de hautes performances, de sécurité de type et d'observabilité. Nest.js, quant à lui, dirige le framework TypeScript pour la création d'applications de microservices. Chacun d'entre eux a quelque chose de fort à offrir, nous examinerons donc chaque framework en termes d'architecture, de performances et d'évolutivité et expliquerons comment déterminer celui qui pourrait vous convenir le mieux.

Avant de commencer, examinons les données de référence dans l'image ci-dessous :

NestJS vs Encore.ts: Choosing the Right Framework for Your TypeScript Microservices

Les données de référence montrent qu'Encore.ts peut gérer 121 005 requêtes par seconde sans validation et 107 018 avec validation de schéma. C’est nettement plus rapide que les frameworks traditionnels. Par exemple, Express.js avec Zod ne répond qu'à environ 15 707 requêtes par seconde sans validation et 11 878 avec. Ainsi, Encore.ts est environ 9 fois plus rapide qu'Express, sur lequel Nestjs est construit.

Présentation d'Encore.ts et NestJS

Lorsque vous démarrez un projet, vous voulez un framework qui soit non seulement puissant mais également facile à utiliser pour les développeurs. Encore.ts et NestJS se démarquent en ce qui concerne les frameworks de microservices qui prennent en charge Typescript, mais ils fonctionnent de manière distincte.

Encore.ts est un framework cloud natif open source conçu pour le développement backend avec une automatisation de l'infrastructure intégrée. Il vous permet de créer des systèmes distribués modulaires à l'aide de bibliothèques d'infrastructure déclaratives.

NestJS vs Encore.ts: Choosing the Right Framework for Your TypeScript Microservices

Encore.ts fonctionne sur un runtime Rust **** intégré à Node.js via napi pour des performances exceptionnelles dans la gestion des E/S et du multithreading tout en vous permettant d'écrire de la logique en TypeScript.

Voici un exemple simple de la façon dont vous pouvez définir un service dans Encore.ts :

import { Service } from "encore.dev/service";

export default new Service("hello");

Lorsque ce service hello est créé, Encore.ts traite automatiquement l'intégralité du répertoire comme faisant partie du service : aucune configuration supplémentaire n'est nécessaire.

D'un autre côté, NestJS a son propre style. Il s'agit d'un framework TypeScript flexible qui vous permet de contrôler entièrement la façon dont vous créez votre application, vous donnant ainsi la liberté de structurer les choses à votre manière.

NestJS vs Encore.ts: Choosing the Right Framework for Your TypeScript Microservices

Bien qu'il ne gère pas l'automatisation de l'infrastructure, NestJS facilite son intégration avec presque toutes les bibliothèques tierces, ce qui ouvre de nombreuses possibilités pour différents projets.

Voici un aperçu de la façon dont vous pourriez définir un service similaire dans NestJS :

import { Service } from "encore.dev/service";

export default new Service("hello");

NestJS vous offre plus de flexibilité mais sans l'automatisation intégrée trouvée dans Encore.ts.

Architecture et design

L'architecture d'un framework dicte la manière dont votre application est construite et maintenue au fil du temps. Encore.ts et NestJS sont robustes, mais leurs philosophies fondamentales diffèrent.

Encore.ts est opiniâtre et *cloud-first, ce qui le rend idéal pour les grands systèmes distribués de type sécurisé *avec de nombreux microservices. L'une de ses fonctionnalités les plus remarquables est la prise en charge native de Pub/Sub, qui permet une architecture basée sur les événements de manière transparente.

Voici comment définir un service basé sur des événements dans Encore.ts à l'aide de Pub/Sub :

import { Controller, Get } from '@nestjs/common';

@Controller('hello')
export class HelloWorldController {
  @Get()
  sayHello(): string {
    return 'Hello, World!';
  }
}

NestJS, bien que capable de prendre en charge des microservices et des architectures basées sur les événements, propose une approche plus modulaire. Son noyau suit le modèle MVC et permet aux développeurs de créer des systèmes à leur manière en offrant un meilleur contrôle sur les configurations.

Par exemple, voici comment définir des services et des événements dans NestJS avec une approche beaucoup plus modularisée :

import { Topic, Subscription } from "encore.dev/pubsub";

// Define the event type for order creation
export interface OrderCreatedEvent {
    orderId: string;
}

// Create a topic for order creation events
export const orders = new Topic<OrderCreatedEvent>("orders", {
    deliveryGuarantee: "at-least-once",
});

// Create a subscription to listen for the order creation event
export const _ = new Subscription(orders, "process-order", {
    handler: async (event: OrderCreatedEvent) => {
        console.log('Order created:', event.orderId);
    },
});

De par sa conception, NestJS accorde beaucoup de contrôle sur la façon dont les composants vont interagir, mais l'inconvénient est beaucoup plus passe-partout et vous devrez également gérer vous-même les configurations de l'infrastructure.

Fonctionnalités intégrées et extensibilité

Dans le développement de systèmes distribués, les fonctionnalités fournies par le framework vont souvent faciliter le développement au risque d'introduire une trop grande complexité.

La fonctionnalité remarquable d'Encore.t est qu'il fournit des moyens d'automatiser le provisionnement de l'infrastructure, à la fois dans le développement local et dans les environnements cloud. Cela inclut les bases de données, Pub/Sub, les tâches cron, etc. Encore.ts fournit également un tableau de bord de développement local qui génère automatiquement la documentation API, les diagrammes d'architecture et le traçage distribué. Il génère également les clients frontend, y compris la prise en charge des spécifications OpenAPI pour les API REST, ce qui peut faire gagner beaucoup de temps au développeur.

Voici un exemple de définition d'une API REST dans Encore.ts, qui génère également automatiquement la documentation OpenAPI :

import { Service } from "encore.dev/service";

export default new Service("hello");

Avec Encore.ts, dès que vous définissez votre service, la documentation et les diagrammes sont automatiquement disponibles sans configuration supplémentaire.

NestJS vs Encore.ts: Choosing the Right Framework for Your TypeScript Microservices

NestJS est populaire en raison de sa flexibilité. Dès le premier jour, il prend facilement en charge REST, GraphQL et WebSocket, mais l'essentiel de sa popularité est qu'il se connecte facilement aux bibliothèques tierces.

Par exemple, si vous souhaitez ajouter le support GraphQL, c'est un processus simple.

import { Controller, Get } from '@nestjs/common';

@Controller('hello')
export class HelloWorldController {
  @Get()
  sayHello(): string {
    return 'Hello, World!';
  }
}

NestJS simplifie la construction de ses fonctionnalités de base, mais il n'offre pas le même niveau d'infrastructure et de fonctionnalités automatisées qu'Encore.ts.

Performances et évolutivité

Les performances sont essentielles lors de la création de systèmes distribués, en particulier à grande échelle.

Encore.ts est conçu pour des performances élevées avec son runtime Rust, qui gère efficacement les opérations d'E/S et le multithreading. La vitesse et la sécurité de la mémoire de Rust confèrent à Encore.ts un avantage significatif par rapport aux frameworks purement basés sur Node.js. En termes d'évolutivité, Encore.ts est natif du cloud et peut évoluer automatiquement à l'aide d'une architecture sans serveur ou de Kubernetes, en fonction de votre stratégie de déploiement.

NestJS, en revanche, est plus traditionnel dans la façon dont il gère les performances et l'évolutivité. Étant donné que NestJS est purement basé sur TypeScript et JavaScript, il repose sur les optimisations de performances que vous appliquez lors de la configuration. La mise à l'échelle d'une application NestJS implique généralement la configuration manuelle de Kubernetes, Docker ou de plates-formes sans serveur comme AWS Lambda.

Bien que NestJS offre une flexibilité dans la manière dont vous évoluez, la configuration nécessite plus d'efforts manuels que l'automatisation intégrée d'Encore.ts.

Comprenons la différence de performances entre encore.ts et Nest.js à partir des données de référence dans l'image ci-dessous :

NestJS vs Encore.ts: Choosing the Right Framework for Your TypeScript Microservices

D'après les données de référence, encore.ts se démarque en termes de performances, avec un temps de démarrage de seulement 8,3 millisecondes, tandis que NestJS prend environ 143,7 millisecondes, ce qui le rend près de neuf fois plus rapide que les frameworks traditionnels.

Stratégies de déploiement

La manière dont vous déployez votre application est une considération clé pour tout projet, en particulier lorsque l'on pense aux environnements cloud.

Encore.ts offre un chemin de déploiement simple via ses outils open source ou la plateforme Encore Cloud. En utilisant la version open source, vous pouvez utiliser encore build pour construire votre projet et créer une image Docker, qui peut ensuite être déployée partout où Docker est pris en charge :

import { Topic, Subscription } from "encore.dev/pubsub";

// Define the event type for order creation
export interface OrderCreatedEvent {
    orderId: string;
}

// Create a topic for order creation events
export const orders = new Topic<OrderCreatedEvent>("orders", {
    deliveryGuarantee: "at-least-once",
});

// Create a subscription to listen for the order creation event
export const _ = new Subscription(orders, "process-order", {
    handler: async (event: OrderCreatedEvent) => {
        console.log('Order created:', event.orderId);
    },
});

Cela crée une image Docker qui peut être déployée n'importe où.

Alternativement, si vous choisissez d'utiliser la plateforme Encore Cloud, elle automatise l'ensemble du pipeline CI/CD, en le déployant directement sur votre propre cloud sur AWS ou GCP avec des options sans serveur ou Kubernetes.

NestJS vs Encore.ts: Choosing the Right Framework for Your TypeScript Microservices

En revanche, NestJS nécessite une configuration manuelle pour le déploiement. En règle générale, les développeurs utilisent Docker pour conteneuriser les applications NestJS et les déployer vers le fournisseur cloud de leur choix. Bien que cela vous donne le contrôle de votre stratégie de déploiement, cela nécessite plus de configuration : même pour une application simple, vous devez suivre de nombreuses étapes :

  1. Créez un fichier Docker :
import { Service } from "encore.dev/service";

export default new Service("hello");
  1. Créez un fichier docker-compose.yml :
import { Controller, Get } from '@nestjs/common';

@Controller('hello')
export class HelloWorldController {
  @Get()
  sayHello(): string {
    return 'Hello, World!';
  }
}
  1. Créer un workflow d'actions GitHub pour NestJS
import { Topic, Subscription } from "encore.dev/pubsub";

// Define the event type for order creation
export interface OrderCreatedEvent {
    orderId: string;
}

// Create a topic for order creation events
export const orders = new Topic<OrderCreatedEvent>("orders", {
    deliveryGuarantee: "at-least-once",
});

// Create a subscription to listen for the order creation event
export const _ = new Subscription(orders, "process-order", {
    handler: async (event: OrderCreatedEvent) => {
        console.log('Order created:', event.orderId);
    },
});

Plus votre application s'agrandit et plus vous avez besoin de plusieurs environnements de test et de test, plus cette approche de configuration manuelle devient lourde, augmentant continuellement en termes de temps consacré à la maintenance.

Considérations sur les cas d'utilisation

Lors du choix entre Encore.ts et NestJS, la décision doit être basée sur les besoins spécifiques de votre projet.

Encore.ts est parfait pour les applications cloud-first et les grands systèmes distribués qui bénéficient de l'automatisation intégrée. Son environnement d'exécution et sa gestion de l'infrastructure basés sur Rust le rendent idéal pour les architectures événementielles, les microservices et les applications hautes performances. La communauté en croissance rapide d'Encore est une source fiable de support et de recherche de moyens d'intégrer des outils tiers.

D'un autre côté, NestJS brille lorsque la flexibilité et la personnalisation sont nécessaires. Il est bien adapté aux applications d’entreprise qui nécessitent un contrôle précis sur chaque aspect et pour lesquelles il est acceptable de consacrer du temps à la configuration manuelle. L'écosystème relativement étendu de NestJS et le support communautaire facilitent la recherche de ressources et d'outils tiers.

Conclusion

Le choix entre Encore.ts et NestJS dépend des besoins spécifiques de votre projet.

Si vous recherchez un framework cloud natif simple et hautes performances avec automatisation intégrée, Encore.ts est un excellent choix. Il rationalise le développement de systèmes distribués en gérant automatiquement l'infrastructure, et ses performances basées sur Rust sont difficiles à battre.

Cependant, si vous avez besoin d'un framework très flexible et modulaire qui vous permet de contrôler chaque aspect, NestJS est probablement la solution. Son extensibilité et son vaste écosystème en font un choix solide pour les solutions d'entreprise personnalisées.

Les deux frameworks sont puissants en soi, et le meilleur choix dépend de la valeur que vous accordez à la performance et à la simplicité, ou à une flexibilité et un contrôle complets.

Prochaines étapes

Si les performances et la simplicité sont importantes pour votre projet, cela pourrait être une bonne idée d'essayer Encore.ts. Et tout est Open Source, vous pouvez donc consulter le code et contribuer sur GitHub.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn