Общие сведения
- Digest::SHA1 — позволяет создать уникальные идентификаторы пиров;
- EV — предоставляет интерфейс для регистрации обработчиков различных событий (срабатывание таймера, получение сигнала, появление доступных для чтения данных в сокете);
- IO::Socket::INET — предоставляет интерфейс для создания сокетов;
- POSIX — упрощает вывод даты в необходимом формате.
Ретрекер работает в бесконечном цикле, последовательно обрабатывая поступающие от клиентов запросы. На каждый сеанс связи отводится до 3 мс, так как для абсолютного большинства (99.99%) этого достаточно. Последовательная обработка исключает необходимость синхронизации и блокировки данных. В ретрекере присутствуют задачи по расписанию (cron), заключающиеся в удалении пиров и раздач, по которым долго (пятикратное время анонса) не поступали данные.
Он может быть запущен на любых платформах, где есть язык Perl. Запуск можно осуществить как на всех сетевых интерфейсах сервера (0.0.0.0), так и на определенном (чаще всего — локальном).
Ретрекер держит все данные в памяти. Было решено не хранить их в базе данных или файлах, так как в случае аварийного завершения работы ретрекер вернётся в прежнее состояние в течение 10 минут (при интервале анонса равном 5 минутам).
Ретрекер умеет сохранять логи подключений клиентов и показывать краткую статистику о данных, хранящихся в его памяти.
В случае аварийного завершения работы приложения предусморен мониторинг состояния. При отсутствии отклика от ретрекера будет произведен его перезапуск в течение пяти минут с оповещением администратора.
Особенности ретрекера
- чрезвычайно быстр;
- стабилен;
- расходует очень малое количество памяти — хранит только самую необходимую информацию о пирах и раздачах.
Потребляемые ресурсы
Измерение проводилось после непрерывной работы ретрекера в течение недели. Занимаемый объем оперативной памяти составил 5 976 КБ при 1 050 пирах на 1 097 раздачах. К тому моменту было обслужено 1 705 680 подключений.
Структура проекта
- btrt.pl (11 534 байт) — основная логика приложения;
- functions.plib (6 046 байт) — вспомогательные функции;
- run (1 598 байт) — файл запуска приложения.
Скачать исходный код ретрекера
Варианты запросов к ретрекеру
- http://localhost:2790/ann — запрос списка пиров;
- http://localhost:2790/ping — проверка состояния трекера;
- http://localhost:2790/stats — просмотр краткой статистики (количества пиров и раздач, о которых знает ретрекер).
Хранимые данные пиров
- mtime — время последнего обращения к ретрекеру;
- seeder — является ли пир сидом.
Хранимые данные раздач
- complete_count — сколько раз полностью скачали раздачу;
- leechers — количество личеров;
- mtime — время последнего обращения за списком пиров по этой раздаче;
- peers — данные пиров:
- address — упакованные IP и порт клиента.
- seeders — количество сидеров.