Выбор архитектуры - это всегда компромисс. Многие думают, что микросервисы - это модно и прогрессивно, а монолит - прошлый век. На деле все сложнее. Я видел стартапы, которые закопали себя микросервисами, и корпорации, которые отлично жили с монолитом. Давайте разберемся, что к чему.
Монолит - это когда все части приложения живут в одном процессе. Вся бизнес-логика, работа с базой, обработка запросов - все в одной куче. Это не всегда плохо.
Пример простого монолита на 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)
Вот когда микросервисы реально выигрывают:
Но готовьтесь к боли. У вас появится:
Допустим, вы пишете интернет-магазин. Вот как может выглядеть архитектура в двух вариантах.
Монолит: Одно приложение, одна база. Таблицы 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-запросы, обработка ошибок, ретраи, таймауты. И это только вершина айсберга.
Мой опыт подсказывает такие правила:
Есть еще промежуточный вариант - модульный монолит. Вы держите все в одном процессе, но код четко разделен на модули с явными границами. Это часто лучший выбор для средних проектов.
Не гонитесь за модой. Микросервисы не сделают ваш код лучше магическим образом. Они решают проблемы масштабирования команды и инфраструктуры, но создают кучу новых проблем с сетью и согласованностью данных.
Начинайте с монолита. Когда почувствуете, что он реально мешает - вытаскивайте части в отдельные сервисы. Не делайте микросервисы "на вырост" - скорее всего, этот рост никогда не наступит, а сложность вы получите сразу.
Помните: правильная архитектура - это не та, которая модная, а та, которая решает ваши конкретные проблемы здесь и сейчас.
Комментариев пока нет