Контекст
Headless-платформа електронної комерції, написана один раз і розгорнута під кожен ринок: JSON API вітрини — каталог, дерева категорій, характеристики, кошик, список бажань, пошук, оформлення, замовлення та акаунти — плюс адміністративна частина, у якій персонал клієнта проводить цілий день.
Обмеження
«Під кожен ринок» — це саме те місце, де такі платформи зазвичай гниють. Кожен новий ринок приносить свою валюту, локаль, часовий пояс, платіжних провайдерів і служби доставки, і спокуса — зробити форк. Після чого кожне виправлення треба застосувати N разів, а врешті його не застосовують. Тим часом каталог не наш: він живе в ERP клієнта і змінюється в нас під ногами.
Рішення
Що обрано
Одна кодова база, клонована під кожен ринок, де валюта, локаль і часовий пояс задані конфігурацією, а не умовними гілками. Платежі й доставка сховані за інтерфейсами драйверів, тож новий ринок додає драйвер, а не гілку. Роздрібні та оптові ціни — один рушій із правилами, а не два шляхи в коді, які розходяться.
Що відхилено
Одне багатоорендне розгортання, що обслуговує всі ринки. На схемі це елегантніше, і завдяки цьому сплеск трафіку одного ринку, міграція одного ринку й аварія одного ринку стають проблемою всіх.
Компроміс
Клоновані розгортання означають N місць для деплою і N наборів конфігурації, які треба тримати чесними. Ця ціна реальна, і вона купує ізоляцію радіуса ураження: зміна, яка пішла не так, пішла не так на одному ринку.
Неочевидна частина
Синхронізація каталогу з ERP складає кожну зміну товару як типізований DTO, щоб людина переглянула її до застосування. Записувати вхідні дані одразу в каталог було б значно менше роботи — і імпорт, який застосовує себе сам, це імпорт, який ніхто не може відкотити. Коли ERP надсилає неправильну ціну на десять тисяч товарів, різниця між «складено на перегляд» і «застосовано» — це різниця між відхиленою партією і зіпсованими вихідними.
Результат
Працює на кількох ринках: автентифікація покупця через JWT, OAuth Google і Facebook та одноразові коди поштою, SEO-розмітка з JSON-LD і картами сайту, а також конструктор головної сторінки в адмінці, яким команда клієнта користується без нас.