Как стать автором
Обновить

Комментарии 14

Пока речь идет о 50-100 сервисах монорепа еще как-то дышит. Но когда их становится несколько тысяч, это превращается в кошмар. Была у нас такая ситуация с монорепой на вебсервисы. Заходишь в вебморду гита (битбакет) и получаешь сообщение «загружены первые 1000 элементов, больше не могу» А тебе нужен 2067-й элемент…

Клонирование огромной монорепы к себе на локал тоже отдельная песня. Перед уходом ставишь git clone… и можно идти домой. К утру как раз склонируется.

НЛО прилетело и опубликовало эту надпись здесь
Я просто прикинул как бы это выглядело у нас и ужаснулся…

Проектов в гите десятки (ядровые функции, система расчетов, модуль пластиковых карт, универсальный кассовый модуль и т.д. и т.п. — у каждой команды свой проект и это только бэк, а есть еще фронты, пега, SAP, WBI и черт знает что еще).

И в каждом проекте сотни репозиториев — на каждую функциональную единицу свой (например, отдельный по техвыписке, отдельный по учету валютных операций, отдельно по карточкам клиентов — их вообще несколько — физики, юрики...). И в каждом репозитории как минимум десяток (а может быть и сотня и более) объектов.

Свести все это в монорепу? Вы серьезно? Как там потом что-то найти можно будет?
Тут в пределах одной репы приходится папочную структуру делать чтобы разнести объекты по типам (например — таблицы отдельно, индексы отдельно, функционал отдельно и т.п...)

Зависимостей между разными функционалами у нас полно. Мы не считаем свою архитектуру строго микросервисной, предпочитаем использовать старый добрый термин API. Фактически достаточно близко к микросервисам. Все зависимости обеспечиваются пререквизитами которые проверяются на этапе установки патча в юнит (тут много платформенной специфики, фактически при сборке патча генерируется программа-инсталлятор куда включается проверка пререквизитов по таблице где регистрируются все установленные патчи и там же регистрация патча после успешной инсталляции).

Ну и интеграционное тестирование никто не отменял. Т.е. сначала компонентное, потом бизнес, потом интеграционное и нагрузочное. И только после этого внедрение на пром.
Свести все это в монорепу? Вы серьезно? Как там потом что-то найти можно будет?
Тут в пределах одной репы приходится папочную структуру делать чтобы разнести объекты по типам (например — таблицы отдельно, индексы отдельно, функционал отдельно и т.п...)

ну, раскидать по каталогам или раскидать по репам — это просто разные способы организации, иерархии, которые могут реализовать один и тот же уровень разделения...

ну, раскидать по каталогам или раскидать по репам — это просто разные способы организации, иерархии, которые могут реализовать один и тот же уровень разделения...


Это очень разные способы организации иерархии.

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

У нас есть строгие правила ведения веток. feature, как только только она прошла компонентное тестирование и ушла на бизнес-тест, мержится в develop. Новые feature делаются только от develop и ниоткуда больше. Т.е. develop — это синхронизационная ветка.

develop мержится в мастер когда поставка ушла на прод. Т.е. мастер всегда отражает то, что стоит на проде. develop — то, что в бизнес-тесте и далее, но до прода еще не дошло.

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

А раскидать по каталогам — это просто свое личное удобство, не более.

Вот сколько у вас всего репозиториев объеденено в монорепу?

У нас в гите 205 проектов И в каждом проекте… Да черт его знает. В нашем только несколько сотен репозиторииев.

И если все это в монорепу слить, то получим репу с десятками тысяч объектов, в которой одновременно работает более сотни человек. Как всем этим управлять и кто за всем этим будет следить?

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

Я не адвокат монорепы, не знаю, с чего Вы это взяли ) Я наоборот согласен с тем, что инструменты — git и gitlab провоцируют скорее на создание все большего и большего количества микрорепозиториев (один репо — один компонент). И туда же концепция с форками. И необходимость тащить ещё интеграционные/инфраструктурные репо


И на самом деле то, что в монопереход все толкаются и мешают друг другу — ну, наверное, преувеличение. Хотя и вероятность конфликтов ниже, чем в куче мелких реп.

И на самом деле то, что в монопереход все толкаются и мешают друг другу — ну, наверное, преувеличение. Хотя и вероятность конфликтов ниже, чем в куче мелких реп.


О каких конфликтах речь?

На уровне зависимостей? Так это прежде всего вопросы правильной архитектуры, а не организации реп. Если каждый разработчик будет тащить все дерьмо из сети в проекты, ту без конфликтов никак.

С репой >1000 объектов просто неудобно работать. Даже нацти нужный объект из 1000 уже задача та еще.

Главное что непонятно — зачем? Все проблемы, описанные в статье решаются на совершенно ином уровне. Это все проблемы роста мелких команд, берущихся за проект больший, чем они могут осмыслить

Эти проблемы решаются крупными компаниями — Microsoft доработало git, чтобы скачивать только часть репозитория. Яндекс изобрел свой репозиторий Arc… В общем, нужно помнить, что ты не Гуголь и не обязательно, что механизмы, которые могут позволить крупные технологические компании, могут быть смапплены на мелочь вроде Юлы...

НЛО прилетело и опубликовало эту надпись здесь

Ха, я сталкивался с такой ситуацией в монолите. Даже бывало так, что 2 команды писали один и тот же функционал почти параллельно :)

Если хочется, например, обновить библиотеку, чтобы она обновилась во всех сервисах, нужно подтянуть новую версию в каждом репозитории. Это лишние телодвижения, которых можно избежать. И монорепо позволяет это сделать.

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

Он не может сам сориентироваться по поиску через GitLab/GitHub

Открываете корень всех проектов и листаете и ищите. Ни чем не отличается от моно репозитория. Зато когда у вас репозиторий на сервис то локально вы можете их группировать или называть как хотите. Плюс не надо тянуть 100500 сервисов над которыми вы вообще не работаете и знать не надо что там.


Ведь через Go.mod это не так просто сделать.

Выкиньте Го :) и сразу куча проблем уйдет.


Если хочется, например, обновить библиотеку, чтобы она обновилась во всех сервисах

А зачем это? Микросервис это как раз о том, что можно работать и менять только один сервис и остальным будет все равно что там внутри. К примеру, в новом сервиса хорошо заходят клиентская инвалидация с Редис 6, но это новая версия библиотеки в которой есть изменения по АПИ и это значит что фиг я протащу такое изменение в мой сервис и отдельный редис, потому что у остальных есть дела поважнее чем переводить свои сервисы на новую версию библиотеки.


Ревью сможет заняться один разработчик, у которого будет полный контекст по задаче.

Какая разница как вы храните сервисы, главное тут вот этот разработчик. И он как может быть так и не быть, без разницы монорепо или нет.


В нем вы будете видеть, что делают другие команды, или хотя бы замечать появляющиеся обновления

Я не всегда успеваю понимать что происходит в своей команде, а мониторить всю компанию это надо тратить все время и не писать ни строчки кода.


Наверное, каждый мечтает о том, чтобы было возможно локально поднимать все окружение по щелчку пальцев.

А вот это самая большая проблема — если у вас возникает такая ситуация то нет у вас микросервисов, а есть распределенный монолит. При правильной архитектуре, локально вам нужен только один ваш сервис и его состояние. А то потом вы упретесь что надо поднять 100 сервисов, а с ними еще 40 Редисов, 30 Постгресов и тд что не реально на одной локальной машине. И если это возможно все поднять на одной машине и вам такое надо то зачем микросервисы? Сделайте монолит и сразу кучу проблем уйдет :)

А зачем это? Микросервис это как раз о том, что можно работать и менять только один сервис и остальным будет все равно что там внутри.


Вот это ключевой момент. Главное — сохранение интерфейса. А внутреннюю логику можно (и иногда приходится) править. И это хорошо и правильно. Так и должно быть. Изменились требования — поправили под них логику работы одного сервиса и вся система стала работать по новым требованиям.

А вот это самая большая проблема — если у вас возникает такая ситуация то нет у вас микросервисов, а есть распределенный монолит. При правильной архитектуре, локально вам нужен только один ваш сервис и его состояние. А то потом вы упретесь что надо поднять 100 сервисов, а с ними еще 40 Редисов, 30 Постгресов и тд что не реально на одной локальной машине. И если это возможно все поднять на одной машине и вам такое надо то зачем микросервисы? Сделайте монолит и сразу кучу проблем уйдет :)


Вот этой проблемы у нас нет в силу особенностей работы. Пишем под AS/400 и все поставки тестируются на отдельном тестовом сервере. Т.е. разработка — гит — сборка из гита в артифактори — установка из артифактори на тестовый сервер — тестирвание — продвижение дальше до прома.

Тестовый сервер от прома отличается количеством данных (их там меньше) и тем, что данные на тесте деперсонифицированы. На полной копии прома идет только нагрузочное тестирование, но это отдельный сервер.

Наверное, и в других ситуациях можно организовать что-то подобное. Тогда не потребуется разворачивать всю среду на локале. И тесты будут более объективными т.к. проходить будут в близком к прому окружении — нестыковки с другими патчами там сразу вылазят.

Очень спорная аргументация. А самое прекрасное — это когда есть разработка на аутсорсе, которая не должна видеть весь монорепо, а эти ребята разрабатывают какой-то изолированный сервис… И приходится изобретать механизмы переливки.
Я уж не говорю, что Gitlab не любит монорепы от слова совсем…
Ну, и типичный кейс, когда комменты интереснее статьи

Зарегистрируйтесь на Хабре, чтобы оставить комментарий