Больше чем HTTP в Rust: Real-Time сокеты и FTP
HTTP отлично подходит для большинства задач. Но он не справляется в двух конкретных областях.
Real-time push (Push-уведомления в реальном времени). Браузерам нужно мгновенно узнавать о происходящих событиях. «Сырые» WebSockets работают, но вам придется самостоятельно писать всю логику переподключения и маршрутизации. Socket.IO является стандартом для JavaScript-разработчиков, но в Rust до недавнего времени не было хорошей серверной реализации.
Передача файлов через FTP. Устаревшие системы и медиа-конвейеры повсеместно используют FTP. В async-экосистеме Rust здесь долгое время существовал пробел.
В этом посте мы покажем, как восполнить эти пробелы. Мы создадим сервер Socket.IO и FTP-сервер, а затем соединим их. Когда файл загружается через FTP, система мгновенно уведомляет каждый подключенный браузер.
Инструменты, которые мы используем:
• Socketioxide: реализация Socket.IO на Rust. Она работает с любым клиентом Socket.IO, например, на Node.js или Python. • Libunftp: инструмент для создания компонуемых FTP-серверов. • Suppaftp: async FTP-клиент для Rust.
Ключевые особенности:
- Socket.IO Rooms: Вы можете группировать соединения. Когда файл загружается в определенную папку, вы уведомляете только пользователей в этой комнате.
- Restricted FTP: Мы создали кастомную обертку, чтобы заблокировать деструктивные действия. Пользователи могут загружать и скачивать файлы, но не могут их удалять или переименовывать.
- Async Integration: Мы используем broadcast-канал для связи FTP-сервера с сервером Socket.IO.
Рабочий процесс:
- FTP-клиент загружает файл на FTP-сервер.
- FTP-сервер инициирует событие broadcast.
- Сервер Socket.IO получает это событие.
- Сервер Socket.IO отправляет событие "file_uploaded" в браузер.
Этот паттерн применим не только к файлам. Его можно использовать для уведомлений о завершении задач, обновления данных в реальном времени или панелей мониторинга развертывания (deployment dashboards).
Полный код доступен на GitHub.