Более высокая доступность
Как упоминает Крис, ваш API-сервер является единственной точкой отказа в вашем макете. То, что вы настраиваете, - это инфраструктура очереди сообщений, которую многие люди внедрили раньше.
Продолжайте идти по тому же пути
Вы упоминаете получение запросов на сервере API и вставляете задание в БД MySQL, работающую на каждом сервере. Если вы хотите продолжить этот путь, я предлагаю удалить уровень сервера API и спроектировать рабочих так, чтобы каждый из них принимал команды непосредственно от ваших пользователей API. Вы можете использовать что-то простое, например, циклический DNS, чтобы распределить каждое пользовательское соединение API напрямую на один из доступных рабочих узлов (и повторить попытку, если соединение не удалось).
Используйте сервер очереди сообщений
Более надежные инфраструктуры очереди сообщений используют программное обеспечение, разработанное для этой цели, например ActiveMQ . Вы могли бы использовать RESTful API ActiveMQ для приема запросов POST от пользователей API, и незанятые работники могут получить следующее сообщение в очереди. Однако это, вероятно, излишне для ваших нужд - оно рассчитано на задержку, скорость и миллионы сообщений в секунду.
Используйте Zookeeper
В качестве среднего уровня вы можете захотеть взглянуть на Zookeeper , даже если он не является сервером очереди сообщений. Мы используем на $ work именно для этой цели. У нас есть набор из трех серверов (аналогичных вашему API-серверу), на которых выполняется серверное программное обеспечение Zookeeper, и есть веб-интерфейс для обработки запросов от пользователей и приложений. Веб-интерфейс, а также внутреннее подключение Zookeeper к рабочим имеют балансировщик нагрузки, который позволяет нам продолжать обработку очереди, даже если сервер не работает в целях обслуживания. Когда работа завершена, работник сообщает кластеру Zookeeper, что работа завершена. Если работник умирает, эта работа будет отправлена на другую работу для завершения.
Другие проблемы
- Убедитесь, что задания выполнены, если работник не отвечает
- Как API узнает, что задание выполнено, и получит его из базы данных работника?
- Попробуйте уменьшить сложность. Вам нужен независимый сервер MySQL на каждом рабочем узле, или они могут общаться с сервером MySQL (или реплицированным MySQL Cluster) на сервере (ах) API?
- Безопасность. Кто-нибудь может представить работу? Есть ли аутентификация?
- Какой работник должен получить следующую работу? Вы не упоминаете, как ожидается, что задачи займут 10 мс или 1 час. Если они быстрые, вы должны удалить слои, чтобы уменьшить задержку. Если они медленные, вы должны быть очень осторожны, чтобы короткие запросы не застревали за несколькими долгосрочными.