Я скоро куплю кучу серверов для приложения, которое собираюсь запустить, но меня беспокоит настройка. Я ценю любую обратную связь, которую я получаю.
У меня есть приложение, в котором будет использоваться написанный мной API. Другие пользователи / разработчики также будут использовать этот API. Сервер API будет получать запросы и передавать их рабочим серверам. API будет содержать только mysql db запросов для ведения журнала, аутентификации и ограничения скорости.
Каждый рабочий сервер выполняет другая работа и в будущем для масштабирования я добавлю больше рабочих серверов, которые будут доступны для выполнения заданий. Файл конфигурации API будет отредактирован с учетом новых рабочих серверов. Рабочие серверы будут выполнять некоторую обработку, а некоторые сохранят путь к изображению в локальной базе данных для последующего извлечения API для просмотра в моем приложении, некоторые будут возвращать строки результата процесса и сохранять их в локальной базе данных. .
Эта установка кажется вам эффективной? Есть ли лучший способ реструктурировать это? Какие вопросы мне следует рассмотреть? Пожалуйста, посмотрите изображение ниже, я надеюсь, что это поможет вам понять.
Как упоминает Крис, ваш сервер API - это единственная точка отказа в вашем макете. Вы настраиваете инфраструктуру очередей сообщений, которую многие уже реализовали раньше.
Вы упоминаете получение запросов на сервере API и вставляете задание в базу данных MySQL, работающую на каждом сервере. Если вы хотите продолжить этот путь, я предлагаю удалить уровень сервера API и спроектировать Workers так, чтобы каждый принимал команды непосредственно от ваших пользователей API. Вы можете использовать что-то столь же простое, как циклический DNS, чтобы распределить каждое соединение пользователя API напрямую на один из доступных рабочих узлов (и повторить попытку, если соединение не удалось).
Более надежные инфраструктуры очередей сообщений используют программное обеспечение, разработанное для этой цели, например ActiveMQ. Вы можете использовать RESTful API ActiveMQ для приема запросов POST от пользователей API, а простаивающие рабочие могут ПОЛУЧИТЬ следующее сообщение в очереди. Однако это, вероятно, излишек для ваших нужд - он рассчитан на задержку, скорость и миллионы сообщений в секунду.
В качестве компромисса вы можете посмотреть на Работник зоопарка, даже если это не сервер очереди сообщений. Мы используем at $ work именно для этой цели. У нас есть набор из трех серверов (аналогичных вашему серверу API), на которых работает серверное программное обеспечение Zookeeper, и есть веб-интерфейс для обработки запросов от пользователей и приложений. Веб-интерфейс, а также соединение бэкэнда Zookeeper с рабочими, имеют балансировщик нагрузки, чтобы гарантировать, что мы продолжаем обрабатывать очередь, даже если сервер отключен для обслуживания. Когда работа сделана, рабочий сообщает кластеру Zookeeper, что работа завершена. Если работник умирает, это задание будет отправлено на выполнение другой работы.
Самая большая проблема, которую я вижу, - это отсутствие планирования аварийного переключения.
Ваш сервер API - это большая единственная точка отказа. Если он выходит из строя, то ничего не работает, даже если ваши рабочие серверы все еще работают. Кроме того, если рабочий сервер выходит из строя, то предоставляемая сервером услуга становится недоступной.
Предлагаю вам взглянуть на проект Linux Virtual Server (http://www.linuxvirtualserver.org/), чтобы получить представление о том, как работает балансировка нагрузки и переключение при отказе, а также о том, как они могут принести пользу вашему проекту.
Есть много способов структурировать вашу систему. Какой способ лучше - это субъективный звонок, на который вы лучше всего ответите. Я предлагаю вам провести небольшое исследование; взвесить компромиссы различных методов. Если вам нужна информация о методе имплантации, задайте новый вопрос.