Русский - Arukim/overmind GitHub Wiki

Алгоритм работы:

  1. Клиент отправляет UDP запрос все серверам, в запросе находится информация об искомом ключе, а так же UDP порт клиента.

  2. Каждый сервер проверяет, если ли такой Key в текущем кэше и отвечает UDP пакетом на порт клиента. В ответе находится информация о том, найден ли ключ и текущая загруженность кэша.

  3. Клиент обрабатывает ответы от серверов. Если приходит сообщение о том, что данные находятся на каком-то сервере - клиент отправляет запрос на скачивание данных. По ходу получения ответов, клиент сохраняет информацию о наименее загруженном сервере.

  4. Если по истечению таймаута поиска не найден сервер, на котором данные присутствуют - клиент отправляет запрос на скачивание данных на наименее загруженный сервер. Если по истечению таймаута нет ниодного ответа от серверов - возвращается ошибка.

  5. Загрузка данных происходит по TCP, клиент подключается к серверу и инициирует загрузку. Если данные необходимо предварительно загрузить из базы - в запросе передаёт соответствующий флаг.

Передача данных

  • Передача команд. Используется UDP, чтобы минимизировать время на установку соединения, возможные проблемы UDP нивелируются тем, что используются односоставные короткие команды и сам система устойчива к потерям командных пакетов. Протоколом выбран encoding в JSON, так как для стандартного Gob требуется отправка двух пакетов на одну команду - один с описанием формата, второй с данными.

  • Передача данных Используется TCP, есть накладные расходы на поднятие сессий, однако размер передаваемых данных заведомо больше одного сетевого пакета и это неизбежно. Протоколом выбран Gob, так как он нативный для GO и позволяет передавать большой объем данных потоком.

  • Возможные улучшения В будущем можно рассмотреть переход на protobuf в качестве протокола передачи данных / команд.