Обсуждение: микросервисы или монолит?

Mmod123.05.2026
архитектурамикросервисы
Обсуждение: микросервисы или монолит?

Вечный спор: микросервисы или монолит?

Выбор архитектуры - это всегда компромисс. Многие думают, что микросервисы - это модно и прогрессивно, а монолит - прошлый век. На деле все сложнее. Я видел стартапы, которые закопали себя микросервисами, и корпорации, которые отлично жили с монолитом. Давайте разберемся, что к чему.

Что такое монолит на самом деле

Монолит - это когда все части приложения живут в одном процессе. Вся бизнес-логика, работа с базой, обработка запросов - все в одной куче. Это не всегда плохо.

Пример простого монолита на Python:

# app.py
from flask import Flask, request, jsonify
import sqlite3

app = Flask(__name__)

@app.route('/api/users')
def get_users():
 conn = sqlite3.connect('db.sqlite')
 users = conn.execute('SELECT * FROM users').fetchall()
 conn.close()
 return jsonify(users)

@app.route('/api/orders')
def get_orders():
 conn = sqlite3.connect('db.sqlite')
 orders = conn.execute('SELECT * FROM orders').fetchall()
 conn.close()
 return jsonify(orders)

if __name__ == '__main__':
 app.run()

Плюсы монолита очевидны:

Главная боль - когда проект разрастается. Код становится спагетти, сложно вносить изменения, страшно что-то трогать. Если у вас команда из 3 человек и стартап - берите монолит, не парьтесь.

Микросервисы: когда они нужны

Микросервисы - это когда вы разбиваете приложение на независимые части. Каждая часть - отдельный процесс, со своей базой, своим API и своей командой разработчиков.

Пример той же логики, но уже с микросервисами:

# user_service.py
from flask import Flask, jsonify
import sqlite3

app = Flask(__name__)

@app.route('/api/users')
def get_users():
 conn = sqlite3.connect('users_db.sqlite')
 users = conn.execute('SELECT * FROM users').fetchall()
 conn.close()
 return jsonify(users)

if __name__ == '__main__':
 app.run(port=5001)
# order_service.py
from flask import Flask, jsonify
import sqlite3

app = Flask(__name__)

@app.route('/api/orders')
def get_orders():
 conn = sqlite3.connect('orders_db.sqlite')
 orders = conn.execute('SELECT * FROM orders').fetchall()
 conn.close()
 return jsonify(orders)

if __name__ == '__main__':
 app.run(port=5002)

Вот когда микросервисы реально выигрывают:

Но готовьтесь к боли. У вас появится:

  1. Сетевое взаимодействие - задержки, таймауты, падения
  2. Сложности с транзакциями между сервисами
  3. Проблемы с консистентностью данных
  4. Головная боль с логированием и трассировкой

Практический пример: интернет-магазин

Допустим, вы пишете интернет-магазин. Вот как может выглядеть архитектура в двух вариантах.

Монолит: Одно приложение, одна база. Таблицы users, products, orders, payments. Все запросы идут к одному серверу. Если упал сервер - все упало. Но если у вас 1000 посетителей в день - это вообще не проблема.

Микросервисы: Отдельные сервисы для пользователей, товаров, заказов и платежей. Каждый со своей базой. Если упал сервис платежей - можно все еще смотреть товары. Но чтобы создать заказ, нужно дергать 3 разных API.

Код для монолита будет проще:

# monolithic_shop.py
def create_order(user_id, product_ids):
 user = get_user(user_id)
 products = [get_product(pid) for pid in product_ids]
 total = sum(p.price for p in products)
 payment = process_payment(user, total)
 order = save_order(user, products, payment)
 return order

А для микросервисов придется писать гораздо больше:

# order_service.py
def create_order(user_id, product_ids):
 user = requests.get(f'http://user-service/api/users/{user_id}')
 products = [requests.get(f'http://product-service/api/products/{pid}') 
 for pid in product_ids]
 total = sum(p['price'] for p in products)
 payment = requests.post('http://payment-service/api/payments', 
 json={'user': user_id, 'amount': total})
 order = save_order(user_id, products, payment['id'])
 return order

Чувствуете разницу? В первом случае - прямой вызов функций. Во втором - HTTP-запросы, обработка ошибок, ретраи, таймауты. И это только вершина айсберга.

Когда что выбирать

Мой опыт подсказывает такие правила:

Есть еще промежуточный вариант - модульный монолит. Вы держите все в одном процессе, но код четко разделен на модули с явными границами. Это часто лучший выбор для средних проектов.

Итог

Не гонитесь за модой. Микросервисы не сделают ваш код лучше магическим образом. Они решают проблемы масштабирования команды и инфраструктуры, но создают кучу новых проблем с сетью и согласованностью данных.

Начинайте с монолита. Когда почувствуете, что он реально мешает - вытаскивайте части в отдельные сервисы. Не делайте микросервисы "на вырост" - скорее всего, этот рост никогда не наступит, а сложность вы получите сразу.

Помните: правильная архитектура - это не та, которая модная, а та, которая решает ваши конкретные проблемы здесь и сейчас.

0
Просмотры: 303Комментарии: 0

Комментарии (0)

Комментариев пока нет