Retour au blog

Serverless en 2025 : Comment Node.js Domine l'Architecture Sans Serveur

Salut HaWkers, l'architecture serverless est devenue mainstream en 2025, et Node.js est le choix dominant. Avec un design event-driven et lightweight, Node.js est parfait pour les environnements serverless. Plus d'entreprises adoptent Node.js serverless en 2025 que jamais. Explorons pourquoi.

Pourquoi Node.js Domine le Serverless ?

Le cold start de Node.js est ~200ms vs Python ~300ms, Java ~1s+. L'empreinte mémoire minimale de Node.js réduit significativement les coûts. L'architecture event-driven est parfaite pour des fonctions serverless isolées.

// AWS Lambda avec Node.js - Simple et Puissant
export const handler = async (event) => {
  const { userId } = JSON.parse(event.body);

  const user = await db.users.findUnique({
    where: { id: userId }
  });

  return {
    statusCode: 200,
    body: JSON.stringify(user)
  };
};

// Deploy : zip + aws lambda update-function-code
// Scale : 0 à millions de requests automatiquement
// Coût : Payez seulement ce que vous utilisez

Plateformes Serverless Populaires en 2025

1. AWS Lambda

// Architecture serverless complète avec AWS
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';

const dynamo = new DynamoDBClient();
const s3 = new S3Client();

export const processUpload = async (event) => {
  const file = event.Records[0].s3.object.key;

  // Traite le fichier
  const processed = await processImage(file);

  // Sauvegarde dans S3
  await s3.send(new PutObjectCommand({
    Bucket: 'processed',
    Key: file,
    Body: processed
  }));

  // Met à jour DynamoDB
  await dynamo.send(new PutItemCommand({
    TableName: 'ProcessedFiles',
    Item: { id: file, status: 'done' }
  }));

  return { success: true };
};

2. Vercel Edge Functions

// Edge function - tourne proche de l'utilisateur
export const config = {
  runtime: 'edge'
};

export default async function handler(req) {
  const country = req.geo.country;

  return new Response(
    JSON.stringify({
      message: `Bonjour depuis ${country} !`,
      latency: '<10ms'
    }),
    {
      headers: { 'content-type': 'application/json' }
    }
  );
}

3. Cloudflare Workers

// Worker tournant sur 300+ locations globalement
export default {
  async fetch(request) {
    const cache = caches.default;

    let response = await cache.match(request);

    if (!response) {
      response = await fetch(request);
      await cache.put(request, response.clone());
    }

    return response;
  }
};

Serverless Framework en 2025

# serverless.yml - Infrastructure comme code
service: api-serverless

provider:
  name: aws
  runtime: nodejs20.x
  region: eu-west-1

functions:
  getUser:
    handler: handlers/users.get
    events:
      - http:
          path: /users/{id}
          method: get
    environment:
      DATABASE_URL: ${env:DATABASE_URL}

  createUser:
    handler: handlers/users.create
    events:
      - http:
          path: /users
          method: post

plugins:
  - serverless-offline
  - serverless-bundle

Deploy :

serverless deploy --stage production
# API déployée en secondes
# Scale automatiquement
# Zéro maintenance serveur

Optimisation des Coûts

// Stratégies pour réduire les coûts serverless
const costOptimization = {
  coldStartReduction: {
    keepWarm: 'Provisioned concurrency pour endpoints critiques',
    minimize: 'Dépendances petites, bundle optimisé'
  },
  memoryOptimization: {
    rightSize: '128MB pour fonctions simples, 512MB+ pour traitement',
    test: 'Profiler pour trouver le sweet spot'
  },
  caching: {
    apiGateway: 'Cache des réponses dans API Gateway',
    inFunction: 'Cache en mémoire pour données statiques',
    cdn: 'CloudFront/Cloudflare pour assets'
  }
};

// Exemple réel : 1000€/mois → 100€/mois avec optimisations

Patterns Serverless Modernes

// Pattern : API Gateway + Lambda + DynamoDB
class ServerlessAPI {
  static async handleRequest(event) {
    const route = event.requestContext.http.path;
    const method = event.requestContext.http.method;

    const router = {
      'GET /users': this.getUsers,
      'POST /users': this.createUser,
      'GET /users/{id}': this.getUser
    };

    const handler = router[`${method} ${route}`];

    if (!handler) {
      return { statusCode: 404, body: 'Not Found' };
    }

    return await handler(event);
  }

  static async getUsers() {
    const users = await db.scan({ TableName: 'Users' });
    return {
      statusCode: 200,
      body: JSON.stringify(users)
    };
  }
}

Monitoring et Debugging

// CloudWatch Logs + X-Ray pour observabilité
import { Logger } from '@aws-lambda-powertools/logger';
import { Tracer } from '@aws-lambda-powertools/tracer';

const logger = new Logger();
const tracer = new Tracer();

export const handler = tracer.captureLambdaHandler(
  async (event) => {
    logger.info('Processing request', { event });

    try {
      const result = await processData(event);
      logger.info('Success', { result });
      return { statusCode: 200, body: JSON.stringify(result) };
    } catch (error) {
      logger.error('Error processing', { error });
      throw error;
    }
  }
);

Quand Utiliser (et Ne Pas Utiliser) le Serverless

Utilisez serverless pour :

  • APIs avec trafic variable
  • Traitement d'événements/webhooks
  • Scheduled jobs
  • Microservices
  • Prototypes rapides

Évitez serverless pour :

  • Connexions WebSocket longues
  • Traitement vidéo lourd
  • Applications avec état complexe
  • Exigences de latence <10ms constante

Le Serverless avec Node.js en 2025 est mature, économique et scalable. Pour plus sur Node.js moderne, voyez : TypeScript-First : Pourquoi Tout Projet Node.js Commence avec TypeScript en 2025.

C'est parti !

Commentaires (0)

Cet article n'a pas encore de commentaires. Soyez le premier!

Ajouter des commentaires