見出し画像

Railsの中間サーバーとしてNestJSを導入した

noteでは、基本的にAPIなどのサーバーサイドの処理はRailsで構築されています。しかし、アプリケーションサーバとしてUnicornを利用しているため、その同時接続数の限界により、実装が困難な機能がありました。

2023年にリリースした「note AIアシスタント(β)」の開発では、ストリーミング処理の必要性と、同時接続数の大幅な増加が求められました。

この課題に対処するため、私たちはRailsと連携する中間サーバーとしてNestJSを採用し、その処理を実装することにしました。

NestJSを導入した理由


同時接続数の上限を増加させるために、ノンブロッキングI/Oを特長とするフレームワークの導入を検討しました。note社のエンジニアの効率と生産性を最大化するため、TypeScriptを完全にサポートするNode.jsのフレームワークであるNestJSが最適な選択として採用されました。

「note AIアシスタント(β)」におけるNestJSの利用方法


NestJSは、Railsサーバーの前段に配置し、中間層として機能させています。これはOpenAI APIへのリクエストを効果的に処理するためです。

note AIアシスタント(β)の文字出力

RailsのWebサーバーであるUnicornはマルチスレッドに対応していないため、長時間かかる処理があるとそのプロセスが他のリクエストの処理を行えなくなります。このため、Chat Completion APIのように時間を要する処理を行う際にリソースが不足する恐れがあります。一方で、ノンブロッキングI/Oを採用しているサーバーでは、I/O処理が行われている間も他のリクエストを処理できるため、リソースをより効率的に活用できます。

そこで、NestJSを導入し、サーバー1台あたりの同時接続数を20から800に大幅に増加させることができました。

また、note AIアシスタント(β)ではプランによって使用できる回数が異なるため、RailsとNestJS間で認証および認可の仕組みの構築も行いました。

今後の展開

現在、noteではChat Completion APIに限定してNestJSを使用していますが、将来的にはWhisperなどの他のAPIへの対応を拡大する予定です。

今回、NestJSを導入したことによって、noteの技術スタックの選択をまた一つ増やすことができました。NestJSによるスケーラビリティと柔軟性の向上は、noteの将来的な機能の拡張につながっていくでしょう。

▼エンジニアの記事をもっと読みたい方はこちら

▼noteを一緒に作りませんか?


note社で働くことに興味がある方は、ぜひカジュアル面談からご応募ください