В приложении для доставки пиццы задействованы два ключевых контекста: контекст доставки и контекст покупки. Эти ограниченные контексты обрабатывают различные аспекты функциональности приложения, и их эффективная интеграция имеет решающее значение для бесперебойного взаимодействия с пользователем. В этой статье мы рассмотрим различные методы и предоставим примеры кода для интеграции этих ограниченных контекстов.
- Архитектура, управляемая событиями.
Один из подходов к интеграции ограниченных контекстов — использование архитектуры, управляемой событиями. В этом шаблоне каждый ограниченный контекст генерирует события, которые фиксируют соответствующие изменения в его домене. Другие ограниченные контексты могут подписываться на эти события и реагировать соответствующим образом. Давайте рассмотрим пример:
# 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 ...
- Шлюз 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
- Шаблон «запрос-ответ».
Шаблон «запрос-ответ» предполагает выполнение синхронных запросов из одного ограниченного контекста в другой. Этого можно добиться с помощью вызовов 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)
- Очередь сообщений.
Использование очереди сообщений — еще один эффективный способ интеграции ограниченных контекстов. Один ограниченный контекст может публиковать сообщения в очереди, тогда как другие используют эти сообщения асинхронно. Давайте рассмотрим пример с 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, шаблоны запрос-ответ и очереди сообщений. Каждый метод имеет свои преимущества и может быть адаптирован к конкретным потребностям приложения. Выбрав правильный подход к интеграции и используя предоставленные примеры кода, разработчики могут обеспечить плавное и эффективное взаимодействие между контекстами доставки и покупки.