Эффективная интеграция ограниченных контекстов в приложении для доставки пиццы: методы и примеры кода

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

  1. Архитектура, управляемая событиями.
    Один из подходов к интеграции ограниченных контекстов — использование архитектуры, управляемой событиями. В этом шаблоне каждый ограниченный контекст генерирует события, которые фиксируют соответствующие изменения в его домене. Другие ограниченные контексты могут подписываться на эти события и реагировать соответствующим образом. Давайте рассмотрим пример:
# Purchase Service
def place_order(order):
    # ... order placement logic ...
    # Emitting a "OrderPlaced" event
    event = Event(name="OrderPlaced", payload=order)
    event_bus.publish(event)
# Delivery Service
def handle_order_placed_event(event):
    order = event.payload
    # ... delivery processing logic ...
  1. Шлюз API.
    Другой метод — использовать шлюз API, который действует как единая точка входа для доступа к множеству ограниченных контекстов. Шлюз API может консолидировать и маршрутизировать запросы к соответствующим сервисам. Вот пример:
# API Gateway
@app.route('/purchase-service/place-order', methods=['POST'])
def place_order():
    # ... extract order details ...
    # Make a request to the Purchase Service
    response = requests.post('http://purchase-service/place-order', json=order)
    return response.json(), response.status_code
  1. Шаблон «запрос-ответ».
    Шаблон «запрос-ответ» предполагает выполнение синхронных запросов из одного ограниченного контекста в другой. Этого можно добиться с помощью вызовов HTTP или RPC. Ниже приведен пример:
# Purchase Service
def place_order(order):
    # ... order placement logic ...
    # Making a request to the Delivery Service
    response = requests.post('http://delivery-service/handle-order', json=order)
    # ... handle the response ...
# Delivery Service
@app.route('/handle-order', methods=['POST'])
def handle_order():
    # ... handle the order ...
    return jsonify(success=True)
  1. Очередь сообщений.
    Использование очереди сообщений — еще один эффективный способ интеграции ограниченных контекстов. Один ограниченный контекст может публиковать сообщения в очереди, тогда как другие используют эти сообщения асинхронно. Давайте рассмотрим пример с RabbitMQ:
# Purchase Service
def place_order(order):
    # ... order placement logic ...
    # Publishing a message to RabbitMQ
    channel.basic_publish(exchange='', routing_key='order_placed', body=json.dumps(order))
# Delivery Service
def handle_order():
    def callback(ch, method, properties, body):
        order = json.loads(body)
        # ... delivery processing logic ...
    # Consuming messages from RabbitMQ
    channel.basic_consume(queue='order_placed', on_message_callback=callback, auto_ack=True)
    channel.start_consuming()

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