Читаю учебник по Rust, по ходу делаю всякие свистоперделки и вот написал еще один мини проект - прокси сервер для платформы smotrim.ru, который на лету преобразует их JSON-ы в RSS/XML формат. У меня уже был написал небольшой парсер на python и настроен github-actions для обновления списка лент по крону, и теперь их стало двое.
Из отличий со скриптом на python, приложение работает в режиме сервера, а не дергается по расписанию, (почти) на каждый запрос генерируется новый XML.
Использование: smotrim-rss-proxy [OPTIONS]
Options:
-i, --ip <IP>
IP для запуска сервера [default: 127.0.0.1]
-p, --port <PORT>
TCP порт сервера [default: 3000]
-l, --limit <LIMIT>
Количество эпизодов [default: 20]
-c, --cache-lifetime <CACHE_LIFETIME>
Время жизни кэша в секундах [default: 600]
-d, --db-path <DB_PATH>
Путь к sqlite базе для хранения данных [default: data.sqlite]
-h, --help
Print help
-V, --version
Print version
Получение некоторых данных со “смотрим.ру” очень медленное, например получение заголовка с размером аудиофайлов занимает около секунды, и когда надо получить размеры 50ти файлов - это длится вечность. Cloudflare, например, не дожидаясь ответа от прокси, просто дропает соединение. Поэтому пришлось добавить кеширование. Готовые XML кэшируются в оперативной памяти (по умолчанию на 10 мин) и самые медленные данные сохраняются в sqlite базу чтобы после перезапуска сервиса не кешировать их повторно.
По тестам на рабочем ПК получается вполне приличная скорость - ~50000 запросов в секунду.
$ wrk -t6 -c100 -d30s -s test.lua http://127.0.0.1:3000
Running 30s test @ http://127.0.0.1:3000
6 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.80ms 105.90us 4.02ms 90.32%
Req/Sec 8.92k 644.76 27.67k 99.11%
1599914 requests in 30.10s, 78.32GB read
Requests/sec: 53153.41
Transfer/sec: 2.60GB
Потестировать можно по адресу https://smrss.coyotle.ru/brand/[id] , где [id] - идентификатор подкаста на сайте smotrim.ru.
Исходники лежат тут https://github.com/coyotle/smotrim-rss-proxy, там же можно скачать готовые сборки для Linux и Windows. Для Win не тестировал, даже не знаю запускается оно или нет. Тестирование и багрепорты приветствуются.
