Етап 8. Серверна бізнес-логіка: де живуть правила компанії

Розробка на PHP і Yii2, робота з MySQL, оптимізація запитів і кешування через Memcached. Чому бізнес-правила мають жити на сервері, а не в інтерфейсі.

Етап 8. Серверна бізнес-логіка: де живуть правила компанії
INGELLO / BUSINESS3033

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

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

Що відбувається на етапі

  • Розробка на PHP (Yii2).
  • Робота з MySQL, оптимізація запитів, кешування (Memcached).
  • Керування залежностями через Composer.

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

Що Ви отримуєте на виході

  • Базу даних зі схемою, яка повторює модель із технічного завдання, і міграції для її зміни.
  • API з документацією, за яким працюють інтерфейси, мобільний застосунок і зовнішні системи.
  • Адміністративну панель для керування даними.
  • Бізнес-правила, права доступу й розрахунки, які перевіряються на сервері під час кожної дії.
  • Журнал подій: хто, що і коли зробив у системі.

Скільки коштує розробка серверної частини

У прайсі Ingello етап серверної бізнес-логіки коштує від $0 до $4700, ціну фіксуємо до початку робіт. Нижня межа означає, що окремий бюджет на етап потрібен не в кожному проєкті. Усередині діапазону ціну визначають:

  • кількість сутностей, статусів і зв'язків між ними;
  • скільки бізнес-правил і розрахунків: ціни, знижки, повернення, нарахування;
  • скільки ролей і наскільки детально розкладено права;
  • чи потрібне перенесення даних зі старої системи;
  • яке навантаження очікується і де потрібен кеш.

Чому правило має бути в одному місці

Якщо умову «знижка не більше 30%» прописано в інтерфейсі, у звіті та в імпорті, то рано чи пізно ці три копії розійдуться. Одне правило, одне місце. Інтерфейс його показує, сервер його охороняє.

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

Як це виглядає на реальних проєктах

В адміністративній системі автобусного перевізника BusTicket права розкладено за ролями до рівня дій: для кожного розділу окремо «переглядати», «редагувати» і «повний доступ». Диспетчер не видалить рейс, перевізник не побачить чужих бронювань, агент не залізе в зарплати. Усе, що відбувається в системі, пишеться в хроніку. Коли за пів року хтось спитає, хто це зробив, відповіддю буде запис із датою, а не здогадка.

Там же сервер рахує повернення. Відсоток повернення береться з довідника «Умови повернення» і залежить від того, за скільки часу до відправлення скасовано поїздку. Рейс партнера потрапляє в продаж лише після модерації адміністратором.

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

Налаштування без програміста

Частина правил змінюється частіше, ніж виходить нова версія. У технічному завданні платформи онлайн-тренувань XenFit окремо записали, що коефіцієнти рейтингу й частота розсилок змінюються з адмінки без програміста. Там же зафіксували вимоги до коду: назви в коді збігаються з мовою предметної області, а API документується у Swagger. Новий розробник читає такий сервер як опис бізнесу.

Дані визначають стелю продукту

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

Під час перенесення даних Lino зі старої структури кожне поле розбирали окремо: у замовника виробник і бренд лежали в одній таблиці, а закупівельна ціна називалася інакше, ніж у нас. Заразом зняли зайві обмеження NOT NULL, щоб імпорт не падав на порожніх значеннях.

Коли навантаження зросте, допоможуть прийоми з матеріалу про оптимізацію сервера. Але оптимізація лікує повільний запит, а не хибну модель.

Що ламається, якщо заощадити

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

Що потрібно від Вас

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

Куди далі

Далі деплой та інфраструктура. Попередній крок: інтеграції. Карта всіх етапів у стратегії розробки застосунку.

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

Поширені питання

01Скільки коштує розробка серверної частини застосунку?

У прайсі Ingello етап серверної бізнес-логіки коштує від $0 до $4700. Ціну визначають кількість сутностей і статусів, кількість бізнес-правил і розрахунків (ціни, знижки, повернення), детальність ролей і прав, потреба переносити дані зі старої системи та очікуване навантаження. Суму етапу фіксують до старту робіт, точний розрахунок дають після безкоштовної консультації з архітектором.

02На якому стеку Ingello робить серверну частину?

Серверна розробка ведеться на PHP із фреймворком Yii2, база даних MySQL, кешування через Memcached, залежностями керує Composer, для обміну в реальному часі використовуються WebSockets. Типову частину (схему даних, API з документацією і базову адмінку) пришвидшує власний генератор Ingello Fractal, а вручну пишеться логіка, унікальна для бізнесу клієнта.

03Чому бізнес-правила не можна перевіряти лише в інтерфейсі?

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

04Що входить у результат етапу серверної бізнес-логіки?

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

05Чи можна перенести дані зі старої системи в нову?

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