Налаштування мого сервера для широко використовуваного API


9

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

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

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

Чи виглядає ця настройка ефективною для вас? Чи є кращий спосіб реструктуризувати це? Які питання слід розглянути? Будь ласка, дивіться зображення нижче, я сподіваюся, що це сприяє розумінню.введіть тут опис зображення

Відповіді:


17

Більш висока доступність

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

Продовжуйте той самий шлях

Ви згадуєте отримання запитів на сервер API і вставляєте завдання в MySQL БД, що працює на кожному сервері. Якщо ви хочете продовжити цей шлях, я пропоную видалити рівень сервера API і спроектувати Робітників для кожної команди прийому безпосередньо від користувачів API. Ви можете використовувати щось таке просте, як DNS з круговим доступом, щоб розподілити кожне з'єднання користувача API безпосередньо до одного з доступних робочих вузлів (і повторіть спробу, якщо з'єднання не вдалося).

Використовуйте сервер черги повідомлень

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

Використовуйте Zookeeper

Як середину, ви можете подивитися на Zookeeper , хоча це не конкретно сервер черги повідомлень. Ми використовуємо в $ work саме для цієї мети. У нас є набір з трьох серверів (аналогічних вашому API-серверу), які запускають серверне програмне забезпечення Zookeeper і мають веб-інтерфейс для обробки запитів користувачів та програм. Веб-інтерфейс, а також підключення Zookeeper до працівників мають балансир завантаження, щоб переконатися, що ми продовжуємо обробляти чергу, навіть якщо сервер не працює для обслуговування. Коли робота виконана, працівник повідомляє кластеру Zookeeper, що робота закінчена. Якщо робітник помирає, це завдання буде відправлено на іншу роботу, щоб виконати.

Інші проблеми

  • Переконайтеся, що робочі місця завершені, якщо працівник не відповідає
  • Як API дізнається, що робота завершена, і отримати її з бази даних працівника?
  • Спробуйте зменшити складність. Вам потрібен незалежний сервер MySQL на кожному робочому вузлі, чи вони можуть спілкуватися з сервером MySQL (або реплікувати MySQL Cluster) на серверах API?
  • Безпека. Чи може хтось подати роботу? Чи є аутентифікація?
  • Який працівник повинен отримати наступну роботу? Ви не згадуєте, чи очікується, що завдання займуть 10 годин або 1 годину. Якщо вони швидкі, вам слід видалити шари, щоб утримати затримку. Якщо вони повільні, вам слід бути дуже обережними, щоб коротші запити не затримувалися за кількома довгими.

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

@Abs - Дякую за моє перше голосування! Якщо ви все-таки вирішите видалити API-шар, я пропоную не робити кругоподібний DNS і встановлювати HAProxy (бажано, пару), як описано в цій статті . Таким чином, вам не потрібно мати справу з тайм-аутами.
Фанатик

@abs вам не доведеться видаляти шар API, але додавання надмірності (помилка CARP або подібне) було б важливим фактором для усунення єдиної точки відмови ...
voretaq7,

Що стосується обміну повідомленнями, я б запропонував уважно ознайомитись з RabbitMQ, перш ніж ви вирішите: rabbitmq.com
Антоніус Блох

2

Найбільша проблема, яку я бачу, - це відсутність планування відмов.

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

Я пропоную вам ознайомитись з проектом Virtual Server Linux ( http://www.linuxvirtualserver.org/ ), щоб отримати уявлення про те, як працює балансування навантаження та відмовлення, і щоб зрозуміти, як це може принести користь вашому дизайну.

Існує багато способів структурувати вашу систему. Який спосіб краще - це суб’єктивний дзвінок, який найкраще відповідає вам. Я пропоную вам зробити кілька досліджень; зважують компроміси різних методів. Якщо вам потрібна інформація про спосіб імплантації, тоді поставте нове запитання.


Як би ви реалізували механізм відмови в цьому сценарії? Загальний огляд був би чудовим.
Abs

Зі своєї діаграми слід дослідити віртуальний сервер Linux (LVS). Перейдіть на linuxvirtualserver.org і почніть вивчати все, що можете.
Кріс Тінг

Цікаво, я розберуся на це і на відмовники взагалі. Будь-які коментарі щодо моєї настройки? Будь-які інші небезпеки, з якими я міг би зіткнутися?
Abs

@Abs: Є багато проблем, з якими ви можете зіткнутися. У вашому запитанні є багато суб'єктивних частин, і я не хочу вказувати вам те, що я особисто робив. Мені не потрібно підтримувати вашу установку; ти робиш. Моя реальна відповідь - дізнатись про аварійну роботу та високу доступність.
Кріс Тінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.