Maison > interface Web > js tutoriel > Implémenter Kafka et Node.js dans une architecture de microservices

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

王林
Libérer: 2024-08-10 07:02:03
original
1218 Les gens l'ont consulté

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 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 pilotées par é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 client 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
Copier après la connexion

Créer un producteur Kafka dans Node.js

Dans une architecture microservices, un producteur Kafka est chargé d'envoyer des messages à un sujet Kafka. Vous trouverez ci-dessous un exemple simple de la façon de créer 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);
Copier après la connexion

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);
Copier après la connexion

É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 mises à jour des produits.
  2. Service d'inventaire : Consomme les messages du sujet de mise à jour des produits et met à jour l'inventaire en conséquence.

Script du producteur du service de commande

Le Service des commandes est chargé de traiter les bons de commande et d'envoyer des messages au Service Produits 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}`);
});
Copier après la connexion

Script du consommateur du service produit

Le Service Produit consomme les messages du sujet Kafka de mises à jour des 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}`);
});
Copier après la connexion

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

node productService.js
Copier après la connexion

Le Service produit 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
Copier après la connexion

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
}'
Copier après la connexion

When an order is placed, the Order Service will send a Kafka message, and the Product Service will consume that message to update the stock:

Received order: order-789, Product: product-123, Quantity: 5
Updating stock for product: product-123
Copier après la connexion

Conclusion

Integrating Apache Kafka and Node.js in your microservices architecture allows you to build highly scalable and resilient event-driven applications.

By following best practices and leveraging Kafka’s powerful features, you can efficiently process real-time data and create a robust communication layer between your microservices.

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!

source:dev.to
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal