Русский - Arukim/overmind GitHub Wiki
Алгоритм работы:
-
Клиент отправляет UDP запрос все серверам, в запросе находится информация об искомом ключе, а так же UDP порт клиента.
-
Каждый сервер проверяет, если ли такой Key в текущем кэше и отвечает UDP пакетом на порт клиента. В ответе находится информация о том, найден ли ключ и текущая загруженность кэша.
-
Клиент обрабатывает ответы от серверов. Если приходит сообщение о том, что данные находятся на каком-то сервере - клиент отправляет запрос на скачивание данных. По ходу получения ответов, клиент сохраняет информацию о наименее загруженном сервере.
-
Если по истечению таймаута поиска не найден сервер, на котором данные присутствуют - клиент отправляет запрос на скачивание данных на наименее загруженный сервер. Если по истечению таймаута нет ниодного ответа от серверов - возвращается ошибка.
-
Загрузка данных происходит по TCP, клиент подключается к серверу и инициирует загрузку. Если данные необходимо предварительно загрузить из базы - в запросе передаёт соответствующий флаг.
Передача данных
-
Передача команд. Используется UDP, чтобы минимизировать время на установку соединения, возможные проблемы UDP нивелируются тем, что используются односоставные короткие команды и сам система устойчива к потерям командных пакетов. Протоколом выбран encoding в JSON, так как для стандартного Gob требуется отправка двух пакетов на одну команду - один с описанием формата, второй с данными.
-
Передача данных Используется TCP, есть накладные расходы на поднятие сессий, однако размер передаваемых данных заведомо больше одного сетевого пакета и это неизбежно. Протоколом выбран Gob, так как он нативный для GO и позволяет передавать большой объем данных потоком.
-
Возможные улучшения В будущем можно рассмотреть переход на protobuf в качестве протокола передачи данных / команд.