RustにおけるHTTPを超えて:リアルタイム・ソケットとFTP
HTTPはほとんどのタスクにおいて非常に優れています。 しかし、特定の2つの領域においては力不足です。
リアルタイム・プッシュ。 ブラウザは、何かが発生した際に即座に知る必要があります。 生のWebSocketでも可能ですが、再接続やルーティングに関するすべてのロジックを自前で記述しなければなりません。 Socket.IOはJavaScript開発者の標準ですが、Rustには最近まで優れたサーバー実装が不足していました。
FTPによるファイル転送。 レガシーシステムやメディアパイプラインでは、至る所でFTPが使用されています。 Rustのasyncエコシステムでは、長らくこの分野に空白がありました。
この記事では、これらのギャップをどのように埋めるかを紹介します。 Socket.IOサーバーとFTPサーバーを構築し、それらを連携させます。 FTP経由でファイルがアップロードされると、システムは接続されているすべてのブラウザに即座に通知を行います。
使用するツール:
• Socketioxide: Socket.IOのRust実装。Node.jsやPythonなどのあらゆるSocket.IOクライアントと動作します。 • Libunftp: 構成可能なFTPサーバーを構築するためのツール。 • Suppaftp: Rust用のasync FTPクライアント。
主な機能:
- Socket.IO Rooms: 接続をグループ化できます。特定のフォルダにファイルがアップロードされた際、そのルーム内のユーザーにのみ通知を送ることができます。
- 制限付きFTP: 破壊的な操作をブロックするためのカスタムラッパーを構築しました。ユーザーはファイルのアップロードとダウンロードはできますが、削除や名前変更はできません。
- Async統合: broadcast channelを使用して、FTPサーバーをSocket.IOサーバーに接続します。
ワークフロー:
- FTPクライアントがFTPサーバーにファイルをアップロードします。
- FTPサーバーがブロードキャストイベントをトリガーします。
- Socket.IOサーバーがそのイベントを受信します。
- Socket.IOサーバーがブラウザに "file_uploaded" イベントをemitします。
このパターンはファイル転送以外にも応用可能です。 ジョブ完了のアラート、ライブデータの更新、デプロイメント・ダッシュボードなどに活用できます。
完全なコードはGitHubで公開されています。