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

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

В этом посте мы рассмотрим эти ключевые области:

  • Что такое программная архитектура?
  • Почему важна архитектура программного обеспечения?
  • Разница между архитектурой программного обеспечения и дизайном программного обеспечения.
  • Паттерны архитектуры программного обеспечения.
  • Как решить, какое количество уровней должно иметь ваше приложение.
  • Горизонтальное или вертикальное масштабирование - что подойдет вашему приложению?
  • Монолит или микросервис?
  • Когда следует использовать NoSQL или SQL?
  • Выбор подходящей технологии для работы.
  • Как стать архитектором программного обеспечения.
  • Куда пойти отсюда.

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

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

Давайте нырнем!

Что такое архитектура программного обеспечения?

Программная архитектура системы описывает ее основные компоненты, их отношения и то, как они взаимодействуют друг с другом.

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

Некоторые ключевые моменты:

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

Одно из моих любимых определений архитектуры программного обеспечения - это определение Ральфа Джонсона, соавтора книги Шаблоны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования:

Это те решения, которые вы хотели бы принять на ранних этапах проекта.

Почему важна архитектура программного обеспечения?

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

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

Многие инженеры скажут вам следующее: вам не нужно что-то переделывать. Он пожирает ваше время, как черная дыра. Это может отодвинуть дату доставки на несколько месяцев, если не дольше. И это даже не считая траты инженерных и финансовых ресурсов.

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

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

Разница между программной архитектурой и программным дизайном

Часто путают дизайн и архитектуру программного обеспечения. Давайте разберемся с этим.

Программная архитектура используется для определения скелета и высокоуровневых компонентов системы, а также того, как они все будут работать вместе. Например, вам нужна бессерверная архитектура, которая разделяет приложение на два компонента: BaaS (серверная часть как услуга) и FaaS (функции как услуга)? Или вам нужно что-то вроде микросервисной архитектуры, в которой различные функции / задачи разделены на отдельные соответствующие модули / кодовые базы?

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

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

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

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

Шаблоны архитектуры программного обеспечения

Клиент-сервер

Архитектура работает по модели запрос-ответ. Клиент отправляет запрос на сервер для получения информации, и сервер отвечает на него.

Каждый веб-сайт, который вы просматриваете, будь то блог Wordpress, веб-приложение, такое как Facebook или Twitter, или ваше банковское приложение, построен на архитектуре клиент-сервер.

Пиринговый

P2P-сеть - это сеть, в которой компьютеры, также известные как узлы, могут связываться друг с другом без необходимости в центральном сервере. Отсутствие центрального сервера исключает возможность единой точки отказа. Все компьютеры в сети имеют равные права. Узел действует одновременно как сеялка и пиявка. Таким образом, даже если некоторые из компьютеров / узлов выходят из строя, сеть и связь все еще работают.

P2P - это основа технологии блокчейн.

Модель-представление-контроллер (MVC)

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

  • Модели - представляют, как данные хранятся в базе данных.
  • Представления - компоненты, видимые пользователю, такие как вывод или графический интерфейс.
  • Контроллеры - компоненты, которые действуют как интерфейс между моделями и представлениями.

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

Микросервисы

В микросервисной архитектуре различные функции / задачи разделены на отдельные соответствующие модули / кодовые базы, которые работают вместе с каждым, чтобы сформировать целую большую службу.

Эта архитектура упрощает и упрощает обслуживание приложений, разработку функций, тестирование и развертывание по сравнению с монолитной архитектурой.

Событийный

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

Они способны обрабатывать большое количество одновременных подключений с минимальным потреблением ресурсов. Современные приложения нуждаются в полностью асинхронной модели для масштабирования. Эти современные веб-фреймворки обеспечивают более надежное поведение в распределенной среде.

Слоистый

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

Самые распространенные слои:

  • Уровень представления
  • Уровень приложения
  • Слой бизнес-логики
  • Уровень доступа к данным

Шестиугольный

Архитектура состоит из трех компонентов:

  • Порты
  • Адаптеры
  • Домен

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

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

Сколько уровней должно быть у вашего приложения?

Одноуровневое приложение

Плюсы:

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

Минусы:

  • Слабый контроль над приложением - сложно реализовать новые функции или внести изменения в код после его поставки.
  • Тестирование должно быть предельно тщательным и допускать минимум ошибок.
  • Одноуровневые приложения уязвимы для доработки или обратного проектирования.

Двухуровневое приложение

Плюсы:

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

Минусы:

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

Трехуровневое приложение

Плюсы:

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

Минусы:

  • Обычно при создании трехуровневых приложений следует прилагать больше усилий, поскольку точки связи увеличиваются (от клиента к среднему уровню к серверу, а не напрямую от клиента к серверу), а производительность, увеличиваемая с помощью таких инструментов, как Visual Basic, PowerBuilder, Delphi, будет увеличиваться. уменьшенный.

N-уровневое приложение

Плюсы:

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

Минусы:

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

Заключение

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

Горизонтальное или вертикальное масштабирование - что подойдет вашему приложению?

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

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

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

Монолит или микросервис?

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

Когда использовать монолитную архитектуру

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

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

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

Это помогает им шаг за шагом справляться со сложностью приложения по мере необходимости. Это именно то, что сделал LinkedIn.

Когда использовать микросервисную архитектуру

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

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

Каждая функция, написанная в единой кодовой базе, быстро превратилась бы в беспорядок.

Итак, мы рассмотрели три подхода к монолитным и микросервисам:

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

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

Когда лучше использовать NoSQL или SQL?

Когда выбирать базу данных SQL?

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

Транзакции и согласованность данных

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

Сохранение отношений

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

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

Популярные реляционные базы данных

  • MySQL
  • Microsoft SQL Server
  • PostgreSQL
  • MariaDB

Когда выбирать базу данных NoSQL

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

Обработка большого количества операций чтения-записи

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

Выполнение аналитики данных

Базы данных NoSQL также лучше всего подходят для случаев использования аналитики данных, когда нам приходится иметь дело с притоком огромных объемов данных.

Популярные базы данных NoSQL

  • MongoDB
  • Redis
  • Кассандра
  • HBASE

Если вам интересно попробовать такую ​​базу данных NoSQL, как MongoDB, я настоятельно рекомендую ознакомиться с курсом Николы Живковича Полное руководство по MongoDB.

Выбор подходящей технологии для работы

Взаимодействие с данными в реальном времени

Если вы создаете приложение, которому необходимо:

  • Для взаимодействия с внутренним сервером в режиме реального времени, например с приложением для обмена сообщениями или приложением для потоковой передачи аудио-видео, например Spotify, Netflix и т. Д.
  • Постоянное соединение между клиентом и сервером и неблокирующая технология на сервере.

Затем некоторые из популярных технологий, которые позволяют вам писать эти приложения, - это NodeJS и популярный фреймворк Python, известный как Tornado. Если вы работаете в экосистеме Java, вы можете изучить Spring Reactor, Play и Akka.io.

Одноранговое веб-приложение

Если вы намереваетесь создать одноранговое веб-приложение, например, распределенную поисковую систему P2P или радиослужбу P2P Live TV - что-то вроде LiveStation от Microsoft, возможно, - тогда вам нужно будет изучить протоколы JavaScript, такие как DAT и IPFS. . Ознакомьтесь с FreedomJS, фреймворком для создания веб-приложений P2P, которые работают в современных веб-браузерах.

Обычное приложение на основе CRUD

Если у вас есть простые варианты использования, такие как обычное приложение на основе CRUD, вы можете использовать следующие технологии: Spring MVC, Python Django, Ruby on Rails, PHP Laravel и ASP .NET MVC.

Простые небольшие приложения

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

Вы также можете рассмотреть другие веб-фреймворки, такие как Spring boot, Ruby on Rails, которые сокращают многословие, настройку и время разработки на несколько ступеней и облегчают быструю разработку. Но хостинг PHP будет стоить намного дешевле по сравнению с хостингом других технологий. Он идеально подходит для очень простых случаев использования.

Приложения с интенсивным использованием ЦП и памяти

Вам нужно выполнять тяжелые вычислительные задачи с интенсивным использованием ЦП и памяти на серверной стороне? Вам нужно выполнять обработку больших объемов данных, параллельную обработку или запускать мониторинг и аналитику больших объемов данных?

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

Rust - это язык программирования, похожий на C ++. Он создан для обеспечения высокой производительности и безопасного параллелизма. В последнее время он набирает популярность среди разработчиков. Java, Scala и Erlang также являются хорошими вариантами. Большинство крупных корпоративных систем написано на Java.

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

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

Изучите C ++, Rust, Scala и Java бесплатно уже сегодня.

Как стать архитектором программного обеспечения

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

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

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

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

Куда пойти отсюда

В этой статье мы затронули многое, но коснулись этой темы лишь поверхностно. Нам еще предстоит изучить REST API, высокую доступность и теорему CAP.

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

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

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

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

Удачного обучения!