"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Implémenter Kafka et Node.js dans une architecture de microservices

Implémenter Kafka et Node.js dans une architecture de microservices

Publié le 2024-08-26
Parcourir:353

Implement Kafka and Node.js in Microservice Architecture

Lors de la conception d'une architecture de microservices pour des applications basées sur des événements, l'intégration d'Apache Kafka et Node.js peut améliorer considérablement les capacités de traitement des données en temps réel. . Dans cet article, nous découvrirons comment tirer parti de l'intégration de Kafka Node.js pour créer des microservices robustes et évolutifs qui gèrent efficacement les données en streaming.

Pourquoi utiliser Apache Kafka dans une architecture de microservices ?

Dans une architecture de microservices, les services doivent communiquer efficacement entre eux. Apache Kafka sert de plate-forme de streaming d'événements distribués qui permet l'échange de données en temps réel entre les microservices. Il découple les services, leur permettant de fonctionner de manière indépendante tout en traitant de gros volumes de données.

Avantages de Kafka dans les applications événementielles

  • Évolutivité : l'architecture distribuée de Kafka prend en charge la mise à l'échelle horizontale, ce qui la rend idéale pour le traitement de données en temps réel dans les applications basées sur des événements.
  • Tolérance aux pannes : Kafka garantit que les données sont fournies de manière fiable, même en cas de panne.
  • Haut débit : Kafka peut gérer des millions d'événements par seconde, offrant ainsi un débit élevé pour les applications de microservices exigeantes.

Configuration de l'intégration de Kafka Node.js

Pour intégrer Apache Kafka et Node.js dans un environnement de microservices, vous devrez configurer Kafka en tant qu'intermédiaire de messages et le connecter à vos services Node.js. Voici un guide étape par étape :

Installez Kafka et Node.js

Tout d'abord, assurez-vous que Apache Kafka et Node.js sont installés sur votre système. Vous pouvez installer Kafka & Node.js en suivant les articles suivants :

  • Présentation de Node.js
  • Premiers pas avec Apache Kafka
  • Comment intégrer Apache Kafka avec Node.js

Installer la bibliothèque cliente Kafka Node.js

Pour connecter Node.js à Kafka, vous pouvez utiliser la bibliothèque kafkajs, un client Kafka populaire pour Node.js.

npm install kafkajs

Créer un producteur Kafka dans Node.js

Dans une architecture de microservices, un producteur Kafka est chargé d'envoyer des messages à un sujet Kafka. Vous trouverez ci-dessous un exemple simple de création d'un producteur Kafka dans Node.js :

const { Kafka } = require('kafkajs');

const kafka = new Kafka({
  clientId: 'my-producer',
  brokers: ['localhost:9092']
});

const producer = kafka.producer();

const sendMessage = async () => {
  await producer.connect();
  await producer.send({
    topic: 'my-topic',
    messages: [
      { value: 'Hello Kafka' },
    ],
  });
  await producer.disconnect();
};

sendMessage().catch(console.error);

Créer un consommateur Kafka dans Node.js

Un consommateur Kafka est utilisé pour lire les messages d'un sujet Kafka. Voici comment créer un consommateur :

const { Kafka } = require('kafkajs');

const kafka = new Kafka({
  clientId: 'my-consumer',
  brokers: ['localhost:9092']
});

const consumer = kafka.consumer({ groupId: 'my-group' });

const runConsumer = async () => {
  await consumer.connect();
  await consumer.subscribe({ topic: 'my-topic', fromBeginning: true });

  await consumer.run({
    eachMessage: async ({ topic, partition, message }) => {
      console.log({
        partition,
        offset: message.offset,
        value: message.value.toString(),
      });
    },
  });
};

runConsumer().catch(console.error);

Étude de cas

Pour illustrer l'intégration de Kafka et Node.js dans une architecture de microservices, considérons l'étude de cas suivante :

Scénario

Nous avons deux microservices :

  1. Service de commande : Gère les commandes des clients.
  2. Service produit : Gère les stocks de produits.

Chaque fois qu'un achat ou une transaction a lieu dans le Service de commande, le stock sera mis à jour dans le Service produit. Kafka facilite cette communication en agissant comme un intermédiaire de messages.

Mise en œuvre

  1. Service de commande : publie les événements de commande dans la rubrique des mises à jour des produits.
  2. Service d'inventaire : Consomme les messages de la rubrique de mises à jour du produit et met à jour l'inventaire en conséquence.

Script du producteur du service de commande

Le Service de Commande est chargé de traiter les bons de commande et d'envoyer des messages au Service Produit pour mettre à jour le stock. Voici comment mettre en œuvre le Service de commande en tant que producteur Kafka :

// orderService.js
const express = require('express');
const { Kafka } = require('kafkajs');

// Kafka producer configuration
const kafka = new Kafka({
  clientId: 'order-service',
  brokers: ['localhost:9092'],
});

const producer = kafka.producer();

// Initialize Express app
const app = express();
app.use(express.json());

const placeOrder = async (orderId, productId, quantity) => {
  await producer.connect();
  const orderEvent = {
    orderId,
    productId,
    quantity,
    eventType: 'ORDER_PLACED',
    timestamp: Date.now(),
  };
  await producer.send({
    topic: 'product-updates',
    messages: [{ value: JSON.stringify(orderEvent) }],
  });
  await producer.disconnect();
  console.log(`Order placed: ${orderId} for product: ${productId}`);
};

// API endpoint to place an order
app.post('/order', async (req, res) => {
  const { orderId, productId, quantity } = req.body;

  if (!orderId || !productId || !quantity) {
    return res.status(400).json({ error: 'Missing orderId, productId, or quantity' });
  }

  try {
    await placeOrder(orderId, productId, quantity);
    res.status(200).json({ message: `Order ${orderId} placed successfully.` });
  } catch (error) {
    console.error('Error placing order:', error);
    res.status(500).json({ error: 'Failed to place order' });
  }
});

// Start the server
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Order Service API running on port ${PORT}`);
});

Script du consommateur du service produit

Le Service produit consomme les messages du sujet Kafka de mises à jour de produits et met à jour le stock de produits en conséquence. Voici la mise en œuvre :

// productService.js
const express = require('express');
const { Kafka } = require('kafkajs');

// Kafka consumer configuration
const kafka = new Kafka({
  clientId: 'product-service',
  brokers: ['localhost:9092'],
});

const consumer = kafka.consumer({ groupId: 'product-group' });

// Initialize Express app
const app = express();
app.use(express.json());

const updateStock = async () => {
  await consumer.connect();
  await consumer.subscribe({ topic: 'product-updates', fromBeginning: true });

  await consumer.run({
    eachMessage: async ({ topic, partition, message }) => {
      const orderEvent = JSON.parse(message.value.toString());
      console.log(`Received order: ${orderEvent.orderId}, Product: ${orderEvent.productId}, Quantity: ${orderEvent.quantity}`);

      // Simulate stock update
      console.log(`Updating stock for product: ${orderEvent.productId}`);
      // logic to update stock
    },
  });
};

// Start the Product Service to listen for messages
updateStock().catch(console.error);

// Start the server
const PORT = process.env.PORT || 3001;
app.listen(PORT, () => {
  console.log(`Product Service API running on port ${PORT}`);
});

Démarrez d'abord le service produit, car il doit écouter les messages entrants :

node productService.js

Le Product Service commencera à écouter sur le port 3001 (ou un autre port si spécifié).

Démarrez le Service de commande avec cette commande :

node orderService.js

Le Service de commande sera disponible sur le port 3000 (ou un autre port si spécifié).

Vous pouvez passer une commande en envoyant une requête POST à ​​l'API du Order Service :

curl -X POST http://localhost:3000/order \
-H "Content-Type: application/json" \
-d '{
  "orderId": "order-789",
  "productId": "product-123",
  "quantity": 5
}'

Lorsqu'une commande est passée, le Service de commande enverra un message Kafka et le Service produit consommera ce message pour mettre à jour le stock :

Received order: order-789, Product: product-123, Quantity: 5
Updating stock for product: product-123

Conclusion

L'intégration Apache Kafka et Node.js dans votre architecture de microservices vous permet de créer des applications événementielles hautement évolutives et résilientes.

En suivant les meilleures pratiques et en tirant parti des puissantes fonctionnalités de Kafka, vous pouvez traiter efficacement des données en temps réel et créer une couche de communication robuste entre vos microservices.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/codenoun/implement-kafka-and-nodejs-in-microservice-architecture-5h0h?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3