Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Junior: питання на співбесіді з теми «Масштабування»

Питання з реальних співбесід з відповідями: Laravel і PHP, бази даних, JavaScript і фронтенд, Git, Docker, API, безпека й архітектура. Тими самими темами, що й тести.

1 питання

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

Чек-лист:

Що На одному сервері На кількох
сесії file database чи redis - інакше користувача розлогінює
кеш file redis, memcached чи database - інакше кожен сервер має свій кеш і скидання не працює
файли користувачів диск local/public S3, R2 чи інше об'єктне сховище
черги database чи sync redis, database чи SQS - спільні для всіх воркерів
блокування (Cache::lock, withoutOverlapping) будь-який кеш спільний кеш з атомарними блокуваннями
планувальник cron на сервері на одному сервері чи onOneServer() для задач
логи storage/logs централізований збір (stderr, Papertrail, сервіс логів)

Що ще перевірити:

  • однаковий APP_KEY на всіх серверах - інакше cookie й сесії, зашифровані одним сервером, не розшифрує інший;
  • довірені проксі (trustProxies) - щоб застосунок бачив справжню IP-адресу й HTTPS за балансувальником;
  • міграції запускаються один раз за деплой, а не на кожному сервері;
  • локальні шляхи в коді (storage_path() для тимчасових файлів між запитами) - тимчасовий файл, створений одним запитом, інший сервер не побачить;
  • кеш конфігурації й маршрутів формується на кожному сервері при деплої - це нормально.

Головна ідея - сервер застосунку без стану (stateless). Його можна будь-коли вимкнути, замінити чи додати ще один, і користувачі цього не помітять. Тоді масштабування - це просто збільшення кількості однакових серверів.

Корисно перевірити локально: запустити два екземпляри застосунку (наприклад, два контейнери) за простим балансувальником - проблеми з сесіями й файлами проявляться одразу.

Докладніше в документації: Розгортання