こんにちは!技術開発部の浅沼です!
先月、Forkwellさん とのコラボイベント「How Ruby performed Higher」を開催しました。
そこでは、『RubyでPub/Sub messaging 〜 Multi Process, Daemonizesしたアプリケーション開発の事例』と題して、 IDCFクラウドのサービスを実現しているバックエンドシステムのアーキテクチャと開発事例を紹介しました。
IDCFクラウドRDBやインフィニットLBのバックエンドシステムは、Rubyで開発したPub/Sub messaging を用いたアプリケーションが稼動しています。
RubyというとRuby on Railsを利用したMVCなWebアプリケーションを思い浮かべると思いますが、今回は Multi Process, Daemonizes を活用したスケーラブルかつハイパフォーマンスを目指したバックエンドシステムを紹介します。
バックエンドシステム構築のポイント
バックエンドシステムの構成を考える上で、リクエストとレスポンスの性能、スケーラビリティを考慮することが常に求められると思います。その要件を満たす一つの方法として、リクエストの非同期化が考えられます。
IDCFクラウドのバックエンドシステムにおいても非同期化は重要なポイントになります。各サービスの管理用DBやクラウド基盤の各種APIなど一つのサービスを実現するために、様々な連携サービスを利用します。
マネージドなサービスの場合、ユーザーに提供する仮想マシンには管理用のAgentサービスが稼動しています。そのAgentから各種状況に応じてイベントが発生したり、Agentへイベントを送信するなどの処理が発生したりします。サービスの利用拡大に応じて管理するAgent数の増減、発生するイベントの増減など、そのスケーラビリティにPub/Sub messagingという形はピッタリ当てはまりました。
高可用性を実現するマルチリージョン配置
可用性においてもPub/Sub messagingであることがポイントになります。Pub/Subで構築された各アプリケーションは、ロケーション上でも分散配置することが可能になります。
当社データセンターを活用してマルチリージョン上にアプリケーションを分散配置、Message Queueingを担うミドルウェアなどをクラスタ化して配置することで高可用性を実現することができました。
アプリケーションのスケーラビリティ、ハイパフォーマンス化
各アプリケーションのパフォーマンスやスケーラビリティ・可用性では、RubyとServerEngineの組み合わせを活用していることがポイントとなっています。
ServerEngineは、マルチプロセス化したアプリケーションに最適化された堅牢なRubyのフレームワークです。ServerEngineのSupervisorを利用することによって、プロセスの自動リスタートやコンフィギュレーションのダイナミックな再読込などが可能となっています。もし、稼動しているプロセスが異常終了したとしても、設定したプロセス数を維持するために新しいプロセスを自動的に起動してくれます。一台のサーバで必要な並列数を維持してパフォーマンスやスケーラビリティをコントロールしたい場合に、このServerEngineの特性が役に立ちます。
Railsでマルチプロセス化を行うと、一つのプロセスの使用メモリ量やオーバヘッドが気になりますが、Ruby+ServerEngineを利用することで、必要なgemのみを読み出すようにしています。実装は、クラスの構成から話すことも多く、常にコーディングスキルが鍛えられます。
以上のように、Pub/Sub messagingを活用したスケーラビリティと高可用性、Ruby+ServerEngineによるマルチプロセス化したアプリケーションのハイパフォーマンスを意識して日々開発に取り組んでいます。
おわりに
Rubyでマルチプロセスを活用したアプリケーション事例はなかなか珍しいようで、当日の参加者の皆さんには、Pub/Sub messagingのポイントやServerEngineの実用事例が好評でした。次回、機会があればPub/Sub messagingを利用したアプリケーション実装のハンズオンをやってみたいと思っています。
まだまだ、Message Queueingを担うミドルウェアの性能を引き出したり、各アプリケーションのクラス構成をよりスマートにしたり、インターフェースをより発展させたりなど、挑戦したいことはいっぱいあります。アーキテクトからミドルウェア、詳細設計・実装まで、一緒にRubyでアプリケーションを開発してクラウドサービスを実現することに興味のあるエンジニアを募集しています。詳しくは採用ページまで!