Назад к вопросам
Middle
94
questionbank

Какие виды взаимодействия между микросервисами существуют?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

  • Синхронное взаимодействие (Request/Response): СервисB ожидает ответ от СервисаA перед продолжением выполнения.

    • HTTP/REST
    • gRPC
  • Асинхронное взаимодействие (Event-driven): СервисA отправляет сообщение или событие в брокер сообщений, а СервисB подписывается на эти события и обрабатывает их независимо.

    • Брокеры сообщений (Kafka, RabbitMQ, ActiveMQ)
    • Очереди сообщений (SQS, Azure Service Bus)
  • Смешанное взаимодействие: Комбинация синхронных и асинхронных подходов. Например, синхронные запросы для получения данных и асинхронные события для оповещения об изменениях.

Таблица сравнения:

Вид взаимодействия Преимущества Недостатки
Синхронное Простота реализации, предсказуемый поток данных Высокая связанность, блокировка, каскадные сбои
Асинхронное Низкая связанность, масштабируемость, устойчивость Сложность отладки, eventual consistency, управление состоянием

Пример асинхронного взаимодействия (псевдокод):

<?php

// Сервис A (Publisher)
class OrderService
{
    private MessageBroker $broker;

    public function __construct(MessageBroker $broker)
    {
        $this->broker = $broker;
    }

    public function placeOrder(array $orderData): void
    {
        // Обработка заказа...
        echo "Order placed.";

        // Публикация события
        $this->broker->publish('order.placed', json_encode($orderData));
    }
}

// Сервис B (Subscriber)
class ShippingService
{
    private MessageBroker $broker;

    public function __construct(MessageBroker $broker)
    {
        $this->broker = $broker;
        $this->broker->subscribe('order.placed', [$this, 'handleOrderPlaced']);
    }

    public function handleOrderPlaced(string $eventPayload): void
    {
        $orderData = json_decode($eventPayload, true);
        // Обработка события: инициировать доставку
        echo "Shipping order for customer {$orderData['customer_id']}.";
    }
}

// Пример использования (упрощенный)
// $broker = new RabbitMQBroker(); // Или другой брокер
// $orderService = new OrderService($broker);
// $shippingService = new ShippingService($broker);
//
// $orderService->placeOrder(['customer_id' => 123, 'items' => [...]]);