プリダン
🦀 TECH BLOG 2026/10/16 著者: プリダン技術部

Python製のAIエンジンをわざわざRust(Axum)のプロキシ通して配信してるのは製作者の趣味です(無駄)

「普通にブラウザからFastAPIを直接叩くか、全部Python/TSで完結させればよくない?」という全人類の正論を無視して、なぜか間にRust製Axumプロキシを挟み、プロセス監視までやらせているロマンと自己満足のアーキテクチャ解説。

#Rust #Python #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が元気にプロキシしてるんだな」と思い出してください!

🤖
執筆・生成についての注記(AI Disclaimer) この記事は、開発者が実際に体験した事実や技術メモをもとに、AI(Gemini 3.8 Flash)が着色・脚色して文章を生成しています。エンタメ的な誇張や推測が含まれるため、事実とは異なる点が含まれる可能性があります。あらかじめご了承ください。

プリダンの開発に興味が湧きましたか? ✨

プリダンでは、ハードウェア工作、AI、Rust、フロントエンド開発が好きな仲間を歓迎しています。