главная новое лучшее написать
5

Друзья, мне кажется, здесь аудитория достаточно зрелая, чтобы обсудить этот вопрос на интересном мне уровне абстракции. Допустим, мы разрабатываем какую-то очень сложную, но достаточно естественно декомпозируемую систему. Например, банковское приложение крупного банка или агрегатор такси, что-то такое. На одном краю спектра находится монолит, когда код системы представляет собой чудовище, а чтобы ее зарелизить, нужно сначала заморозить на полгода и эти полгода тестировать. На другом краю спектра находится death by a thousand microservices, когда существенный процент кода и работы с ним это обслуживание, собственно, микросервисов, а не какие-то более содержательные манипуляции с данными, а существенный процент сложности системы находится уже даже не в коде, а в графе взаимодействия этих самых микросервисов (и хорошо еще, если этот граф вообще наблюдаемый как какая-то визуализируемая или текстовая сущность, а не существует только имплицитно).

Собственно, вопрос, где находится золотая середина. Мой вариант ответа -- хороший микросервис разрабатывает команда, в которой каждый знает каждого и каждый senior понимает, что происходит в любой части кода. При этом дробить сильнее уже вредно, т.е. правильный размер команды микросервиса это 5-7 человек (так что сервис даже не совсем "микро").

Но я знаю, что очень часто систему дробят гораздо мельче, вплоть до того, что один программист разрабатывает и поддерживает несколько "микросервисов". Например, вместо одного бэкенда профиля пользователя мы устраиваем микросервис, который занимается аватарками, отдельно микросервис, который занимается самоописанием пользователя и т.п. Мне такой способ организации кажется абсурдным. Я не видел внятного обоснования, зачем так делать (хотя знаю цинично-реалистичное: job security архитектора, если такая роль в проекте отдельно выделена). Это я чего-то не понимаю, или все-таки они?

1 asandler2 25-03-2024

Есть же ещё Domain Driven Design, но там надо грамотно на домены разделить, чтобы потом не огрести ещё больших проблем. Проектирование совсем нового сервиса я бы делал примерно по этой методологии (если доменов больше одного, конечно).

ответить
1 anonymous 25-03-2024

Да кмон, никто еще не показал(для корректности: я не видел чтобы кто-то показал) преимуществ микросервиса перед хорошо спроектированным монолитом. Все сравнивают плохой монолит с нормально сделанными микросервисами и орут "ура, микросервисы круче!". Только вот если сравнить аккуратно сделанный монолит(linux kernel ближе к монолиту, например) с фигово сделанными микросервисами где "так, паажжи ебана, сколько и каких запросов происходит при обработке вот этого события?" то резко окажется что монолит это вообще вершина инженерной мысли

ответить
2 anonymous 25-03-2024

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

(имхо, Linux kernel именно поэтому и считается типа охренеть каким рокетсаенсом: внутри код про алгоритмы и структуры данных, написанный на языке программирования без нормальной поддержки хотя бы ассоциативных словарей, я уж молчу о кастомных структурах)

ответить
1 anonymous 25-03-2024

Ну, на том на каком захочется на самом деле. Но вообще же даже на си можно писать как на питоне, если написать свои хешмапы и прочие структуры(Вспомним 10-е правило Гринспена: Любая достаточно сложная программа на Си или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp).

ответить
1 kitesh 24-03-2024

правильный размер команды микросервиса это 5-7 человек

Имхо это хороший rule of thumb, но со временем перестает работать. Один сервис становится слишком популярными и все пытаются в него коммитить (=команда сервиса растет), другие наоборот окаменемвают и релизятся раз в год с двумя новыми коммитами. Разделять первый сервис на несколько по факту популярности и закрывать второй выглядит странным решением.

ответить
1 evasa1nt 26-03-2024

Вот эта мысль кажется верной. Хотя я предполагаю, что если сервис популярный и в нём столько работы, что туда могут коммитить "все" и работа не заканчивается, возможно, из него что-то и имеет смысл выделить. При этом я считаю, что работа может быть "сделана" (по крайней мере, на 98%) и не любой сервис должен бесконечно "развиваться", а значит второй пример даже без учёта негативного сценария (умер/заброшен) должен случаться.

ответить