Обработка связи между ограниченными контекстами в приложении для доставки пиццы

Рассмотрим приложение для доставки пиццы, в котором два связанных контекста — доставка и покупка — обрабатываются отдельно. Ниже приведены несколько методов с примерами кода, которые можно реализовать в этом сценарии:

  1. Общение через REST API:

    • В контексте доставки откройте конечную точку REST API для получения информации о доставке из контекста покупки.
    • В контексте покупки используйте клиентскую библиотеку HTTP, чтобы отправить POST-запрос к конечной точке API контекста доставки.

      Пример (на Python с использованием Flask и библиотек запросов):

      # Delivery Context
      from flask import Flask, request
      app = Flask(__name__)
      @app.route('/api/delivery', methods=['POST'])
      def receive_delivery_info():
       delivery_info = request.get_json()
       # Process the delivery information
       return 'Delivery information received successfully'
      # Purchase Context
      import requests
      delivery_info = {
       # Delivery information
      }
      response = requests.post('http://delivery-context/api/delivery', json=delivery_info)
  2. Очередь сообщений или архитектура, управляемая событиями:

    • Внедрите систему очередей сообщений или шину событий для облегчения асинхронной связи между контекстами доставки и покупки.
    • Контекст покупки может публиковать событие или сообщение, содержащее информацию о доставке, на которое контекст доставки может подписаться и соответствующим образом обработать.

      Пример (с использованием RabbitMQ и библиотеки Pika Python):

      # Purchase Context
      import pika
      connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
      channel = connection.channel()
      channel.queue_declare(queue='delivery_queue')
      delivery_info = {
       # Delivery information
      }
      channel.basic_publish(exchange='', routing_key='delivery_queue', body=json.dumps(delivery_info))
      connection.close()
      # Delivery Context
      import pika
      def process_delivery_info(ch, method, properties, body):
       delivery_info = json.loads(body)
       # Process the delivery information
      connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
      channel = connection.channel()
      channel.queue_declare(queue='delivery_queue')
      channel.basic_consume(queue='delivery_queue', on_message_callback=process_delivery_info, auto_ack=True)
      channel.start_consuming()
  3. API-шлюз:

    • Внедрите шлюз API для управления связью между контекстами доставки и покупки.
    • Контекст покупки отправляет запрос шлюзу API, который затем пересылает его соответствующей службе в контексте доставки.

      Пример (с использованием Node.js и Express):

      // API Gateway
      const express = require('express');
      const axios = require('axios');
      const app = express();
      app.post('/api/delivery', async (req, res) => {
       const deliveryInfo = req.body;
       // Forward the delivery information to the delivery context
       const response = await axios.post('http://delivery-context/api/delivery', deliveryInfo);
       res.send(response.data);
      });
      app.listen(3000, () => {
       console.log('API Gateway listening on port 3000');
      });
      // Purchase Context
      const axios = require('axios');
      const deliveryInfo = {
       // Delivery information
      };
      axios.post('http://api-gateway/api/delivery', deliveryInfo)
       .then(response => {
           console.log(response.data);
       })
       .catch(error => {
           console.error(error);
       });