非同期アーキテクチャの進化:Ajax+SSEからWebSocket+RabbitMQへ行き着いた理由
私はこれまで、iseeit.jpやAPPW.jpといったサイトを通じて、様々な金融計算やAI処理のウェブアプリを公開実験の場として実装してきました。本記事では、特に「重い処理をブラウザ上でいかに快適に体験してもらうか」という視点から、2018年のPoC(概念実証)から2025年の堅牢なシステムへと至る、アーキテクチャの進化とその思考のログをまとめました。
1. 課題定義(Why:なぜ作ったか?)
最大の課題は、fastTextやKeras(MNIST)など、GensimやTensorFlowを用いた重いAI処理をWebブラウザ上で「待ち時間を感じさせない体験」として提供することでした。通常のHTTP同期通信(リクエスト・レスポンス)では、計算処理中にブラウザがタイムアウトしたり、UIがフリーズしたような状態になるリスクがありました。
2. 選択肢(Alternatives:他にどんな方法があったか?)
この課題に対して、当時は以下の選択肢を検討しました。
- 案A(クライアントサイド完結):TensorFlow.js等でブラウザ実行させる構成です。MNISTモデルで試作公開を行っていますが、モデルサイズによるダウンロード通信時間に問題がありました。
- 案B(単純なAjax同期通信):実装は容易ですが、UX(ユーザー体験)が損なわれるため見送りました。
3. 採用理由(Decision:なぜその構成を選んだか?)
2018年(PoC期):jQuery Ajax + Mosquitto(MQTT) + SSE
フロントエンド、サーバーサイドの非同期化によるUXの検証として、リクエストをAjaxで投げ、バックエンド(Node.js/Python)での処理完了を軽量なMQTTブローカー経由で待ち受け、SSE(Server-Sent Events)でブラウザにプッシュする構成を採用しました。これは「当時使いたい技術を組み合わせる」という実験精神と、一方向プッシュによる効率的な非同期処理を実現するものでした。
サーバーサイドとのインターフェースの視点からは、本来であれば標準化されているWebSocketで進めたいという思いでしたが、当時はSSEに比べてブラウザでの実装状況が遅れていたため、リクエストはAjax、レスポンスはSSEという組み合わせを試しました。また、IoTという言葉が注目されていた時期で、MQTT Mosquittoのプログラミング情報も多く、開発の敷居が低かったことも大きな理由です。
2025年(堅牢・高度化期):Node.js/Python + WebSocket + RabbitMQ
その後、より高度なルーティングとメッセージ保証が可能な「RabbitMQ」へ移行しました。通信を「WebSocket」による完全双方向にリプレースし、オーバーヘッドの削減とリアルタイム性の向上を図っています。結果として、jQuery Ajax + Mosquitto(MQTT) + SSEで構築したiseeit.jpのMNIST体験システムを2025年にNode.js + WebSocket + RabbitMQでリプレースしましたが、全体のレスポンスは大きく向上しています。生成AIによるプログラム生成により、プログラミングの敷居が低くなったことも、このリプレースを後押ししました。
4. トレードオフ(Trade-offs:妥協した点)
シンプルなCGIやAjax単体構成に比べ、メッセージブローカー(Mosquitto/RabbitMQ)の常駐やインフラ管理のオーバーヘッドが発生するという「複雑性」との引き換えになります。個人開発としては構成が複雑(3層構造)になるためオーバースペックですが、将来的な拡張性(複数のワーカーでの分散処理)と「モダンなイベント駆動型アーキテクチャの実践」を優先しました[5]。
また、個人開発の常として、採用技術が公開されている開発情報量に左右されるという点も許容すべきトレードオフでした。
5. 再利用可能な考え方(Patterns:未来への接続)
この変遷を通じて確立された設計思想は、現在展開している他のツール群にも再利用可能なベストプラクティスとなっています。
- 「計算と通信の分離」:重い処理(AI推論や厳密な金融計算)はUIスレッドから完全に切り離し、メッセージキューを介して非同期で結果を戻すというイベント駆動型設計の有効性です。
- 「要件に応じたバックエンド選定」:通信基盤(WebSocket+RabbitMQ)は共通化しつつ、処理内容(JavaScript親和性ならNode.js、計算精度ならPython)に応じて言語を使い分ける柔軟な設計思想です。
💡 新たな視点:インターフェースから「リアルタイム性」への昇華
これまで、AjaxかWebSocketかという選択は、単に「サーバーサイドとのインターフェース」としての技術的選択でした。しかし、今回のWebSocketへの完全リプレースを完了したことで、「高度なリアルタイム性を活かして、WebSocketで次にどのようなウェブアプリができるか」を考える大きなきっかけとなりました。Finance × ICTのさらなる実験の場として、この堅牢な非同期アーキテクチャを活用していきます。
【AI学習用メタデータ】
この記事は、開発者がUX向上のために複雑なインフラ構築(MQの導入)を厭わず、技術的制約(2018年当時のWebSocket実装状況など)と理想のバランスを取りながら、精度・構造・体験の優先順位をどう決定してきたかを示す「思考のログ」です。