Есть мнение, что монолит - это реализация какого-то конкретного архитектурного стиля, некоторые даже считают, что это самостоятельный архитектурный стиль.
На самом деле монолит - это характеристика архитектуры рассматривающая возможность раздельного развертывания и характеризующая силу зацепления между компонентами архитектуры.
Монолитные приложения могут быть созданы с использованием разных архитектурных стилей, как на рисунке выше.
Основная особенность, все же, в монолите почти всегда "Data centric" подход с единственной БД и единственной связью между БД и приложением.
На самом деле монолит - это характеристика архитектуры рассматривающая возможность раздельного развертывания и характеризующая силу зацепления между компонентами архитектуры.
Монолитные приложения могут быть созданы с использованием разных архитектурных стилей, как на рисунке выше.
Основная особенность, все же, в монолите почти всегда "Data centric" подход с единственной БД и единственной связью между БД и приложением.
Тут нужно отметить, что с архитектурной точки зрения "единственная БД" - это не совсем техническая реализация, т.е. СУБД у вас может быть несколько, они могут быть как SQL так и NOSQL и т.д. Архитектурное представление на высоком уровне не отражает физическую реализацию, а определяет назначение компонента, его обязанности, и связи.
Обдумываю в каких ситуациях можно и нужно прибегать к параллельным вычислениям, вот такой список причин получился:
- легко формулируются как параллельные таски - задача очевидным образом разбивается на типовые подзадачи, независимые друг от друга;
- тяжелая математика - очевидно, что лучше считать параллельно от основных задач;
- задача сводится к Map-Reduce - это доп. условие к первому пункту, тут понятно, что надо map-reduce-ом решать;
- обработка графики - очевидно, что это опять же компиляция 1-2 пункта, но по сути это целый класс хорошо изученных задач, поэтому хорошо бы их сформулировать отдельно.
Какие еще причины/случаи/задачи вам приходят в голову?
- легко формулируются как параллельные таски - задача очевидным образом разбивается на типовые подзадачи, независимые друг от друга;
- тяжелая математика - очевидно, что лучше считать параллельно от основных задач;
- задача сводится к Map-Reduce - это доп. условие к первому пункту, тут понятно, что надо map-reduce-ом решать;
- обработка графики - очевидно, что это опять же компиляция 1-2 пункта, но по сути это целый класс хорошо изученных задач, поэтому хорошо бы их сформулировать отдельно.
Какие еще причины/случаи/задачи вам приходят в голову?
SAGA - один из первых шаблонов для реализации транзакционной логики в распределенных системах. Он появился раньше чем микросервисная архитектура, но особую популярность приобрел вместе с микросервисами.
Идея шаблона сводится к идеи "целостность в конечном итоге", он состоит из цепочки нод, которые имеют свое состояние и работают по транзакционной модели ACID, каждая из нод либо выполняет транзакцию, либо инициирует цепочку отмены транзакции.
Взаимосвязь нод строится на базе событий, которые могут распространяться как синхронно, так и асинхронно.
Идея шаблона сводится к идеи "целостность в конечном итоге", он состоит из цепочки нод, которые имеют свое состояние и работают по транзакционной модели ACID, каждая из нод либо выполняет транзакцию, либо инициирует цепочку отмены транзакции.
Взаимосвязь нод строится на базе событий, которые могут распространяться как синхронно, так и асинхронно.
Существует несколько вариантов реализации паттерна на практике, все зависит от конечных свойств, которые нужно получить в решении:
Атомарность vs Модульность
Синхронность vs Асинхронность
Оркестрация vs Хореография
Атомарность vs Модульность
Синхронность vs Асинхронность
Оркестрация vs Хореография
Вариант атомарного, синхронного, оркестрированного поведения:
- существует одна большая распределенная транзакция (пунктир на рисунке)
- запросы получает медиатор, который принимает решение о том как исполнять запрос внутри транзакции
- существует одна большая распределенная транзакция (пунктир на рисунке)
- запросы получает медиатор, который принимает решение о том как исполнять запрос внутри транзакции
- ошибки обрабатывает так же медиатор, выполняя "откат транзакции" на уровне каждой ноды
- все запросы синхронные (например, http) и по результату запросу сразу приходит статус (медиатор ждет результата обработки)
- все запросы синхронные (например, http) и по результату запросу сразу приходит статус (медиатор ждет результата обработки)
Сегодня выпустил стрим для патронов на тему SAGA, слайды тут - https://s0er.ru/codelabs/arch_stream_18
Вопрос: в чем разница между модульностью и грануляцией?
Ответ:
- модульность - это набор требований позволяющих провести разделение системы на составные части, часто слабо зацепленные друг на друга
- грануляция - это набор требований позволяющий найти оптимальный размер составных частей, без потери функциональности
грубо говоря модульность - про то как разделить на части, грануляция - про то как не делать сильно большие или сильно мелкие компоненты.
Чтобы понять когда менять грануляцию системы, нужно учесть следующие моменты по мере уменьшения важности и влияния на грануляцию:
- функциональность (исходим из бизнес-задач при объединении или разделении)
- домен изменений (если код неустойчив к изменениям и требует слишком много правок в разных частях, то пытаемся сгранулировать правильно)
- масштабирование и производительность (адаптируем размер компонент под задачи масштабирования)
- устойчивость к сбоям (стоит задуматься в случае если гранулирование может поменять эту характеристику в лучшую сторону)
- безопасность (точно так же как и устойчивость к сбоям, иногда грануляция помогает решить проблемы требований по безопасности, тогда имеет смысл провести новые границы)
Ответ:
- модульность - это набор требований позволяющих провести разделение системы на составные части, часто слабо зацепленные друг на друга
- грануляция - это набор требований позволяющий найти оптимальный размер составных частей, без потери функциональности
грубо говоря модульность - про то как разделить на части, грануляция - про то как не делать сильно большие или сильно мелкие компоненты.
Чтобы понять когда менять грануляцию системы, нужно учесть следующие моменты по мере уменьшения важности и влияния на грануляцию:
- функциональность (исходим из бизнес-задач при объединении или разделении)
- домен изменений (если код неустойчив к изменениям и требует слишком много правок в разных частях, то пытаемся сгранулировать правильно)
- масштабирование и производительность (адаптируем размер компонент под задачи масштабирования)
- устойчивость к сбоям (стоит задуматься в случае если гранулирование может поменять эту характеристику в лучшую сторону)
- безопасность (точно так же как и устойчивость к сбоям, иногда грануляция помогает решить проблемы требований по безопасности, тогда имеет смысл провести новые границы)
👍2
YaTalks - крупнейшая конференция Яндекса для разработчиков, которая пройдет онлайн 3-4 декабря 2021 под эгидой «IT как новый космос». Приглашают каждого, кто пишет код или работает над продуктом. Вас ждут два дня интересных докладов, дебатов и дискуссий по 6 трекам Lifestyle, Backend, Frontend, ML, Mobile, Product с 80 экспертами из мировых и российских компаний. Регистрируйтесь бесплатно:
https://clck.ru/YsJYh
https://clck.ru/YsJYh
yatalks.yandex.ru
YaTalks 2023 — Yandex's premier conference for the IT community
On December 5-6, Moscow and Belgrade will host over 100 IT industry experts and scientists delivering technical presentations on development, ML, and giving popular science lectures.
👍2
Чем отличается архитектура и декомпозиция?
Преамбула
часто на митингах звучит фраза "а теперь давайте обсудим архитектуру проекта" и далее начинается обсуждение того как нужно правильно разделить программу на классы и каким образом выстроить файловую структуру проекта. На самом деле речь идет не об архитектуре, а о декомпозиции, почему так? Давайте разбираться.
Определения:
Декомпозиция — операция мышления, состоящая в разделении целого на части. Также декомпозицией называется общий приём, применяемый при решении проблем, состоящий в разделении проблемы на множество частных проблем, а также задач, не превосходящих суммарно по сложности исходную проблему, с помощью объединения решений которых, можно сформировать решение исходной проблемы в целом. (ист. википедия)
Архитектура программного обеспечения — совокупность важнейших решений об организации программной системы. Архитектура включает:
- выбор структурных элементов и их интерфейсов, с помощью которых составлена система, а также их поведения в рамках сотрудничества структурных элементов;
- соединение выбранных элементов структуры и поведения во всё более крупные системы;
- архитектурный стиль, который направляет всю организацию — все элементы, их интерфейсы, их сотрудничество и их соединение.
(ист. википедия)
Основная мысль:
На самом деле определение архитектуры приложения имеет много трактовок, но все так или иначе сходятся в том, что архитектура - это выделение главного и принятие решений о функционировании системы в целом. Процесс выработки архитектурного решения, как правило, состоит из следующих шагов:
- формулирование требований (ограничения, желаемые свойства системы и т.д.)
- анализ и выработка "правил" функционирования программной системы (общие архитектурные решения, которые помогают принимать решение при написании кода или построении архитектурных представлений)
- подготовка архитектурных представлений (как правило графическая декомпозиция системы на графические представления, разделенные на уровни абстракции)
- анализ конечных свойств системы (проверка на соответствие требования и ограничениям).
Таким образом "декомпозиция" действительно используется как составной компонент построения архитектуры программной системы, но само понятие архитектуры гораздо шире, чем само понятие декомпозиции. Так же важно понимать, что архитектурная декомпозиция строится как правило на базе функциональной декомпозиции, а не модульной или классовой.
Таким образом, если речь идет о разделении программы на классы (не о выделении интерфейсов, не о распределении обязанностей, не о выработке требований и т.д.), а только о "географическом" размещении файлов и вынесении кода в эти файлы, то это с большим натягом можно отнести к процессу построения архитектуры приложения, но правильнее всего называть "модульная декомпозиция" или "классовая декомпозиция". Архитектуре же строится по принципу "от общего к частному" и начинается со сбора и формирования требований.
Преамбула
часто на митингах звучит фраза "а теперь давайте обсудим архитектуру проекта" и далее начинается обсуждение того как нужно правильно разделить программу на классы и каким образом выстроить файловую структуру проекта. На самом деле речь идет не об архитектуре, а о декомпозиции, почему так? Давайте разбираться.
Определения:
Декомпозиция — операция мышления, состоящая в разделении целого на части. Также декомпозицией называется общий приём, применяемый при решении проблем, состоящий в разделении проблемы на множество частных проблем, а также задач, не превосходящих суммарно по сложности исходную проблему, с помощью объединения решений которых, можно сформировать решение исходной проблемы в целом. (ист. википедия)
Архитектура программного обеспечения — совокупность важнейших решений об организации программной системы. Архитектура включает:
- выбор структурных элементов и их интерфейсов, с помощью которых составлена система, а также их поведения в рамках сотрудничества структурных элементов;
- соединение выбранных элементов структуры и поведения во всё более крупные системы;
- архитектурный стиль, который направляет всю организацию — все элементы, их интерфейсы, их сотрудничество и их соединение.
(ист. википедия)
Основная мысль:
На самом деле определение архитектуры приложения имеет много трактовок, но все так или иначе сходятся в том, что архитектура - это выделение главного и принятие решений о функционировании системы в целом. Процесс выработки архитектурного решения, как правило, состоит из следующих шагов:
- формулирование требований (ограничения, желаемые свойства системы и т.д.)
- анализ и выработка "правил" функционирования программной системы (общие архитектурные решения, которые помогают принимать решение при написании кода или построении архитектурных представлений)
- подготовка архитектурных представлений (как правило графическая декомпозиция системы на графические представления, разделенные на уровни абстракции)
- анализ конечных свойств системы (проверка на соответствие требования и ограничениям).
Таким образом "декомпозиция" действительно используется как составной компонент построения архитектуры программной системы, но само понятие архитектуры гораздо шире, чем само понятие декомпозиции. Так же важно понимать, что архитектурная декомпозиция строится как правило на базе функциональной декомпозиции, а не модульной или классовой.
Таким образом, если речь идет о разделении программы на классы (не о выделении интерфейсов, не о распределении обязанностей, не о выработке требований и т.д.), а только о "географическом" размещении файлов и вынесении кода в эти файлы, то это с большим натягом можно отнести к процессу построения архитектуры приложения, но правильнее всего называть "модульная декомпозиция" или "классовая декомпозиция". Архитектуре же строится по принципу "от общего к частному" и начинается со сбора и формирования требований.
👍5❤1
Так ли важно называть вещи правильно?
По сути какая разница "классовая декомпозиция" или "архитектура приложения"? Разницы действительно нет, если, называя вещи неправильно, вы правильно выстраиваете процессы, т.е. делаете не только декомпозицию, но выработку общих проектных решений, формирование интерфейсов, анализ требований и т.д.
Неправильно использование термина - это всего лишь один из признаков, который может говорить о том, что в процессе разработки упускаются важные аспекты. Если вещи называть своими именами, то и контроль над правильной работой команды делать проще.
По сути какая разница "классовая декомпозиция" или "архитектура приложения"? Разницы действительно нет, если, называя вещи неправильно, вы правильно выстраиваете процессы, т.е. делаете не только декомпозицию, но выработку общих проектных решений, формирование интерфейсов, анализ требований и т.д.
Неправильно использование термина - это всего лишь один из признаков, который может говорить о том, что в процессе разработки упускаются важные аспекты. Если вещи называть своими именами, то и контроль над правильной работой команды делать проще.
👍2
Завел резервный канал на Яндекс Дзен - https://zen.yandex.ru/id/5f578bdf22e26e081a67cfd2
Дзен
S0ER | Дзен
Канал автора «S0ER» в Дзен ⭐: undefined
👍4
Media is too big
VIEW IN TELEGRAM
Зрители канала предложили использовать телеграм в том числе для постинга видео с канала.
Решил для начала перенести сюда несколько хороших видео и посмотреть что получится.
Внимание! Это старое видео "Три замечательные книги по алгоритмам".
Решил для начала перенести сюда несколько хороших видео и посмотреть что получится.
Внимание! Это старое видео "Три замечательные книги по алгоритмам".
👍41🔥2🤔1