Списком
З ростом складності програмних систем монолітна архітектура дедалі більше стає перешкодою: окремі команди блокують одна одну, деплоймент цілого застосунку вимагає узгодження всіх змін, а масштабування окремих компонентів неможливе. Мікросервісна архітектура вирішує ці проблеми шляхом декомпозиції монолітного застосунку на незалежні, автономні сервіси — але водночас вносить нові виклики з розподіленими системами.
Моноліт — застосунок, де всі модулі зібрані в єдиний розгортуваний артефакт (JAR, EXE, WAR).
Типи монолітів:
Проблеми монолітів при зростанні:
Моноліт Мікросервіси
┌─────────────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ UI │ │ Auth │ │ Orders │ │ Payment │
│ Auth │ →→→→→→ │ Service │ │ Service │ │ Service │
│ Orders │ └────┬────┘ └────┬────┘ └────┬────┘
│ Payment │ │ │ │
│ Notifications │ ┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ DB │ │ Auth DB │ │Orders DB│ │Pmnt DB │
└─────────────────┘ └─────────┘ └─────────┘ └─────────┘
Ключові характеристики мікросервісів:
Martin Fowler стверджує: «Don’t start with microservices» для нових проєктів:
Bounded Context (Обмежений контекст) — природний кордон для одного мікросервісу: один контекст має чітку відповідальність і власну модель даних.
Приклад: E-commerce:
Catalog: товари, категорії, атрибутиOrders: замовлення, рядки замовлення, статусInventory: залишки, резерваціїShipping: доставка, трекінгАнтипатерн — спільна БД для кількох сервісів (Shared Database):
Order Service ──► shared_db ◄── Inventory Service
(ПРОБЛЕМА: схема змінюється → ламаються обидва сервіси)
Правильно — Database per Service:
Order Service ──► orders_db (PostgreSQL)
Inventory Service ──► inventory_db (MySQL)
User Service ──► users_db (MongoDB)
Мікросервіси не підтримують distributed ACID-транзакції. Saga — альтернатива:
Choreography-based Saga (без центрального оркестратора):
Order Service → OrderCreated event
└──► Inventory Service → InventoryReserved event
└──► Payment Service → PaymentProcessed event
└──► Shipping Service → ShippingScheduled event
При відмові на будь-якому кроці — компенсаційні транзакції відкочують попередні кроки.
REST (HTTP/JSON):
gRPC (Protocol Buffers + HTTP/2):
.proto файл)Amazon SQS (Simple Queue Service):
Amazon SNS (Simple Notification Service):
Amazon EventBridge:
Apache Kafka / Amazon MSK (Managed Streaming for Kafka):
API Gateway — єдина точка входу для всіх клієнтів (браузер, мобільний, зовнішній API). Виконує наскрізні (cross-cutting) функції:
Клієнт → ┌──────────────────────────────────┐ → Мікросервіс A
│ API Gateway │ → Мікросервіс B
│ • Маршрутизація запитів │ → Мікросервіс C
│ • Автентифікація (JWT/API Key) │
│ • Авторизація │
│ • Rate Limiting │
│ • SSL Termination │
│ • Request/Response Transform │
│ • Caching │
│ • Logging │
└──────────────────────────────────┘
Amazon API Gateway — повністю кероване рішення для HTTP та WebSocket API:
Інтеграції API Gateway:
Usage Plans та API Keys: Обмеження кількості запиту для конкретного клієнта (throttling, quotas) — для монетизації API.
Azure API Management (APIM):
Google Cloud Apigee:
При десятках мікросервісів у K8s виникають наскрізні проблеми:
Service Mesh (Istio, Linkerd) вирішує ці задачі шляхом додавання sidecar-проксі (Envoy) до кожного Pod:
Pod A: [Застосунок] + [Envoy Proxy]
│ (через sidecar)
▼
Pod B: [Застосунок] + [Envoy Proxy]
Istio Control Plane (istiod):
→ розповсюджує конфігурацію mTLS сертифікатів
→ збирає Telemetry (metrics, traces, logs) від Envoy
→ управляє traffic policies (retries, circuit breaking, canary)
У мікросервісній архітектурі неминуче виникає потреба в інтеграційному шарі — коді, що з’єднує різнорідні сервіси, трансформує дані між ними та реагує на події. Такий код часто називають «glue code» (код-клей): він не містить бізнес-логіки, але є критично важливим для роботи всієї системи.
Традиційний підхід — писати цей клей вручну (Lambda-функції, скрипти, мікросервіси-адаптери). No-Code/Low-Code Integration Platforms пропонують альтернативу: графічний конструктор workflow (робочих процесів), де інтеграції описуються не кодом, а візуальними діаграмами з’єднання вузлів.
n8n (вимовляється «nodemation», n-eight-n) — відкрита (fair-code license) платформа автоматизації робочих процесів з можливістю self-hosting. Створена у 2019 році Яном Оберхайзером.
Ключові характеристики n8n:
Архітектура n8n:
┌──────────────────────────────────────────────────────────────┐
│ n8n Server │
│ │
│ ┌───────────┐ ┌────────────┐ ┌────────────────────────┐│
│ │ Scheduler │ │ Webhook │ │ Workers (queue mode) ││
│ │ (Cron) │ │ Receiver │ │ (Redis + Bull) ││
│ └─────┬─────┘ └─────┬──────┘ └──────────┬─────────────┘│
│ │ │ │ │
│ └───────────────┼──────────────────────┘ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Workflow Engine │ │
│ │ (Node Runner) │ │
│ └────────┬────────┘ │
│ │ виконує вузли послідовно/паралельно │
│ ┌────────┐ ┌───────┐│┌──────────┐ ┌──────────┐ │
│ │HTTP │ │Slack │││PostgreSQL│ │ OpenAI │ ... │
│ │Request │ │Node │││ Node │ │ Node │ │
│ └────────┘ └───────┘│└──────────┘ └──────────┘ │
│ ┌─────────────────┐ │
│ │ SQLite / PG │ (зберігання workflow + logs)│
│ └─────────────────┘ │
└──────────────────────────────────────────────────────────────┘
n8n як Integration Middleware:
┌──────────────────────────────────────────────────────────────┐
│ Мікросервісна система │
│ │
│ Order Service ──► SQS Queue ──►┐ │
│ │ ┌──────────────────┐ │
│ Payment Service ──► Webhook ───►├──►│ n8n Workflow │ │
│ │ │ (Integration │───►│Slack│
│ CRM (Salesforce) ──► API ──────►│ │ Middleware) │ │ │
│ │ └───────┬──────────┘ │Email│
│ │ │ │
│ ┌─────────────────────┘ │DB │
│ ▼ └─────┘
│ Inventory Service API
└──────────────────────────────────────────────────────────────┘
Типові сценарії використання n8n у мікросервісах:
| Сценарій | Опис | Альтернатива без n8n |
|---|---|---|
| Event forwarding | Подія в SQS → трансформація → POST в зовнішній CRM | Lambda + кастомний код |
| Data synchronization | Щогодини синхронізувати замовлення між Order Service та ERP | Scheduled Lambda + DB queries |
| Notification routing | При новому замовленні → Slack-повідомлення + Email + Telegram | Lambda + SNS + кілька адаптерів |
| API orchestration | Агрегувати дані з 5 API → трансформувати → записати в БД | Кастомний aggregator-сервіс |
| Approval workflow | Людина затверджує замовлення через форму → активується наступний крок | BPMN-система або кастомний код |
| Error alerting | CloudWatch Alarm → Webhook → n8n → Slack + Jira issue | Lambda |
Сценарій: Коли в базі даних PostgreSQL з’являється нове замовлення → надіслати повідомлення у Slack та відправити Email клієнту.
[Trigger: PostgreSQL] [Налаштування]
Тип: Poll ──► Query:
Interval: 1 хвилина SELECT * FROM orders
WHERE created_at >
AND status = 'new'
│
▼
[IF: є нові замовлення?]
true ──────────────────────────────────────────────────────────┐
false → Stop workflow │
│
┌────────────────────────────────────────────────────────┘
│
▼
[Split In Batches] ← для кожного замовлення окремо
│
├──► [Slack Node]
│ Channel: #orders
│ Message: «Нове замовлення # від
│ на суму грн»
│
└──► [Send Email Node]
To:
Subject: Ваше замовлення # прийнято
Body: HTML-шаблон з деталями замовлення
Код у вузлі «Function» (JavaScript) для трансформації даних:
// Вузол: Transform Order Data
const orders = $input.all();
return orders.map((order) => ({
json: {
...order.json,
total_formatted: `${(order.json.total / 100).toFixed(2)} грн`,
created_at_formatted: new Date(order.json.created_at).toLocaleString(
"uk-UA",
{ timeZone: "Europe/Kyiv" },
),
customer_name: order.json.first_name + " " + order.json.last_name,
},
}));
Варіант 1: Docker Compose (локально або на VM)
# docker-compose.yml
version: "3.8"
services:
n8n:
image: n8nio/n8n:latest
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=securepassword
- N8N_HOST=n8n.mycompany.com
- N8N_PROTOCOL=https
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=n8npassword
- EXECUTIONS_MODE=queue # для горизонтального масштабування
- QUEUE_BULL_REDIS_HOST=redis
volumes:
- n8n_data:/home/node/.n8n
depends_on: [postgres, redis]
postgres:
image: postgres:15
environment:
POSTGRES_DB: n8n
POSTGRES_USER: n8n
POSTGRES_PASSWORD: n8npassword
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
n8n_data:
postgres_data:
Варіант 2: Kubernetes Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: n8n
spec:
replicas: 1
selector:
matchLabels: { app: n8n }
template:
metadata:
labels: { app: n8n }
spec:
containers:
- name: n8n
image: n8nio/n8n:latest
ports:
- containerPort: 5678
env:
- name: DB_TYPE
value: postgresdb
- name: N8N_BASIC_AUTH_ACTIVE
value: "true"
envFrom:
- secretRef:
name: n8n-secrets # DB_PASSWORD, AUTH_PASSWORD тощо
resources:
requests: { cpu: 250m, memory: 512Mi }
limits: { cpu: 500m, memory: 1Gi }
Хмарні No-Code/Low-Code iPaaS платформи:
| Платформа | Тип | Ліцензія | Hosting | Безкоштовний тир | Сильна сторона |
|---|---|---|---|---|---|
| n8n | Low-code | Fair-code | Self + Cloud | Self-hosted безліміт | Технічна гнучкість, JS/Python вузли |
| Make (Integromat) | No-code | Комерційна | SaaS | 1000 ops/міс | Простота, готові шаблони |
| Zapier | No-code | Комерційна | SaaS | 100 task/міс | Найбільше інтеграцій (7000+) |
| Apache Airflow | Code | OSS | Self | Безкоштовно | DAG-орієнтований, Data Engineering |
| AWS Step Functions | Low-code | AWS | Cloud | 4000 state transitions/міс | Глибока AWS-інтеграція |
| Azure Logic Apps | Low-code | Azure | Cloud | 4000 runs/міс | Office 365, Teams, SharePoint |
| Temporal | Code | OSS | Self + Cloud | Безкоштовно | Надійні довготривалі workflow |
| Prefect | Code | OSS+SaaS | Self + Cloud | Є | Data pipeline orchestration |
Детальніше про ключових конкурентів:
Make (раніше Integromat):
Azure Logic Apps:
Apache Airflow:
Temporal:
Коли n8n краще ніж кастомний Lambda/сервіс:
Коли кастомний код краще ніж n8n:
Мікросервісна архітектура вирішує проблему масштабованості та незалежного деплойменту, але вносить складність розподілених систем (мережеві відмови, distributed transactions, observability).
DDD та Bounded Context є найкращою методологією для виявлення правильних меж мікросервісів. Неправильна декомпозиція призводить до «distributed monolith» (найгіршого варіанту обох підходів).
Асинхронна комунікація (SQS, EventBridge, Kafka) є більш відмовостійкою, ніж синхронна (REST/gRPC), оскільки усуває тимчасове зчеплення між сервісами.
API Gateway забезпечує єдину точку входу для клієнтів та централізує наскрізні функції (автентифікація, rate limiting, логування), виводячи їх із бізнес-логіки сервісів.
Service Mesh автоматизує реалізацію mTLS, observability та traffic policies на рівні інфраструктури, не вимагаючи змін у коді застосунків.
n8n та iPaaS-платформи (Make, Azure Logic Apps, Zapier) заповнюють нішу «glue code» між мікросервісами — дозволяючи автоматизувати інтеграції без або з мінімальним кодом. n8n є найбільш технічно гнучким рішенням для self-hosted сценаріїв із підтримкою JavaScript/Python, тоді як AWS Step Functions та Azure Logic Apps є оптимальними для deep cloud-native інтеграцій у відповідних екосистемах.