Вступ

Модель-View-Controller (MVC) є кутовим елементом розробки веб-додатків протягом десятиліть. Однак, як додатки ростуть в складності і попиту користувачів, багато команд виявляють, що їх моделі - шар, відповідальний за дані та бізнес-логіку - з часом стають пляшковими. Пористо структуровані моделі призводять до тісного з'єднання, дублікованої логіки, а код бази, яка проти зміниться. Досягнення масштабності вимагає свідомого, дисциплінованого дизайну моделі. Ця стаття пропонує комплексний набір кращих практик для структурування моделей в додатках MVC, малювання перевірених архітектурних візерунків і досвіду виробництва.

Розуміння шаблону MVC

У патерна MVC відокремлює програму на три з'єднуваних компонентах:

  • Model: Керування даними, правилами бізнесу та логікою наполегливості. Це єдиний джерело правди для домену програми.
  • Переглянути: Рендери інтерфейсу користувача, як правило, за даними читання з моделі (або представлення його представлення).
  • Controller: Руки введення користувача, зв’язки оркестрів між моделлю та виглядом, і оновленням стану відповідно.

Хоча важлива модель перегляду та контролера, де більшість з резиденцій інтелектуальної складності. Модель добре структурованої дозволяє адаптувати нові вимоги, обробляти збільшений трафік та підтримувати декілька інтерфейсів (наприклад, веб, API, мобільний) без змін кешування.

Основні принципи для масштабованих моделей

Перед тим як дайвінг в конкретні візерунки, важливо внутрішнє використання декількох фундаментальних принципів:

  • Single Відповідальність: Кожна модель або клас має мати одну з найбільш чітко визначених причин для зміни. Наприклад, окремий доступ даних від перевірки бізнесу.
  • Сепарація концерну: Різні аспекти застосування (персистенція, перевірка, сповіщення та ін.) повинні бути реалізовані в різних, слабо попарених шарах.
  • Не повторіть себе (DRY): Дублікаційна логіка в декількох моделях або контролерах веде до обслуговування нічних мармелів. Замість цього витяжте спільну поведінку в багаторазові послуги або риси.
  • ]Поступова інверсія: Модулі високого рівня повинні залежати від абстракцій (інтерфейс), не бетонних реалізацій. Це дозволяє вирізати бази даних, кеш-провайдери або зовнішні послуги без рерайтингу бізнес-логіки.

Статус на сервери

Компанія Eric Evans' Domain-Driven Design є одним з найбільш ефективних підходів до масштабування моделі. DDDDD заохочує розробників для організації моделей, що охоплюють основні бізнес-мені, а не технічні проблеми.

Ubiquitous Мова

Створення загального словника, що поділяється розробниками, експертами доменів та зацікавленими сторонами. Використовуйте ті ж умови в коді, документації та розмов. Наприклад, додаток електронної комерції має бути класу, який відображає поведінку реального світу, а не загальний .

З'єднані контексти

Більші додатки складаються з декількох піддома. DDDDD рекомендує розшифровувати чіткі межі між контекстами — наприклад, окремі моделі для управління замовленням, інвентаризації та доставки. У кожному з обмежених контекстів моделі можуть бути оптимізовані для цього конкретного домену без витоку концепцій по всій межі. Ця ізоляція є запорукою масштабування команд розробки незалежно.

Агрегати

Агрегат являє собою кластер об'єктів доменного призначення, який обробляється як одиниця. При цьому, вказана , може включати і суб'єкти, всі доступні через кореневу замовлення. Цей шаблон зменшує складні відносини і спрощує транзакції.

Для більш глибокого занурення див. Запровадження Мартину Фоулера до DDD.

Архітектура

Архітектура, що має на меті організувати модель на різні логічні яруси:

  • Domain Layer: Містить суб'єкти господарювання, об'єкти значення та доменні послуги. Даний шар не має залежностей на інфраструктурі.
  • Шар застосування: Оркестр використовує випадки, координує об'єкти доменів, а також керує операціями. Він залежить від рівня домену.
  • Інфраструктура Шар: Реалізує персистентність, запам'ятовування, зовнішні API-зв'язки та інші технічні проблеми. Він залежить від рівня домену та додатків.
  • Презентаційний шар: контролери та погляди, які взаємодіють з шаром програми через інтерфейси.

Цей розділ забезпечує, що зміни до технології баз даних, стратегії кешування або UI не розпливають через основну логіку бізнесу. Також вона полегшує тестування блоку, логіку можна перевірити без зчеплення бази даних.

Репозиторії та послуги

Для збереження моделей миється і масштабується два візерунки:

Репозиторій шаблон

Репозиторійні інкапсули логіку доступу до даних, що надає вбудований інтерфейс для доменних об'єктів. Замість розсипу бази даних запитів по всій контролерах ви можете викликати . Ця абстракція дозволяє перехоплювати джерело даних (наприклад, від MySQL до PostgreSQL або навіть безсмертний магазин для тестування) з мінімальним впливом.

Сервісний шар

Послуги включають логіку бізнесу, яка не є природним чином належить до однієї особи. Наприклад, може координувати перевірку, ціноутворення та інвентаризації при розміщенні замовлення. Послуги залежать від репозиторіїв та суб'єктів доменів, але залишаються агностичними базами. Цей розділ також полегшує використання контролерів, фонових робочих місць та API.

Для подальшого читання див. Репозиторійний опис шаблону .

Об'єкти передачі даних (DTOs) і Перегляд моделей

Виконуючи повну модель домену до шару подання або зовнішніх клієнтів API створює тісний зв'язок і часто виводить непотрібні внутрішні деталі. Замість цього використовуйте ДТО для формування даних, які саме потрібні. Переваги включають:

  • Decoupling: Зміни до суб’єктів господарювання не автоматично розбивають клієнтів API.
  • Security: Чутливі поля (наприклад, внутрішні ID, часові застигання перевірок) можуть бути використані.
  • Переформанс: ДТО можна налаштувати, щоб включати лише поля, необхідні конкретним кінцевим пунктом, зменшення розміру навантаження.

Перегляд моделей слугує схожим з метою представлення шарів, що містить лише дані, необхідні для відображення (посередині логіки відображення, як форматовані дати або обчислені загальні суми).

Оптимальний доступ до бази даних для масштабування

Навіть найчистіша модель архітектури не буде, якщо доступ до бази даних не є неефективним. Ключові стратегії включають:

Індекси

Аналізуйте шаблони запитів та створюйте індекси на стовпці, які використовуються в , , а ] п. Over-indexing може уповільнити записи, тому вимірювати та контролювати.

Книжкова кавка

Використовуйте в магазинах, таких як Redis або Memcached, щоб вбити результати дорогих запитів. Впровадити в кеш-пам'яті, відповідних для вашого домену (на основі часу, приходу або інструкції).

Піхвалення і лази навантажування

Не навантажуйте великі дані в пам'ять. Використовуйте спіранальну або офсетну патологію. У ORMs увімкніть завантаження лізи для дітей, але будьте обережні проблеми N+1 запиту - коли потрібно, використовуйте навантаження на eager (наприклад, в ActiveRecord або в SQL).

Лази завантаження проти Eager Loading

Вибираючи правильну стратегію завантаження, критично важливо для виконання:

  • Завантажити Лази: Схожі дані завантажуються тільки при доступі. Це ефективний для односторонніх операцій, але може деградувати продуктивність в петлях (проблема dreaded N+1).
  • Eager Loading: Завантаження всіх необхідних відносин в одному запиту. Використовуйте, коли ви знаєте вид або послугу буде потрібно пов'язані дані. Багато ORMs підтримують явного завантаження або проекції.

Прагматичний підхід полягає в тому, щоб за замовчуванням отримувати завантаження для відомих шляхів і використовувати завантажувальні заправки тільки для рідко підключених об'єднань. Профільуйте запити баз даних під реалістичним навантаженням, щоб знайти правильний баланс.

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

Коли ваш додаток виростає за один сервер, то модельний шар повинен підтримувати розподіл:

  • Державні моделі: Уникайте зберігання даних користувача або запиту на конкретні дані в екземплярах моделі. Використовуйте ін'єкції залежностей для забезпечення беззаперечних послуг.
  • Efficient Serialization: Моделі, які будуть подорожувати по мережі (наприклад, через JSON API) повинні бути розроблені для швидкої послідовності / десеріалізації. Використовуйте DTOs, а не складні графи об'єктів з круговими довідками.
  • Database Sharding: Для надзвичайно великих даних, розділ даних по декількох базах даних. Ваш репозиторійний шар повинен анотація кричко-логічної, ідеально з стратегії маршрутизації на основі сукупного кореня.
  • Потенційна консистенція: У розподілених системах, уникайте розподілених операцій, які заблокують ресурси по всій послугах. Замість обіцяйте послідовну консистенцію, використовуючи моделі подій та міток.

Додаткові кращі практики

В'язання залежності

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

Нездатність

Якщо це можливо, дизайн ціннісних об'єктів як імітований. Безперервний клас зменшує помилки, пов'язані з ілюзацією і зливом. Крім того, незмінні моделі легше тестувати і кешувати.

Тестування в Ізоляції

Тести на блоки для послуг і логіки не повинні вимагати бази даних або каркасу, що використовуються. Використовуйте репозиторіїв або в-меморських реалізаціях. Тести інтеграції можуть перевірити наявність персистентності поведінки на реальній базі даних, але зберігати їх націлений.

Антикорупційний шар

При інтеграції з застарілими системами або зовнішніми API, будувати антикорупційний шар, який переводить між моделлю та зовнішніми моделями системи. Це запобігає зовнішніх змін від витоку в домен.

Документація та відгуки

Модельні структури часто стають опачними. Забезпечити архітектурні рішення (АДР) і виконувати консистенцію через відгуки про код. Добре доведена модель сплачує дивіденди при налаштуванні нових членів команди або перевізуванні модулів через кілька місяців.

Висновок

Складання моделей для масштабування в шаблоні МВЦ не є одноразовим дизайнерським вправам, але постійною дисципліною. Дотримуючись принципів, таких як поділ питань, застосування DDD і шарованої архітектури, а також використання репозиторіїв, послуг і ДТО, ви створюєте модельний шар, який може рости з вашим додатком. Оптимальний доступ даних, вибір правильної стратегії завантаження, і планування горизонтального масштабування додатково забезпечити вашу заявку залишається виконавцем під навантаженням. Пам'ятайте, що кожен архітектурний рішення передбачає торгівлю-офіс-статичний прагматичний, вимірювальні результати ітерувати.

Для подальшого дослідження розглянемо ]Найпопулярніші статті та Редиски з кешування . Ці ресурси дають більш глибокий погляд на візерунки, які обговорюються тут.