Dockerコンテナで基盤コストが30分の1以下になるメドが立ちました——。最近、実名型口コミのグルメ情報サービスRetty(レッティ)の樽石将人CTO(最高技術責任者)と会う機会があり、クラウドサービスのAmazon Web Services(AWS)上で取り組んでいることを聞いたところ、この話が出た。
樽石氏は2017年秋に、飲食店に関する口コミ情報を「八王子」「カフェ」「ゆったり」「電源」といった自由なキーワードに基づいて動的にピックアップして提示する、新しい参照系システムを開発。その基盤にコンテナを用いたことで、従来システムに比べコストが劇的に下がったという。
従来システムは口コミ情報の参照だけでなく投稿も可能なので、参照のみの新システムとは単純に比較できない。とはいえ、コンテナでそこまで劇的にコストが下がるのか。半信半疑だったが、単にコンテナを導入しただけでなく、独自コンセプトのアーキテクチャーにしたと聞いて納得した。
それは、1個のコンテナにシステムの全コンポーネントを入れること。名付けて「全部入りコンテナ」だ。
Rettyの新参照系システムの場合、Webアプリケーションサーバー(以下、APサーバー)、2系統のキャッシュ機構、全文検索エンジン、リレーショナルデータベース(RDB)というコンポーネントで構成される。これらを全て1個のコンテナに入れて動作させる。
APサーバーやRDBのようなコンポーネントの特性で分けて複数のコンテナを作るより、1個の全部入りコンテナにするメリットは大きいという。
複数のコンテナに分けると、コンテナの作成や消去のたびに接続変更が必要になる。全部入りコンテナでは、コンテナ間に依存関係がないので、接続変更が不要だ。もちろんこれは、コンテナ間でデータを共有させる必要がない参照系だから可能な方法である。
さらに、全部入りコンテナではサイジングを単純化できる。コンテナごとに、そこに入れたコンポーネント全体がCPUやメモリーなどのリソースを使い切る。DBサーバーのリソースはひっ迫しているが、それ以外のリソースは余っている、といったムラが起きにくい。
そのため全部入りコンテナなら、コンテナ1個のCPUやメモリーのサイズを決めたうえで、負荷に合わせてコンテナの数を増減(スケールアウト/スケールイン)させれば済む。APサーバーやRDBといったコンポーネントごとに、サイジングする必要がない。
Rettyの新参照系は「AWS Elastic Beanstalk(ビーンスターク=豆の木)」というAWSの簡易なコンテナサービス上で稼働させており、オートスケーリングの機能によって、負荷に応じてコンテナの数を自動的に増減させている。さらに、最新の口コミ情報は新参照系にロードしないように割り切ったこともあり、「運用保守の手間がほとんど掛からず、ずっと放置しておける」(樽石氏)。