Python製のAIエンジンをわざわざRust(Axum)のプロキシ通して配信してるのは製作者の趣味です(無駄)
「普通にブラウザからFastAPIを直接叩くか、全部Python/TSで完結させればよくない?」という全人類の正論を無視して、なぜか間にRust製Axumプロキシを挟み、プロセス監視までやらせているロマンと自己満足のアーキテクチャ解説。
自作プリントシール機システム『Umix』のアーキテクチャ図を見たエンジニアの99%は、おそらく同じ疑問を抱きます。
┌──────────────────────┐ REST / WS ┌──────────────────────┐
│ Frontend (TS/Vite) │ ◄───────────────────────► │ Rust Controller │
│ - Tablet / Monitor │ │ (Axum + Tokio) │
└──────────────────────┘ └──────────┬───────────┘
│ spawn / proxy
▼
┌──────────────────────┐
│ Python ML Service │
│ (FastAPI / 8000) │
└──────────────────────┘
「……あれ? なんでフロントエンドとPython AIエンジンの間に、わざわざRustのAxumプロキシが挟まってるの?」 「ブラウザから直でFastAPI叩くか、リバースプロキシならNginxでよくない?」
結論から言います。
はい、完全に製作者の趣味です。普通に無駄です。
なぜこの構成になったのか?
冷静にシステム要件だけを見れば、以下のような構成でも十分動きます。
- 案A: フロントエンドから直接 Python (FastAPI:8000) のエンドポイントを呼ぶ
- 案B: 全部 Python で書いて GUI もバックエンドも完結させる
- 案C: 全部 Node.js / Bun で書いて、MediaPipe は WebAssembly / WebGL でブラウザ内で回す
それなのに、なぜわざわざ Rust (Axum + Tokio) を司令塔に据えたのか?
理由は大きく分けて2つ(実質1つ)あります。
理由①:製作者がどうしてもRustを使いたかった(本音)
最大の理由はこれに尽きます。
「せっかく自分たちでゼロから巨大なシステムを作るなら、大好きなRustをシステムの心臓部に鎮座させたい」
型安全性、所有権システム、Tokioの爆速非同期ランタイム、cargo の快感。
この開発体験を自作プリントシール機というハードウェアの現場に持ち込みたかった。その情熱が、アーキテクチャ設計の合理性を吹き飛ばしました。
理由②:後付けの正当化(でも意外と役立っている点)
とはいえ、動かしてみると「無駄なはずのRust層」が意外と頼もしい働きをしてくれています。
1. Python プロセスの絶対殺すマン(Watchdog / 生死監視)
プリントシール機のイベント本番中、最も恐ろしいのは**「AI画像処理(MediaPipe)がメモリリークやCUDA/CPU高負荷で突然死すること」**です。
Rustコントローラーは Python の子プロセスを直接 spawn し、死んだら即座に再起動(Watchdog)する保護者役を担っています。
2. 状態遷移とハードウェア制御の一元化
コイン投入機(シリアル通信)、インクジェットプリンタ、別体モニターへのWebSocket配信、QRコード生成。
これら「ハードウェアと状態機械(State Machine)」の管理において、Rustの強力な enum と match による状態管理はバグを徹底的に防いでくれます。
// プリントシール機の撮影状態遷移(Rustの型が守る世界)
pub enum BoothState {
WaitingForCoin,
ReadyToShoot,
Countdown { shot: u8, sec: u8 },
Shooting { shot: u8 },
Beautifying,
Editing,
Printing,
}
この状態遷移が厳密に守られているおかげで、「落書き中に勝手に印刷が始まる」といった壊滅的なバグがコンパイル時に排除されます。
結論:無駄なこだわりこそがDIYの醍醐味
効率だけを求めるなら、既製品のマシンを買うか、ありもののフォトブース用iPadアプリを使えば済みます。
あえてハードもソフトも自作し、無駄にRustでAxumプロキシを立て、Tokioで非同期パイプラインを繋ぎ、Pythonと連携させる。 この**「ちょっと過剰でギークなこだわり」**が詰め込まれているからこそ、プリダンの開発は楽しくて仕方がありません。
もし会場でプリダンを見かけたら、ぜひ心の中で「ああ、この裏でAxumが元気にプロキシしてるんだな」と思い出してください!