Архитектура распространения медиа

1. src (создатель медиа) - подписывает, разделяет на блоки, создает UUID, отправляет в сообщении информацию о всех блоках для возможности скачивания и валидации (проверки сумм блоков и подписи файла).
2. req узел - кто хочет получить медиа.


основаня идея распространения контента
- каждый узел выбирает удобный (по пигну) на старте. выбирает следующий если таймаут (2 сек)
  и устанавливает к нему прямое подключение. уведомляет суперузел что он обслуживает этот узел.
  Суперузлы хранят в памяти список узлов (ll_queue) которые они обслуживают. Если соединение рвётся - узел автоматически выпадает из списка обслуживаемых.

- req-узел когда принял полный блок - уведомляет суперузел об этом.

- суперузлы между собой реплицируют таблицу с узлами для скачивания.
  Также если подключен автор контекнта то суперузел автору контента отправляет обновления о доступности его блоков.

  На всех узлах есть таблица с узлами для скачивания блоков.
   ID primary/autincrement | UUID блока | id группы | id ноды | timestamp когда добавлено-обновлено
  Суперузлы в нее сохраняют весь контент групп в которых они состоят. обычные узлы сохраняют только свой контент.
  Если нет суперузлов или они недоступны - то роль суперузла выполняет автор контента.




Репликация между суперузлами.

Каждый суперузел хранит указатель (id) по какой элемент синхронизировано с каждым другим суперузлом.
отправляет злементы и ждёт подтверждения (не более 4 в очереди). переповтор - 10 сек без ответа.
Суперузлы мониторят появление других суперузлов в bgp таблице. когда узел появился пробуют установить прямое подключение (без посредников и без обратного подключения - это сделает другой суперузел сам).
Если не получается 10 сек - отключаемся и следующая попытка через час.
то есть как только видят повяление - пробуют установить прямую связь каждый с каждым.
Прямое подключение - это независимый автономный процесс.
Для этого нужен коллбэк из bgp - появился новый узел и обновился узел. Его надо добавить если нет с возможностью цепочки подписчиков (как коллбэки статусов в etcp).

при появлении суперузлата также начинаем репликацию таблицы блоков - отдельный асинхронный процесс.
для каждого суперузла свой контекст (таймаут, состояние протокола). отправляем обновление и ждём подтверждение с таймаутом (2 сек). таумаут постепенно увеличиваем до 10 минут если нет подтверждений и сбрасываем если появилось.


Алгоритм.
при получении сообщения (в зависимости от настроек кеширования) узлы получившие сообщение с медиа хотят получить вложение. Порядок действий:
   - выбирают суперузел с минимальным rtt и отправляют ему запрос - хочу скачать медиа. дай список узлов с которых качаем.
   В запросе - UUID запрашиваемых блоков (обязательно один файл можно несколько блоков для него), id src узла.
   запрос направляется в суперузел изи автору контента - если нет суперузлов или они недоступны. таймаут 2 сек.
   далее выбираем лучшие узлы (не более 10 штук по пингу) и пробуем к ним установить подключение (прямое или через промежуточный узел).
   перебираем пытаясь подключиться, пока не наберем нужное количество (по количеству блоков, но не более 10 штук)
   к кому подключились - запрашиваем блоки также с выбором следующего при таймауте или неудаче.
   отправляем им запрос и пытаемся скачать.
