Для понимания того, чем мы тут занимаемся обязательно прочтите предыдущую статью:

Часть 1

Вводная

Добрый день снова, дорогие читатели!

В продолжение первой части мы сегодня будем снова пробовать разные Архитектурные стили и сегодня мы переместимся с Монолита на Сервисо-ориентированную архитектуру (Service-Oriented Architecture или SOA) на движке Factorio. Наконец-то мы не просто соберём данные, но ещё сравним их с нашим предыдущим замером различных параметров - с Monolith.

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

С этого момента я начну писать название Архитектурных стиле на английском языке, чтобы их можно было легко глазами выискивать в тексте и ещё избавиться от двузначности терминов.

Начнём!

Сервисо-ориентированная архитектура (Service-Oriented Architecture или SOA)

Немного вспомним, чем интересен данный архитектурный стиль.

Именно в нём начались первые попытки разбивать запутанные, монолитные приложения по программной логике: что-то занимается фронтом, что-то считает деньги, что-то хранит файлы, что-то взаимодействует с БД и так далее. Чтобы всё это работало относительно независимо друг другу, придумали всё соединять некой шиной - Enterprise Service Bus (далее просто "Шина"). Именно эта шина содержала в себе логику "что, куда и при каких условиях отправлять", а при этом остальные сервисы просто принимают от шины запросы, обрабатывают их и возвращают обратно в шину.

На бумаге это выглядит так, что каждый сервис можно назначить определённую команду программистов и они будут писать код под стандарты Шины не отвлекаясь на то, то твориться в соседних командах/сервисах.

Однако, если углубится в Интернет за поиском дополнительной информации по этой архитектуре, то можно увидеть по ней есть прямо множество статей, но при этом все этот стиль не рекомендуют к применению. А причина проста - она содержала кучу критически важных минусов для Продукта. При этом популярность её обусловлено тем, что именно она дала толчок для развития в сторону других Архитектурных стилей (Service-Based, Space-Based, Event-Driven и Microservices), которые мы ещё рассмотрим в будущем.

У SOA выделяют один существенный недостаток - запутанная логика в Шине. То есть когда приложение будет расширяться, всё больше и больше логики "что-куда-когда" будет заноситься в Шину, а поскольку она является критическим, связующим звеном для всех сервисов - ошибка в ней чревата сбоями в работе приложении. Плюс к командам разработки отдельных сервисов ещё появляется необходимость выделения и команды разработки Шины, работа где будет сложна: поддержка критичной для приложения компонента; постепенно растущая и запутывающаяся логика работы Шины; множество взаимодействий с командами Сервисов со своими уникальными хотелками. В общем, именно на этом аспекте и не удалось получить от Архитектурного стиля ни ускорения разработки, ни надёжности.

Когда мы будем пробовать смастерить эту архитектуру в Facrorio, мы должны будем наткнуться на ту же проблему - поддержка Шины должна будет потреблять достаточно большую долю человекочасов разработки продукта. Если это будет так и у нас - значит мы реализуем нечто похоже на то, что было в реальных приложениях на SOA-архитектуре. Конечно, реальная разработка не является игрой и поэтому тут будут ряд условностей, но без них никуда.

Предварительный план

Давайте сразу же определим основные аспекты Стиля и попробуем перевести это в игру до её начала.

Во-первых, REST API к этому моменту ещё не так был популярен для использования, а значит различные производства будут связываться через всё те же конвейера. Разница только в том, что теперь нам нужно подводить сырьё к заводу по Шине и в неё же вливать результат производства.

Во-вторых, пользователи всё так же будут приходить к нам в приложения по ЖД. И как и в Monolith'е, в SOA это должно быть единственное использование ЖД во всём продукте.

В-третьих, ни в коем случае нельзя смешивать производства, как это было в Monolith'е - если уж ответвились для создания, например, Зелёных Микросхем, то только для Зелёных Микросхем эта ветка и предназначена.

В-четвёртых, электростанция тоже будет частью одной из веток Шины. Но она будет только потреблять ресурсы с Шины, а не отдавать (электричество особо на конвейер не положишь).

В-пятых, трубы с жидкостями так же придётся вести по Шине.

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

В целом всё. На данный момент я вижу тут две сложности и одну легкость:

  • Первая сложность - я не представляю, как будет работать Шина и насколько сложно/возможно будет её обслуживать;

  • Вторая сложность - из-за всё той же Шины весь завод будет занимать кучу места, на что достаточно скоро сагрятся жуки;

  • Легкость - вертикально расти при такой схеме будет значительно проще. Главное оставлять пространство между ответвлениями от Шины.

Пока же я набросал следующую схему Шины:

В теории всё выглядит хорошо: заводы будут расширятся условно бесконечно вниз, а Шина расширяется условно бесконечно вправо и, чуть медленней, вверх. Даже есть место чтобы развернуть некоторые конвейера в случае необходимости (наверное).

Но опять же - это всё прототип, а игра не так проста и в ней явно возникнут сложности ближе ко второй половине игры. По сути тут нужно будет всегда соблюдать правило "не тулить" и оставлять место как между ветками, так и в самой Шине. Ну и нужно будет ОЧЕНЬ много конвейеров и труб...

В общем, думаю, что можно пробовать начинать...

Старт игры. Пилот

Для того, чтобы обеспечить постройку самой Шины, подключить всё к ней и при этом не испытывать проблем со стройматериалами - я в первую очередь наладил производство базовых предметов (конвейеров, заводов, манипуляторов, печей и т.д.). Для этого я по-быстрому создал небольшой заводик прямо возле ископаемых ресурсов и сделал там по примеру прошлого захода - Monolith'а. Как выяснилось, это было удачным решением т.к. предметы на Шину расходуются крайне быстро и стартового набора не хватило бы даже на то, чтобы создать самые первые производства.

Ну и для науки: видимо отныне все Архитектурные стили всегда придётся начинать с мини-Monolith'а. Это даже чем-то напоминает на MVP.

В целом мой план работает хорошо: сначала я подключил переплавку ресурсов, потом перенёс электростанцию в начало, ну и продолжил создавать различные зоны производства (шестерёнки, колбы и т.д.). Пока всё это хорошо расширяется - заводы можно расширять вниз, а Шину - вправо. А если будет достигнут лимит по расширению завода - никаких проблем не будет сделать ещё одну зону с аналогичным производством далее по Шине.

Пока я делал это всё, меня не покидало желание экономить - то расположить завод теснее, чтобы позже добраться до жуков; то сделать поменьше ширину канала в Шине. Оно и верно - по ощущениям на создание Шины и подключения к ней уходит неприятно много времени, а предметов на конвейере пока не много. В общем, это именно то, с чем приходится морально бороться с собой и не допускать подобные мысли.

Чуть позже у меня нарисовались две проблемы:

Во-первых, у меня меня достаточно быстро истощились стартовые рудник железа, меди и камня, а до ЖД было ещё далеко (я даже не успел наладить производство Зелёных микросхем для Зелёных колб). В итоге пришлось временно тащить пару путей из конвейеров от ближайшей жилы. Когда у меня будет ЖД - я переведу этот костыль на поезда, но пока только так. Относительно Продукта это означает что мы начали не укладываться в Сроки - вместо того, чтобы полноценно впустить пользователей мы всё ещё работаем с ограниченным числом пользователей. То есть у нас происходит что-то вроде закрытого Альфа-тестирования, но при этом приложение готово взять и бóльшую нагрузку - странная ситуация.

Во-вторых, я территориально разросся так, что уже начал подходить к месту дислокации Жуков. То есть мы ещё в добавок начали выходить за Бюджет. Поскольку скоро начнутся нападения (ака нападки Бизнеса на неукладывание в бюджет), я прервал наладку производства Зеленых колб и сконцентрировался на производстве оборонительных сооружений (стены, турели и патроны к ним) и Чёрных колб. На текущем этапе игры убивать их ульи крайне сложно - у меня открыто не так много исследований на военное дело, а воюю уже со Средними червями. В общем, когда "Бизнес" начинает давить на проект в плане затрат - начинается крайне нервная работа в пустую по обоснованию Сроков и Бюджета. Позже, с увеличенным уроном и гранатами, уничтожать ульи стало легче, но всё это всё равно на это потратился достаточно ощутимый процент общего времени, которое можно было бы потратить на движение по пути полноценного старта работы пользователей.

В общем, всё плохо.

Зато я, как ни странно, я не испытываю проблем с Конвейерами: как только я наладил производство Желтых Конвейеров оказалось, что их производственных мощностей хватает для поддержки как Шины, так и Завода в целом (если помните, в Monolith'е с этим были большие проблемы). В общем, как ни крути, Архитектура медленно и верно начинает себя окупать.

Сама Шина уже начинает разрастаться так, что её становится проблемно обслуживать - даже её план уже в экран не помещается. Пришлось снова чуть-чуть отвлечься от ЖД и сделать производство радаров - расставив их, смог удобней работать с картой и с разросшейся Шиной стало проще.

Ещё очень много тратится времени на расположение, строительство и подключение Шины. При этом полностью воспользоваться вместимостью этой Шины так и не смог - по её широким каналам перемещаются тонкие ручьи предметов и только в где-то в конце оно накапливается в ожидании потребления...

Ну а спустя некоторое время я вообще упёрся в большое озеро по пути хода Шины и пришлось ещё раз отвлекаться на производство земли для отсыпки территории.

В общем, одни проблемы и я не представляю, как это всё можно было бы предугадать на первоначальном этапе планирования работы с SOA. Уже прошли игровые сутки, а я даже не успел поставить производство предметов для запуска ЖД (напомню, что в Monolith'е к суткам игры мы уже завершили игру).

Из хорошего могу отметить следующее:

  • Расширять Шину и подключать к ней заводы оказалось достаточно просто, хоть и долго - по сути работает принцип копировать-вставить и дальше начинают работать дроны. Короче, достаточно монотонная работа;

  • Затыков на Шине нет - все ресурсы поступают вполне себе равномерно и есть ещё много места для роста;

  • Шину не обязательно прямо всегда строить, тратя конвейеры - редко используемые потоки ресурсов можно не вести вперёд до востребования, однако нужно не забывать всегда оставлять под них места в Шине.

И ещё отмечу один минус: всё это очень трудозатратно по предметам, по территории и по времени - бюджет на разработку явно раздуется на всё это безобразие, а начало получения прибыли всё откладывается и откладывается...

Обрастание фичами

ЖД наконец-то подключено - железо, медь и уголь полились рекой.

Уже сейчас можно заметить, что всё развитие продукта движется крайне медленно: если в Monolith'е основной проблемой было придумать как втулить то или иное запутанное производство, то здесь таких вопросов не возникает, но от этого времени и ресурсов уходит далеко не меньше.

Плюс возникает много смежных проблем: то начали кончатся конвейера для постройки Шины, то земля (пока строил на воде), то жуки вечно норовят прорвать оборону.

Ещё я заметил, что ресурсов как таковых у меня много, но вот они все застряли в неактуальных местах: то в самой Шине, то на не приоритетном производстве - в Monolith'е подобного у нас такого не наблюдалось в подобных масштабах. Зато если построить завод в текущем конце Шины, то все эти зависшие ресурсы из Шины идут именно на новое производство и мы на первое время получаем заметный прирост данный предметов. Из-за этого на графиках всегда можно заметить пик производства в самом начале, а потом оно нормализуется.

Ещё странным выглядит подключение к Шине тех производств, которые не могут быть продолжены (например, Электрические столбы, Длинные манипуляторы, Ящики). У меня возникало куча вопросов вида "зачем они здесь, ведь оно не будет давать результата обратно в Шину"? Но правило есть правило.

Жуки прямо покоя не дают: вдалеке от центра их много и они хорошо защищены. И неизвестно, что с этим можно сделать: в Monolith'е удавалось с ними мало контактировать из-за малого размера завода; в будущих Microservices'ах я предполагаю, что можно будет делать производства равномерно от центра. Но в SOA мы просто ведём Шину в одну сторону навстречу ульям на весь экран и Чудовищным червям.

Забавный случай произошёл с Шиной: когда я реализовал производство Синих колб я понял, что мне нужно будет везти их обратно в начало шины, где у меня располагаются Лаборатории. Но это оказалось не так просто т.к., во-первых, придётся вести достаточно дорогостоящие Синие колбы через весь завод, что крайне накладно; во-вторых, места для "обратного" хода конвейера внезапно не нашлось и пришлось вести их по достаточно запутанному пути, чтобы обойти все уже существующие дорожки Шины. В итоге нашлось неожиданное решение перенести Лаборатории в центр Шины, что решило эти две вышеуказанных проблемы, но добавило кучу работы по переделке Шины

Такие же проблемы были и с патронами, и ракетным топливом для поездов, и с ядерным топливом для электростанций. В общем, Шина начинает усложняться и явно не этого хотели от SOA архитекторы в своё время.

В целом по карте загрязнений можно увидеть, что активно работает только заводы в начале и конце Шины:

Объясняется это просто: в начале производства находится электростанция и переплавка руд, поэтому они "фонят" всегда и сильно. В конце находятся недавно запущенные заводы, которые ещё не успели заполнить Шину своей продукцией. Ну а в центре (преимущественно) находятся уже те заводы, которые успели отработать и остановится из-за того, что "Выход заполнен".

Есть и хорошие новости:

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

Во-вторых, сделать дублирующее производство, если чего-то не хватает, проще простого - скопировал и подключил к Шине. Например, я так делал с шестерёнками и зелеными/красными микросхемами и получил заметный прирост их производства. Главное - это вовремя сообразить, что у тебя есть нехватка чего-бы то ни было.

Касательно расширения самой Шины: ближе ко второй половине игры строить её стало морально легче - то ли из-за обилия комплектующих для неё, то ли получилось просто привыкнуть к этой работе. Но это чисто ощущение - времени на неё тратиться всё так же заметно, как и в начале.

Интересности были с электричеством:

Сначала оно кончилось просто потому-что стало поступать мало воды - пришлось переносить его со старого места ближе к озеру (по сути подключать воду в обход Шины). Позже истощилась шахта с углём начались нарушения поставки угля к бойлерам - пришлось отвлекаться и аварийно создавать ещё пару удалённых шахт угля. Ну и аккурат к переходу на АЭС я понял, что достиг максимума в использовании паровых двигателей. Конечно, можно было бы ещё попробовать как-то оптимизировать подачу пара, но благо этого не потребовалось.

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

Ну и последнее - по исследованиям:

Колб как таковых всегда хватает - делаешь производство и их всегда поступает тысячами в Шину. Но сделать производство новых видов колб реально занимает много времени. В итоге получается такая картина: быстро открываются все исследования, которые требуют тех колб, производство которых у меня уже налажена, но потом возникает долгая пауза в исследованиях т.к. для них нужны новые виды колб; потом производство новых видов колб всё же запускается и вся очередь исследования достаточно шустро открывается; потом опять начинается потребность в новых видах колб и начинается долгая пауза... Чую, что итоговый график будет похож на лесенку - посмотрим по завершению текущей игры. Напомню, что в Monolith'е была ситуация более сбалансированной: пока изучаешь текущее исследование - активно строишь заводы на новые виды колб (хотя и под конец игры этот принцип стал сбоить).

В общем, если вы используйте SOA, готовьтесь к тому, что вы будете долго-долго оставлять Бизнес без актуальных фич просто потому-что морочетесь с Архитектурой как таковой, но потом сможете выкатить всё пачкой и с достаточно большим запасом по производительности.

Рывок до конечной цели

Пришла пора начинать создание ракеты. Тут можно выделить три интересности:

Во-первых, хоть я и расширял создание Зеленых микросхем - их всё равно катастрофически мало. А всё потому-что их производство находится очень далеко от актуального производства и большая часть продукции "сжирается" по пути. И тут не помогает ни переход на Красные конвейера, ни переход на улучшенные виды заводов, ни масштабирование. В общем, индивидуальный контроль внутри Шины требует дополнительных трудовложений и ещё больше увеличивает сложность Продукта.

Во-вторых, под конец я столкнулся с похожей мыслью, что была и в начале - "Зачем мне выводить в Шину дорогостоящее производство, если можно подключить её в рядом стоящую ракетную шахту". Посмотрите сами на то, как близко располагается производство Спутников от Ракетной шахты и думаю, что у вас тоже возникнет желание не тянуть их в Шину, а подключить напрямую. Но правило есть правило.

И на этот раз это реально не окупилось - ну зачем мне полная линия дорогостоящих спутников, если достаточно одного раз в несколько часов?

В третьих, из-за перепроизводства стали кончаться уже существующие шахты/жилы нефти, меди и железа. Это странно т.к. я их достаточно много наделал когда подключал ЖД. Но, видимо, это такая особенность Архитектуры - так сказать "Цена за самоподдержание".

Итого по финалу:

  • Затрачено реального времени в 23 дня;

  • Убито жуков: 2'411'763

  • Убито червей: 3848

  • Убито ульев: 3626

Вот ещё я сделал гифку сравнения размера завода с Monolith'ом:

Сохранение

Видео

Во всей этой картине меня особенно пугает не затраченное время, не количество убитых кусак, а на почти 2.4к убитых Чудовищных червей. Не думаю, что другие архитектуры покажут такие же цифры.

В целом приложение получилось достаточно производительным и в меру удобным в плане расширения. Но уж очень громоздкое - ты идёшь на километры в одну сторону и никак ты с этой дороги не свернёшь.

Мне этом приложение напоминает старые, исполняемые файлы на Java: один большой, исполняемый файл, который просто, но долго переносить, а так же запускается он крайне медленно.

Сразу же после окончания у меня встал вопрос: "А сколько же я времени убил на развитие Шины по сравнению с остальными работами?". По ощущениям это было около 40%. Чтобы проверить это я поделил реплей на 11 частей и замерил, сколько времени я тратил на работу с Шиной. Вот результат:

В целом ощущения не подвели - 30-40% времени в зависимости от этапа. При этом можно заметить, что график достаточно равномерный и по мере развития приложения баланс количества работы над Шиной к работе над самим Приложением более-менее сохраняется.

Теперь переходим к замеру параметров данного Архитектурного стиля.

Evolvability

Тут мы сравниваем, как быстро мы провели открытия различных исследований.

В отличие от Monolith'а, в текущем Архитектурном стиле пришлось изучать ещё много чего дополнительно, чтобы справится с Жуками и построить завод на озере. Плюс был немного изменён порядок исследований - то есть у нас появился такой фактор как "Сервисные фичи". Это означает, что есть не представляющие особой ценности Бизнесу, но необходимы для того, чтобы Архитектура работала как таковая.

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

Исследование

Время для Monolith

Время для SOA

Автоматизация

00:54:35

00:31:31

Логистический исследовательский пакет

01:01:53

00:43:24

Производство стали

01:04:37

00:37:34

Логистика

01:07:14

00:30:36

Пулемётная турель

01:08:41

00:44:20

Электроника

01:12:27

00:35:22

Логистика 2

01:29:01

10:58:13

Двигатель

01:38:41

10:55:09

Железные дороги

01:46:36

10:59:24

Автоматизация железных дорог

01:54:05

11:00:32

Железнодорожные сигналы

02:04:03

11:02:00

Военная промышленность

02:04:26

01:04:27

Каменная стена

02:04:45

00:49:07

Военная промышленность 2

02:05:47

11:11:00

Военный исследовательский пакет

02:08:42

11:11:19

Продвинутая металлургия

02:16:33

11:09:18

Огнестрельный урон

02:22:54

01:54:49

Скорострельность оружия

02:27:14

01:29:43

Огнестрельный урон 2

02:35:39

11:04:50

Скорострельность оружия 2

02:44:53

11:07:44

Огнестрельный урон 3

03:21:40

19:36:24

Быстрый манипулятор

03:22:17

00:48:12

Автоматизация 2

03:22:53

11:08:08

Транспортировка и хранение жидкостей

03:23:41

11:11:51

Вагон-цистерна

03:30:01

11:14:46

Переработка нефти

03:33:41

11:19:48

Скорость лабораторий

03:38:00

11:16:14

Скорость лабораторий 2

03:48:23

11:18:45

Электроснабжение 1

03:55:13

11:40:48

Обработка серы

04:08:43

11:21:28

Взрывчатые вещества

04:11:04

11:31:50

Аккумулятор

04:18:41

11:28:04

Пластмассы

04:31:33

11:23:49

Продвинутая электроника

04:52:07

11:25:44

Химические исследовательская пакет

04:57:29

11:26:22

Пояс для инструментов

05:04:18

11:10:48

Пакетный манипулятор

05:18:05

11:34:05

Бонус вместимости манипулятора 1

05:29:31

11:44:52

Бонус вместимости манипулятора 2

05:51:40

11:47:31

Модули

06:05:41

11:29:09

Модуль скорости

06:13:55

11:29:46

Модуль продуктивности

06:21:32

11:30:23

Стационарный аккумуляторы

06:43:18

11:42:43

Продуктивность добычи 1

07:26:42

11:39:28

Огнестрельный урон 4

07:43:50

20:38:24

Ворота

07:45:57

11:53:37

Оптика

07:46:10

01:03:08

Солнечная энергия

07:53:07

11:50:58

Скорострельность оружия 2

08:07:46

11:36:23

Горючие жидкости

09:11:45

11:34:40

Дрон-защитник

09:24:49

21:53:30

Количество следующих за персонажем дронов 1

09:58:13

22:07:49

Количество следующих за персонажем дронов 2

10:48:08

22:15:10

Бетон

10:52:31

12:01:41

Продвинутая переработка нефти

10:53:51

73:35:46

Смазочная жидкость

10:54:50

74:23:11

Продуктивность добычи 2

11:21:01

74:47:59

Переработка урана

11:33:58

74:31:40

Продвинутая металлургия 2

11:50:32

74:36:51

Ядерная энергия

12:37:14

74:39:04

Производственный исследовательский пакет

12:42:13

74:37:48

Конструкция малой плотности

13:02:14

74:41:09

Ракетное топливо

13:22:09

74:52:16

Процесс обогащения им. Коварекса

15:29:05

85:48:59

Переработка ядерного топлива

15:33:37

86:21:06

Электродвигатель

15:34:31

74:23:42

Робототехника

15:35:50

74:24:22

Скорость рабочего дрона 1

15:36:51

74:27:12

Сила торможения 2

15:37:14

74:14:54

Скорость рабочего дрона 2

15:38:35

74:28:08

Сила торможения 1

15:40:28

74:12:34

Продвинутая электроника 2

16:06:20

74:34:20

Вспомогательный исследовательский пакет

16:13:01

74:48:57

Скорость лабораторий 3

16:29:44

74:17:51

Скорострельность оружия 5

17:03:17

74:17:52

Сила торможения 3

17:19:43

85:55:42

Сила торможения 4

17:43:03

86:15:55

Сила торможения 5

18:13:07

86:20:34

Блок управления ракетой

19:15:06

115:23:24

Модуль скорости 2

19:16:09

74:59:50

Модуль продуктивности 2

19:17:12

75:00:35

Модуль продуктивности 3

19:25:36

86:47:16

Модуль скорости 3

19:34:08

86:43:26

Ракетная шахта

20:34:18

115:30:55

Космический исследовательский пакет

23:24:52

115:30:01

Автотранспорт

11:54:54

Скорость лабораторий 4

74:22:41

Скорость лабораторий 5

86:01:48

Взрывчатка скал

11:52:28

Портативная солнечная панель

11:57:55

Автоматизация 3

86:04:33

Атомная бомба

116:08:47

Бонус вместимости манипулятора 3

75:02:50

Бонус вместимости манипулятора 4

86:11:14

Бонус вместимости манипулятора 5

86:28:21

Бонус вместимости манипулятора 6

86:32:29

Бонус вместимости манипулятора 7

116:11:33

Лазерные технологии

75:29:25

Личный аккумулятор

11:59:00

Логистическая робототехника

74:26:38

Логистическая сеть

11:48:15

Модуль эффективности

11:30:57

Модуль эффективности 2

75:01:20

Модульная броня

11:57:14

Мины

21:48:32

Прибор ночного видения

11:58:17

Портативный генератор электрического щита

21:57:51

Огнемет

20:46:38

Ракетостроение

21:55:27

Оборудование для игнорирования конвейеров

11:58:39

Отсыпка территории

11:32:27

Скорострельность оружия 3

21:27:26

Скорострельность оружия 4

21:45:26

Переработанное горючие 1

21:50:59

Переработанное горючие 2

22:02:52

Стальной инструмент

01:01:45

Танк

03:32:07

Тяжелая броня

02:02:24

Усиленная взрывчатка

11:56:02

Усиленная взрывчатка 2

19:08:11

Военная промышленность 2

73:32:50

Взрывные боеголовки

73:34:28

Усиленная взрывчатка 3

73:46:13

Огнестрельный урон 5

73:59:08

Скорострельность оружия 5

74:11:14

Грузоподъёмность рабочего дрона 1

74:29:56

Военная промышленность 3

115:24:17

Огнестрельный урон 6

116:15:29

Скорострельность оружия 6

116:19:24

Усиленная взрывчатка 4

116:22:02

Скорость рабочего дрона 2

116:23:00

Усиленная взрывчатка 5

116:26:28

Усиленная взрывчатка 6

116:30:22

Скорость лабораторий 6

116:32:32

Сила торможения 6

116:35:06

Сила торможения 7

116:38:54

Продуктивность добычи 3

116:44:30

Скорость рабочего дрона 4

116:45:53

Скорость рабочего дрона 5

116:48:50

Диаграмму придётся обезличить т.к. порядок исследований был нарушен. Вот график "по возрастанию" количества исследований:

Шкала оси Y - сутки; шкала оси X - исследование по порядку.

Что можно сказать по этому графику:

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

Я знаю правило по поводу увеличения количество сотрудников в проекте вида "две женщины не могут родить в 2 раза быстрее", но тут я это намеренно опустил из расчётов т.к. другой коэффициент продуктивности по увеличению количества программистов я удачно применить не могу. В разных компаниях эта формула разная: можно нанять наивысших специалистов с ЗП по 1 кв.метру квартиры в Сингапуре в месяц, но которые будут работать 24/7 и выдавать ту самую удвоенную (а то и больше) скорость разработки; а можно нанять толпу лентяев за пачку Анакома и удивляться, что ничего не ускорилось. В общем, берите пока наиболее простой расчёт от меня и накладывайте его на свой реалии.

Если разделить значения в графике SOA на 5, то получится тоже очень интересный график:

Во-первых, сразу видно, что за то же самое время мы смогли сделать значительно больше фич. Да, часть из них не требуются в Monolith'е (та же "Отсыпка территории" или военные исследования), но всё же факт есть факт. Если бы не это не приходилось бы делать, то можно было увеличивать число сотрудников команды не на 5, а на 3, но это уже утопическая лирика.

Во-вторых, как только мы в начале игры закончили Monolith-времянку, мы почти сразу же получили не хилый буст по фичам, который и не снился в Monolith'е - по сути мы его догнали по скорости. Но потом начался этап, когда нужно было поднимать производство новых видов Колб и появилась необходимость активно расширять Шину, создавая новые производства. И так до следующего буста по кругу.

В общем, это та самая "лесенка", о которой я предполагал ранее - на шаге 17 мы получили буст от Зелёных Колб и быстро изучили всё нужное, но потом появился простой до шага 65, где пришлось ждать наладку производства Чёрных колбы. Подобное было потом на шаге 79 - от Синих колб; на шаге 111 - от Фиолетовых; на 123 - от Желтых. Как то так.

Ещё можно заметить, что у нас в SOA начались первые исследования немного раньше, чем в Monolith'е - связано это с тем, что в SOA я строил временный монолит как попало (лишь бы обеспечить себя ресурсами на первое время), а потом просто всё снёс. В то же время в попытках построить Monolith я изначально пытался все строить более-менее правильно, держа в голове, что всё это будет расширяться.

В общем ситуация странная: относительно производства простоев нет и всё идёт в сторону Прекрасного Продукта, но относительно Бизнеса мы прямо очень сильно контрастируют на фоне Monolith'а по срокам и бюджету.

Ну и напомню, что из этих 5-и человек двое будут работать полностью с Шиной - это те самые 30-40% времени на обслуживание Шины, что мы высчитали ранее. Остальные 3 человека поделят между собой обслуживание производств (их 98 штук), поставку сырья (их 16 штук), а так же решению ИБ- и Бизнес-вопросов. Такие дела.

Agility

Тут мы оцениваем, насколько раньше/позже у нас произошли важные события в нашем Продукте.

Таблица по производству и прочим событиям:

Событие

Время для Monolith

Время для SOA

Первая лаборатория (временная)

не применимо

00:27:48

Временный Монолит закончен

не применимо

00:53:56

Начало создания основной архитектуры

не применимо

01:01:45

Первая лаборатория

00:52:56

04:23:26

Заканчивается стартовая железная жила - прошлось вести новую жилу

неизв

06:41:36

Первый конфликт с ульем (мешают строить)

не применимо

07:46:42

Второй конфликт с ульем (мешают строить)

не применимо

08:03:27

Закончилась стартовая железная жила

неизв

10:14:53

Производство зелёных колб

01:12:27

10:45:49

Заканчивается стартовый уголь - прошлось вести новую жилу

неизв

13:24:36

Производство черных колб

02:24:34

17:26:03

Заканчивается стартовая медная жила - прошлось вести новую жилу

неизв

18:04:07

Первая атака жуков

08:10:37

25:26:04

Организовано ЖД производство

02:22:17

25:53:13

Начато строительство ЖД

03:38:32

29:35:23

Запущена ЖД (железо)

06:35:07

31:54:15

Убрано старое производство (железо)

06:48:43

34:34:15

Запущена ЖД (медь)

неизв

35:00:44

Запущена ЖД (камень)

19:32:27

41:01:31

Производство красных конвейеров

01:44:19

43:50:51

Запущено выкачка нефти

09:08:44

54:00:33

Производство пластмассы

10:04:01

61:52:19

Производство серы

неизв

62:21:09

Производство красных микросхем

неизв

64:27:02

Производство синих колб

10:43:45

67:33:56

Перенесена электростанция #1

не применимо

72:00:40

Перенесена электростанция #2

не применимо

73:28:38

Производство мазута, дизеля и смазки

11:04:12

73:35:46

Производство соляной кислоты

11:20:06

79:43:12

Добыча урана

12:03:17

79:59:50

Производство фиолетовых колб

12:59:12

85:22:43

Кончилось электричество (уголь)

не применимо

90:19:01

Восстановлено электричество

не применимо

91:15:00

Поезда переведены на ракетное топливо

16:11:20

92:26:58

Переработка урана

12:20:23

93:40:32

Процесс обогащения урана запущена

15:33:37

94:00:02

Запущена АЭС

18:52:05

99:51:49

Запущено производство синих микросхем

16:35:14

103:13:26

Запущено производство конструкций малой плотности

неизв

107:37:10

Отказ от сжигания угля

22:20:34

110:48:18

Запущено производство жёлтых колб

18:02:56

115:00:36

Запущено производство блоков управления ракетой

19:15:50

115:48:54

Запущено производство ракетных шахт

20:56:03

118:35:23

Запущено производство частей ракет

21:01:03

119:40:38

Запущено производство спутников

23:19:52

119:58:51

Ракета собрана

23:18:24

122:41:01

Запущена ракета

23:47:36

122:41:41

Переключено переплавка железных и стальных плит на ЖД

07:27:15

не применимо

Новая атака жуков (от загрязнения)

14:11:00

не применимо

Опять же, некоторые события случались только в Monolith'е или только в SOA, поэтому график будет немного "рваным":

Читать это график следует следующим образом: выбираем нужно событие и смотрим, когда оно было в Monolith, а когда в SOA и, отдельно, в SOA/5 (с увеличенной в 5 раз командой). Например, тут можно заметить, что первую атаку жуков мы спровоцировали значительно раньше Monolith'а, а так же значительно позднее запустили ЖД. Зато запустили ракеты и АЭС мы почти одновременно при в случае "SOA/5". Ну и с чистым SOA сравнивать смысла нет т.к. в этом случае позднее будет абсолютно всё.

В общем:

  • Запуск АЭС - одновременно, при увеличении количества команды в 5 раз;

  • Отказ от сжигания угля - одновременно, при увеличении количества команды в 5 раз;

  • Запуск ракеты - одновременно, при увеличении количества команды в 5 раз.

Можно ли считать тогда считать, что в плане финальных целей SOA идентичен Monolith'у, но просто требует больше "рук"? Вопрос спорный и поэтому придётся посмотреть ещё на другие особенности Архитектурного стиля SOA.

Configurability

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

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

Цифры прироста, правда, не особо впечатляющие:

Конфигурирование

Прирост производства для Monolith

Прирост производства для SOA

Красные микросхемы на синие колбы

222,22%

Зелёные микросхемы на модули управления ракетой

900,00%

Железные плиты на стальные плиты

150,00%

Добавление завода шестерёнок

325,53%

Добавление завода зелёных микросхем

240,96%

Добавление завода красных микросхем

185,34%

Добавление завода кабелей

175,00%

Добавление завода пластмассы

220,00%

Добавление переплавки железа

185,19%

Добавление переплавки меди

203,45%

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

Cost

Тут мы определяем, какую площадь завода и потребление его электроэнергии - это прямое отражение стоимости одного запущенного приложения.

Собственно, большие проблемы с Жуками связаны исключительно с занимаемой площадью приложения. Сравните его с Monolith'ом:

Параметр

для Monolith

для SOA

Площадь общая (любые постройки)

3402 m2 (100%)

4466850 m2 (131300%)

Площадь полезная (производственные здания)

2425 m2 (100%)

1831119 m2 (75510%)

Энергопотребление

125 МВт (100%)

283 МВт (226%)

Это ужасает - площадь приложения на SOA больше примерно в тысячу раз Monolith'а и всё это вина Шины. Хотя при этом потребление электроэнергии сравнительно маленькая - связано это с тем, что не все производства в нём работают одновременно (см. карту загрязнений).

Собственно, подобные площади очень сильно сказались на следующем эксперименты - Deployability.

Deployability

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

Я то думал, что за счёт того, что моё производство всяких строительных расходников многократно превышает то, что было в Monolith'е и я смогу значительно быстрее развернуть второй экземпляр Завода. Но, к сожалению, сам Завод разросся до таких объёмов, что получилось ещё хуже, чем в Monolith по времени:

Событие

для Monolith

для SOA

Нехватка конвейеров

200 минут

-

Запущено второе производство конвейеров

248 минут (100%)

1700 минут (685%)

Полный запуск второго завода

473 минут (100%)

2467 минут (521%)

В общем и целом, большие объёмы дали о себе знать - на то, чтобы развернуть копию завода ушло в 5 раз больше времени, чем на Monolith. Эта цифра связана не со сложность приложения, а исключительно с большим объёмом - большую часть времени я просто либо что-то строил по плану, либо ждал расходников.

Сохранение

Scalability/Perfomance/Testability

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

При тестировании производительности мы, как всегда, даём бесконечный буст сырья (железо, медь, нефть и прочее) и смотрим, какую производительность покажет производство Частей ракет и Спутников. Тут есть интересность: если в Monolith'е мы получали буст производства в течении нескольких минут, то в SOA на это уходит чуть меньше часа - сырьё долго идёт производственный путь с начала Шины до целевых производств.

На скриншоте видно, что мы подключили бесконечное сырьё ~54 минут назад, а производство начало уверено расти только ~4 минуты назад

Более того, если подождать ещё, то можно заметить, что оно ещё и медленно разгоняется и ждать стабилизации производства приходится достаточно долго - около 12-ти часов.

Тем не менее рано или поздно оно стабилизируется и можно снять параметры и сравнить с Monolith:

Производство

Производство базовое (контрольное)

При вертикальном масштабировании

При горизонтальном масштабировании

Части ракеты (SOA)

148 ед/час (100%)

200 ед/час (135%)

390 ед/час (263%)

Части ракеты (M-th)

99 ед/час (66%)

110 ед/час (74%)

192 ед/час (129%)

Спутник (SOA)

27 ед/час (100%)

32 ед/час (118%)

67 ед/час (248%)

Спутник (M-th)

2 ед/час (7%)

2 ед/час (7%)

3 ед/час (11%)

В качестве 100% мы берём контрольные измерения производства Частей ракет и Спутников от SOA и сравниваем его с масштабированием и цифрами от Monolith. Как видно, прирост производительности получился большой. Более того, здесь значительно лучше показывает себя вертикальное масштабирование, а вот горизонтальное не сильно лучше Monolith'а. Ещё радует значительный прирост производства спутников: не смотря на то, что в Monolith и в SOA у нас на них был только один единственный завод - за счёт обилия расходников его производство возрастает многократно.

Что по тестированию:

Производство

Производство базовое (контрольное)

Тестирование на бесконечный спавн Конструкций малой плотности, Блоков управления ракетами, Ракетного топлива и Спутников

Тестирование на бесконечный спавн Плат всех цветов, Медных, Стальных и Железных плит, Ракетного топлива, Статичных аккумуляторов, Солнечных панелей и Радаров

Тестирование на бесконечный спавн Медных, Стальных, Железных и Пластмассовых плит, Серы и Дизельного топлива

Части ракеты (SOA)

148 ед/час (100%)

1000 ед/час (676%)

335 ед/час (226%)

148 ед/час (100%)

Части ракеты (M-th)

99 ед/час (100%)

757 ед/час (764%)

100 ед/час (101%)

99 ед/час (100%)

Спутник (SOA)

27 ед/час (100%)

Вне учёта

81 ед/час (300%)

27 ед/час (100%)

Спутник (M-th)

2 ед/час (100%)

Вне учёта

47 ед/час (2350%)

2 ед/час (100%)

Время, затраченное на организацию тестирования (SOA)

04:52

17:10

20:38

Время, затраченное на организацию тестирования (M-th)

04:23

14:23

09:10

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

В плане времени видно, что SOA более предсказуема чем Monolith т.к. чем более сырьевое производство мы делаем, чем больше мы на это время тратим. Но не из-за попыток придумать КАК подключить тестирование, а больше из-за выбора места КУДА подключить. Зато за счёт ширины Шины получается дать больше сырья и, соответственно, получить больше производительности.

Elacticity

Тут мы просто высчитываем некое число эффективности скорости разворачивания к фактическому приросту производительности для сравнения.

На основании Deployability и Perfomance, можно сказать, что за 2467 минут мы получаем прирост на 163% частей ракет и на 148% спутников. Итого, умножаем это:

  • Части ракет: 1.63х2467=4021.21

  • Спутники: 1.48х2467=3651.16

Для сравнения, в Monolith'е у нас были числа 444.6 и 236.5 соответственно - то есть в нём за меньшее время мы получили большее число производительности при Горизонтальном масштабировании, а значит Monolith эффективней SOA в этом плане.

Domain Partitioning

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

Основные зоны производства стоят параллельно Шине и, хотя они плотно находятся друг к другу по бокам, но вниз у каждого из них есть место для роста - собственно это помогло ранее сделать Вертикальное масштабирование. Так что как таковых плотно стоящих зон у нас не наблюдается, но и возможность расширения только в одну стороны сложно назвать "Хорошо разграниченной зоной". Думаю, что с этого момент введём новое состояние зоны "С ограничениями" - то есть расширяться можно, но не в любую сторону.

Итого:

  • Хорошо разграниченных зон: 16

  • Плотно стоящих зон: 0

  • С ограничениями: 98

Думаю, такое количество зон "С ограничениями" мы будем наблюдать только в SOA, но это не точно.

Что бесспорно, это у нас стало лучше, чем было в Monolith'е:

Abstraction Level

Тут мы высокоуровнево обозначаем части продукта по назначению и смотрим, как сильно оно перемешано:

Если проанализировать уровень абстракции, то тут в основном всё замечательно: Ресурсы добываются где-то в стороне, от ЖД начинается Шина и по всей её длине идёт Основной завод, изредка переключаясь на "Переработку ресурсов" и ещё реже на "Хранилище". На этом уровне всё выглядит достаточно комфортно для понимания принципа работы приложения, что нельзя было сказать про Monolith.

Сравните, ради интереса, с тем, что у нас было в Monolith'е:

Fault Tolerance

Тут мы пробуем сломать наш завод путём DDoS- и хакерской атак.

С жуками просто: они прорвали оборону через 125 минут. При этом под раздачу попал не сам завод, а точки добычи ресурсов и пути к ним. А без добычи ресурсов сырьё просто кончилось и всё встало.

С вторым вариантом (имитация DDoS) вышло интересней - на то, чтобы полностью застопорить работу завода путём посылания "паразитных" поездов (трафика), ушло 7:40:19 (почти 8 часов) времени.

По количеству поездов ситуация следующая:

Событие

для Monolith

для SOA

Базовое количество поездов

19 (100%)

40 (100%)

Проблема стала видимой

33 (173%)

109 (272%)

Началось снижение производительности производства

68 (357%)

219 (547%)

Полная остановка производства

110 (578%)

221 (552%)

Поскольку в данном Архитектурном стиле ЖД играет более значимую роль из-за своих объёмов, то и она оказалась более стойкой к большому количеству поездов. По сути, если не считать мелкие улучшения и проблему с кольцевой дорогой - производство упало только под конец, когда станции просто не могли обменяться друг с другом поездами из-за занятости обоих. Хотя в процентном соотношении разницы не очень много, конечно, но мы тут больше смотрим на количество поездов.

Deadlock на кольцевой дороге:

По финалу ЖД застопорилось примерно вот в таком виде - поезда просто упёрлись в установленный лимит составов на станциях и не могли двигаться т.к. им просто некуда ехать:

Если отключить лимит на станции, то станет только хуже - поезда начнут двигаться более хаотично и просто заблочат проезды другим поездам:

Сохранение

Общий вывод по SOA

Если сравнивать с Monolith'ом, то можно выделить следующие достоинства SOA:

  • Значительно больший запас производительности - продукт реально сможет как принять больше нагрузки изначально, так и иметь значительно больший прирост производительности при масштабировании. Плюс при запуске новой фичи она сразу же имеет возможность принять большую нагрузку "по умолчанию";

  • На описании продукта на уровне абстракций получается вполне логичная и понятная схема взаимодействия вида [Сырьё]->[ЖД]->[Шина]->[Обработка сырья]->[Шина]->[Производство]->[Шина]->[Ракета]. Так же это очень хорошо сказывается на возможности добавления новых производств в Продукт - всегда просто сообразить, куда добавить новое производство (спойлер: тупо в конец);

  • Удобство тестирования - подключить к какой-либо части Шины бесконечные ресурсы для проверки производительности значительно проще осуществить, чем в Monolith'е;

  • Получается более развитая система точки входа для пользователей в плане нагрузки, включая DDoS - при этом она получается такой сама собой просто эволюционно по мере создания Продукта;

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

Но недостатков у неё имеются:

  • Значительно более поздний запуск первых пользователей из-за технологических аспектов Архитектуры, что вызывает множество вопросов со стороны Бизнеса относительно сроков;

  • Необходимость тратить много человеко-часов и ресурсов на поддержание работы Шины - это сказывается на увеличенный Бюджет, чему Бизнес рад не будет. Сама работа оказалась не сколько сложной и запутанной, сколько большой и монотонной;

  • Получается очень большое приложение, что негативно сказывается как на Горизонтальном масштабировании, так и на необходимость тратить Бюджет на дополнительные серверные ресурсы. При этом прирост производительности при масштабировании не идёт ни в какое сравнение с получаемым увеличением производительности.

Как говориться, "Долго, дорого, качественно". Получается, что все недостатки SOA связаны именно с Бизнесом и его неудовлетворённым желанием выпустить продукт быстро и дёшево - именно поэтому SOA имеет столь негативную славу. Если Бизнес захочет новую фичу - он будет привлекать как минимум двух программистов (Шины и Сервисов) и ещё достаточно долго ждать, когда они договорятся и сработаются между собой.

Да, у нас получается достаточно структурированное и производительное приложение и любой программист бы им гордился, но если со стороны Бизнеса эти расходы не окупятся - приложение уйдёт в раздел "Провальные". Так что применять SOA стоит только при отсутствии конкуренции, спешки и необходимостью большого запаса производительности.

В следующей передаче - Service-Based Architecture или SeBA

В следующей статье мы продолжим идти по хронологическому порядку развития Архитектурных стилей и перейдём на Основанную на сервисах архитектуру (Service-Based Architecture или SeBA). Исторически команды, познав горький опыт использования SOA начали думать, что делать дальше и решили (наконец-то) заменить громоздкую шину на REST API.

Что из этого у них получилось - узнаем в следующей статье! А пока я временно прощаюсь с вами, душевно благодарю за прочтение моей работы и ухожу опять на полгода запускать новую игру с нуля - пожелайте удачи, ибо я вам этого тоже желаю ;)

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


  1. Vizmaros
    26.11.2022 23:38

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

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

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


  1. lgorSL
    27.11.2022 02:42
    +1

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

    Кроме того, в факторио есть логические элементы, позволяющие считать количество и тип вещей на конвейере и ещё закрывать/открывать подачу по конвейеру. Этим практически никто не пользуется, но так можно собирать всякие прикольные штуки.
    Например, в моде diggy смешанные руды, можно подключить все буры на один конвейер и сделать, чтобы в зависимости от количества железа/меди/угля на базе включались те или иные буры.
    Я не пытался делать такое в масштабах базы, но для медленных производств делал один закольцованный конвейер, на который по необходимости докладывались/убирались ресурсы. Например, производство какой-нибудь науки - ресурсов требуется несколько видов, но в небольшом количестве и тянуть много конвейеров лень.

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

    Условно, потребитель передаёт в сеть сигнал -3 железа, производитель складывает количество железа на участке в 10 клеток с сигналом, сравнивает с нулём, и если меньше - досыпает нового железа на шину.
    Если потребителей станет больше, из сигналы просуммируются и для подачи на шину "запросился" бОльший поток нужного ресурса


    1. Aspos
      27.11.2022 05:47

      Вот это, по-моему, самый эффективный способ если максимизировать отдачу при минимальных ресурсах. Только геморрой с настройкой.


      1. Nifanin Автор
        27.11.2022 11:13

        Спасибо!

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

        Именно в этом аспекте я пытаюсь сделать статью: мне нужно сделать не идеальное приложение, а именно оценить плюсы и минусы каждого Архитектурного стиля.

        Но работы много ещё)


        1. OKYHb37
          28.11.2022 14:01

          @Nifaninты конечно молодец! Я давно подсознательно сравнивал Факторио с разработкой, но так как ты считать и заворачивать производство, это конечно бомба.

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

          Пробовал как и ты реализовывать оба варианта и полностью подтверждаю все твои выводы. SOA конечно крута по производительности, но строить это все, особенно тащить ресурсы из конца в начало это жесть)) Играю не на ванильнке, а на Бобе, и это прибавляет 100500 проблем к тому, что ты описываешь)

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


    1. nidalee
      27.11.2022 06:04

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

      Программистское порно с 16:15.


    1. Nifanin Автор
      27.11.2022 11:09
      +1

      Да, спасибо за отзыв!

      В SOA же используется Шина, а это уже внутрипрограммная логика, поэтому я тут использовал конвейеры: во-первых, потому-что я установил такие ассоциации в первой части; во-вторых, чтобы потом не повторяться, когда буду делать EDA.

      Касательно логических сетей - я их не использую т.к. я не смог придумать ассоциацию для них в реальной разработке. То есть ЖД - это сеть; конвейера - функции; логическая сеть - хз. Ну и для более точных измерений мне нужна как можно менее нагруженная игра и логическая сеть вносит сюда фактор оптимизации, на которую придётся потратить время и которая собьёт графики в положительную сторону. В общем, я пока не готов к этому.

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

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

      Я думал использовать ЖД, но проблема в том, что у меня тут на схеме ЖД является сетью, а в это уже ближе к API и/или очередям. Я буду ещё использовать подобную схему с ЖД, но уже в Архитектурном стиле "Событийно-управляемая архитектура (Event-Driven Architecrute или EDA". Вот схема и, как видите, она чем-то похожа на SOA:


  1. dfgwer
    27.11.2022 03:13
    +2

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


    1. Nifanin Автор
      27.11.2022 11:16
      +5

      Спасибо за совет.

      Тут только есть одна проблема - из моего окружения в ЭТО играть никто не хочет :)


      1. Vizmaros
        27.11.2022 11:20
        +1

        Мультиплеер это для нового сезона статей


        1. FreeNickname
          28.11.2022 02:34
          +1

          ...который начнётся через 2 с половиной года :)

          ...и который я с удовольствием, тем не менее, буду ждать))


      1. OKYHb37
        28.11.2022 18:33

        Я системный аналитик, с радостью бы составил тебе компанию)))


  1. yatanai
    27.11.2022 06:48
    +7

    Ох боже... Наткнулся на эту игру когда работал как HDL программист. В итоге я построил внутри игры FPGA модуль с трассировкой, памятью, специальными функциональными блоками(прим. печи) и IO. Вышло грамостко но позволяло мне малой кровью переоборудовать любую цепочку производства. А на поздних этапах, собрав несколько таких "схем" можно было спокойно занятся только разработкой новых месторождений и прокладки дорог к ним.


    1. Akela_wolf
      28.11.2022 20:51
      +1

      Ох тыж, красота! Вдохновляюще прозвучало. Надо в очередной раз запустить Factorio и что-нибудь такое нестандартное придумать.


  1. Vantela
    27.11.2022 10:57

    Может быть не стоит пихать в шину все подряд?:)

    Мне очень нравится компоновка как у Nilaus.

    Строка для поиска: Factorio Base-In-A-Book (название плейлиста этого ютубера)

    Я играл с такой компоновкой. Это действительно очень экономично.


    1. Nifanin Автор
      27.11.2022 11:23
      +1

      Спасибо за совет)

      Я думал, как сделал лучше с Шиной и не пихать на всё подряд, но не придумал - если отступить от применённой мной конфигурации, то получается не SOA, а просто очень большой Монолит. В целом, он тоже имеет право на жизнь и, возможно, я ещё переиграю. Но пока так)

      По поводу туториалов из Интернета - я их намеренно не использую т.к. моя задача - стараться максимально точно воспроизвести работу типичной Продуктовой команды разработчиков. Именно "типичную" - со всеми их косяками, костылями и прочее. В итоге я использую не готовые, идеальные знания/схемы для игры, а стараюсь самостоятельно, на лету генерировать решения - именно так работают программисты в общей массе, ИМХО.

      Короче, это Архитектурная статья и она рассказывает не про идеальный мир, а про реальный со своими достоинствами и недостатками - именно это я и стараюсь не упускать.


      1. mrsantak
        27.11.2022 12:31
        +5

        Я думал, как сделал лучше с Шиной и не пихать на всё подряд, но не придумал - если отступить от применённой мной конфигурации, то получается не SOA, а просто очень большой Монолит. В целом, он тоже имеет право на жизнь и, возможно, я ещё переиграю. Но пока так)

        Когда вам нужно создать хеш-мапу, вы не идете в сервис по созданию хеш-мап, вы просто пишете new HashMap(). Когда вам нужно опустить строку в нижний регистр, вы не идете в сервис по опусканию строк в нижний регистр, вы просто пишете toLowerCase().

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

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

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

        В таком случае вам нужно воспроизвести еще 3 сценария:

        1. Работа в команде в параллель.

        2. Подключение нового человека к существующему проекту.

        3. Возвращение разработчика в проект после перерыва.

        Вот на этих сценариях SOA (по сравнению с монолитом) засияет новыми красками.

        Именно "типичную" - со всеми их косяками, костылями и прочее

        Но вы как раз и отказываетесь вставлять костыли в угоду "чистой архитектуре". А это ведь тоже важное свойство архитектуры - устойчивость к костылям, когда нужно запилить фичу здесь и сейчас не считаясь ни с чем. В реальном проекте такие штуки рано или поздно будут возникать хотим мы того или нет. И хорошая архитектура позволит вам вставить такой костыль, а потом его относительно безболезненно извлечь.


        1. Tarakanator
          28.11.2022 10:25
          +2

          Первую игру в монолит я забросил т.к. задолбался его переделывать.
          вторую игру я забросил, когда задолбался делать выводы для шины.
          Третья моя игра будет тоже с общей шиной, но не с микросервисами (забрает с шины комплектующие, выдаёт продукт), а с макросервисами (забирает с шины БАЗОВЫЕ ресурсы-выдаёт продукт) это сильно уменьшит шину за счёт снижение количества видов ресурсов, которые надо транспортировать.


  1. Dancho67
    27.11.2022 11:23
    +1

    В свое время мы с товарищами тоже прошли путь от макаронно-монолитной фабрики до микро-"цеховой" архитектуры с шиной на поездах, которым немного пропатчили мозги модом LTN. Особенно приятно, когда ты впервые пробуешь перенести архитектурные принципы из реальных проектов в игру, и понимаешь что они работают. Единственное, что пока не смогли перенести в игру - это оркестрацию с последующим автоматическим масштабированием, но эта проблема была закостылена книжкой со всеми нужными чертежами и строительный пауком, что позволяло развернуть новый цех за 5-10 минут, включая сюда его полную настройку для работы.


  1. TitaniumLexa
    27.11.2022 11:24

    Вау, прекрасная статья, я поражаюсь вашей стойкости.
    Удачи, будем ждать, йей!


  1. 9982th
    27.11.2022 12:11
    +3

    Прежде всего хочу сказать, что играть вслепую, не пользуясь чужим опытом и рецептами, — это именно то, как надо проходить Factorio в первый раз. Эта игра в первую очередь про борьбу со сложностью, а суметь победить сложность разработкой собственный, а не копипастом типовых решений — это весьма полезный опыт. Но когда вы закончите с этим проектом, попробуйте познакомиться с общепринятыми лучшими практиками, особенно с использованием поездов и настоящей service-oriented architecture, в Factorio известной под именем city blocks (ту самую, название которой обыгрывается в видео в этом комментарии).


    Собственно говоря, main bus в Factoio похожа на шину сообщений в SOA только названием. Вы не можете просто описать интерфейс сервис-шина и ожидать, что она сама займется маршрутизацией сообщений до потребителей. Вооружившись теорией графов и пространственным воображением можно показать, что вашу шину можно преобразовать в спагетти-монолит просто расположив те же и так же связанные сборочные автоматы более компактно. Кстати говоря, если вместо еженедельной войны с бизнесом в качестве метода проектирования использовать водопад и заранее рассчитать объемы производства необходимые для запуска ракеты до начала строительства — то окажется, что значительная доля мощностей была и не нужна вовсе.


    Я знаю правило по поводу увеличения количество сотрудников в проекте вида "две женщины не могут родить в 2 раза быстрее"

    Вот два свежих мировых рекорда в категории Any% (где можно изменять настройки генерации ресурсов на карте): одиночный, менее чем за полтора часа, и мультиплеер в количестве девяти восьми человек, за… час. И надо думать, с планированием и коммуникацией дело обстояло куда лучше, чем в типичном проекте.


    И, собственно, то, из-за чего я собственно и пишу этот комментарий: тестировать подходы к проектированию базы запуская одну ракету — все равно что тестировать варианты архитектуры веб-сервера на одном соединении. Эндгейм в Factorio начинается с запуска ракеты. Закончив на этом моменте вы просто не успеваете столкнуться с теми узкими местами и проблемами, для решения которых все эти распределенные архитектуры и создавались. Чтобы оценить производительности базы используют единицу измерения RPM (rockets per minute) которая в свою очередь равна тысяче SPM (science per minute), количеству science pack каждого вида, которые база способна стабильно выдавать. При попытке стабильно получить хотя бы 1 rpm имеющиеся подходы к проектированию, скорее всего, придется значительно пересмотреть.


    1. IDDQDesnik
      27.11.2022 13:32

      https://www.twitch.tv/colonelwill 8K SPM без модов в мультиплеере.


  1. mctMaks
    28.11.2022 11:59
    +3

    на шине не заметил балансировку и равномерный отбор ресурсов, для 4 конвейеров схемы весьма простые. Или лесенка делителей (сплитер) имеет приориты выхода на одну сторону?

    В контексте архитектуры, это должно иметь значение, ведь первый "жадный" пользователь съест почти все ресурсы, не оставив последнему ничего.


    1. Nifanin Автор
      29.11.2022 21:01

      На самом деле как работало стоковое распределение из Шины меня вполне устраивало и поэтому я не стал там что-то менять. Если бы не устраивало - я бы это быстро бы заметил и начал что-то придумывать.

      Я, ради интереса, попробовал поставить счётчики на подобную схему

      В итоге результат был такой:

      Сейв

      То есть при такой схеме от любого ответвления уходит только 1/8 всего потока, что меня вполне устраивало

      Это можно увидеть на скриншоте из той игры, что я делал по статье:

      И, по сути, единственное место, где наблюдается "жадные" ветки - только в тех местах, где уже дальнейший ход предметов невозможен:

      То есть как раз где-то в конце, где всегда находятся последние и актуальные заводы. Именно поэтому я написал в статье:

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