Skip to content
EN

Event-driven Architecture

Коротко:

Event-Driven Architecture (EDA) — architectural style, где services communicate через publish/subscribe events, а не direct API calls. Producer emits event → message broker (Kafka, RabbitMQ, AWS SNS) delivers → consumers react. Loose coupling: producer не знает consumers. Use cases: order processing, notifications, analytics pipelines. Contrast: synchronous REST/gRPC.

Ниже: подробности, пример, смежные термины, FAQ.

Проверить свой сайт →

Подробности

  • Event broker: Kafka (streams), RabbitMQ (queues), AWS EventBridge, GCP Pub/Sub
  • Schema: JSON/Avro/Protobuf. Schema registry (Confluent) для evolution
  • Delivery guarantees: at-least-once (standard), exactly-once (expensive)
  • Event sourcing pairing: хранить events как source of truth
  • Pitfalls: debug сложнее (distributed flow), eventual consistency

Пример

// Producer
producer.send('order.placed', {
  orderId: 'ord-123',
  customerId: 'c-456',
  total: 99.99
});

// Consumer (OrderService reads)
consumer.on('order.placed', async (event) => {
  await sendEmail(event.customerId);
  await updateInventory(event.items);
});

Смежные термины

Что такое событийно-ориентированная архитектура (EDA)?

Событийно-ориентированная архитектура (EDA) — это подход к проектированию программных систем, где основным элементом взаимодействия является событие. В EDA компоненты системы реагируют на события, что позволяет создавать более гибкие и масштабируемые приложения. События могут быть генерированы пользователями, системами или устройствами, и их обработка осуществляется асинхронно, что улучшает производительность и отзывчивость системы.

Преимущества и недостатки EDA

Событийно-ориентированная архитектура предлагает множество преимуществ, таких как:

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

Несмотря на свои преимущества, EDA также имеет недостатки:

  • Сложность: Управление событиями и их потоками может быть сложным, особенно в больших системах.
  • Отладка: Труднее отслеживать и отлаживать проблемы, так как взаимодействие происходит асинхронно.

Таким образом, выбор между EDA и другими архитектурными подходами зависит от конкретных требований проекта и его масштабов.

Практическое применение EDA: пример настройки с использованием Apache Kafka

Для реализации событийно-ориентированной архитектуры можно использовать различные инструменты, одним из самых популярных является Apache Kafka. Рассмотрим, как настроить простую систему с использованием Kafka для обработки событий.

Шаг 1: Установка Kafka

Сначала установите Apache Kafka. Вы можете использовать следующий набор команд для установки на Ubuntu:

sudo apt update
sudo apt install kafka

Шаг 2: Настройка продюсера

Создайте Java-приложение, которое будет отправлять события в Kafka. Пример кода продюсера:

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;

public class MyProducer {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer producer = new KafkaProducer(props);
producer.send(new ProducerRecord("my-topic", "key", "value"));
producer.close();
}
}

Шаг 3: Настройка консюмера

Теперь создадим консюмер для обработки событий. Пример кода консюмера:

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import java.util.Collections;
import java.util.Properties;

public class MyConsumer {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer consumer = new KafkaConsumer(props);
consumer.subscribe(Collections.singletonList("my-topic"));
while (true) {
for (ConsumerRecord record : consumer.poll(100).records("my-topic")) {
System.out.printf("Consumed message with key %s and value %s%n", record.key(), record.value());
}
}
}
}

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

Больше по теме

Часто задаваемые вопросы

EDA vs request/response?

EDA — async, decoupled. RR — sync, tight coupling. EDA лучше scale, RR проще debug. Most systems — гибрид (EDA для cross-service, RR внутри service).

Kafka vs RabbitMQ?

Kafka — high-throughput streams, long retention, replay. RabbitMQ — queues с routing rules. Kafka для analytics/logs, RabbitMQ для task queues.

Eventually consistency — как handle?

UI shows optimistic updates + reconciles позже. APIs return pending state. Для banking apps — use saga pattern с compensating actions.

Запустить инструмент, который описан в этой статье

Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.