Назад к вопросам
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' => [...]]);