1~2秒止まるだけで数百万円の損失が発生する
システムの話に入る前に星野氏は、現在の楽天市場がどれほどの規模に成長しているのかを簡単に紹介した。楽天ID発行数は1億以上、商品登録数は3.6億点以上、国内EC流通総額は5兆円突破(2021年)。この数字を聞くだけで、絶対に止めてはいけないシステムになっていると感じられる方も多いだろう。実際、「1~2秒止まるだけでも損失が発生する。ユーザーだけでなく出店している店舗にも迷惑をかけてしまう」(星野氏)というくらい、停止させたときの損失が大きくなっている。
その「絶対に止めてはいけないシステム」の全体像として、星野氏はサービス構成図を披露した。サブシステムの名前や機能は消してあるが、サブシステム間の関係などは本物だ。そして、サービス構成図を公開するのはこれが初めてだという。
図を見ると、数十のサブシステムが連携しながら動いていることが分かる。個々のサブシステムは、数十~数百、大きいものでは千台規模のサーバーで動かしているという。そして、「サブシステム1つで、スタートアップ1社の企業システムくらいの規模」になっている。
星野氏は図を見ながら、大部分が疎結合のシステムにできていると語るが、個々のサブシステムを見ていくと「まだモノリシックな部分や、分かりにくい部分が残っている」とも評する。「しっかりと疎結合ができていてコントローラブルな形で小さくなっているべきだが、きちんと設計して作っていくのが非常に難しい」。
楽天市場の開設は1997年。今年で開設25周年となる。成長に合わせるようにシステムを書き換え続けているが絶対に止めてはいけないシステムになっている以上、一度にシステム全体を刷新するというわけにはいかないのだろう。
それでも楽天市場のシステムは、少しずつあるべき姿に向かって変化しているという。とはいえ、古い設計のサブシステムを一気に変えることはできない。古いサブシステムを一つひとつ新しいものに変えていっているそうだ。昨年も、大きなサブシステムを1つ書き換えるプロジェクトを完了させたという。
星野氏は、サブシステムの書き換えには2つの挑戦があるという。1つ目は、移行を前提にしながらもいつでも戻せる状態を作っておくことだ。「新しく作るときは、常に古い方も意識して進めなければならない、データも新しいサブシステムと古いサブシステムの間で常に同期ができているという状態を作っておかなければならない」。
実際、昨年に完了したプロジェクトでは、開発したソフトウェアのうち半分以上が新旧の同期を取るものや、互換性を保つためのものだったという。「サービスを止めずに継続しながら、サブシステムを置き換えていくには、常に戻せる状態を作っておくことが欠かせない」と星野氏は語る。移行をうまく進められないと判断したときは、すべてを古い状態に戻すと決断することもあるそうだ。
2つ目の挑戦は、プロジェクトに関わるメンバー全員に仕様を正しく理解してもらって、正しく実装してもらうことだ。昨年の移行プロジェクトでは、50件以上のドキュメントを作成し、そのドキュメントを、プロジェクトに関わる各チームが正しく理解できるようにサポートしながら、進捗を確認し、同期を取りながら進めていったという。
さらに星野氏は「プロジェクトが大きくなっていくと、仕様、アーキテクチャ、それを作るアーキテクト、プロジェクトマネジメント、開発全体のチームの総合力、全体のチームマネジメント、このようなものが問われる。ソフトウェアを書くだけでは、なかなか成功しない。本当に総力戦だ」と付け加える。
セール開始時は通常の50倍のアクセスが集中する
ここで星野氏は、システムの運用に話を移す。楽天市場のシステムを運用する上で最大の挑戦は、定期的に開催している「楽天スーパーSALE」だという。「セール開始時は多い時で通常の50倍以上のアクセスが集中する」というから、挑戦しがいのある話だと想像できる。しかも、近年は楽天市場が急速に成長しているため、ピーク時のトラフィックもどんどん大きくなっているという。
絶対にシステムを止めずに、ピーク時のトラフィックをさばききるために、セールが終わったらすぐに次のセールの準備を始めているという。具体的にはシステムのアーキテクチャを考え、個々のコンポーネントのキャパシティを見積もり、対策を採るなどしているそうだ。
次のセールの準備ができたら、テストだ。このテストは本番環境で、本物のトラフィックを再現しながら実施しているという。当然、ある程度のアクセスが恒常的にやって来る日中にはできない。そこで、深夜に担当者が集まって本番相当のトラフィックをシステムに流してテストしているという。トラフィックといっても、どんなものでも良いわけではない。過去のセールのログを解析して、本番になるべく近いトラフィックを再現しているそうだ。
そして、セール当日は100名以上の担当者がオフィスに集まり、リアルタイムで監視する。新型コロナウイルスが流行し始めてからは、リモートとオンサイトのハイブリッド形態に形を変えたが、何かがあったときに、すぐにメンバーに声をかけられる環境を作っていることには変わりない。
何度も繰り返しているが、楽天市場のシステムは絶対に止めてはいけない。たとえ通常の50倍のトラフィックがやってきたとしてもだ。そして楽天には、これまで何度もセールを実施してきた経験とノウハウがあるという。そのノウハウから、トラフィックが増大してきたらあまり重要でない機能を落としてしまう決断を行うこともあるという。それも、ユーザーが買い物できる環境を提供し続けるためだ。最近は「どんなトラフィックが来ても問題なくお買い物ができる環境を提供できているんじゃないかな」と星野氏は語る。
とはいえ、ECの需要の高まりとともに毎年トラフィックは増大するばかり。セキュリティなど、新しい問題も次々起こる。こうした課題に「今ある技術だけで対応していくのは非現実的、常に新しい技術も取り入れながら戦っている」(星野氏)という。
具体的には、コンテナベースのアプリや仮想化ネットワークなど、スケールしやすいアーキテクチャにシステム全体を変更していっているそうだ。しかし、安定度を考えると新しい技術を入れることは不利に働く。アプリケーションを高品質に作ったとしても、新しいフレームワークや新しいインフラに載せてしまうと、安定度合いは従来のものに比べて落ちてしまう。しかし、現状にとどまっているわけにはいかないので、ある程度のリスクを覚悟して新しい技術に挑戦しているという。そして、いきなり新しい技術を本番環境に入れるわけにはいかない。早めに構想を練って、準備しているそうだ。
星野氏は、最近特に力を入れていきたい問題として、リダンダンシー(冗長性)を挙げた。クラスタレベルのリダンダンシーから、データセンターの配置を考えるリダンダンシーを考えているという。その延長として、マルチクラウド戦略も頭の中にあるという。
楽天は自前のデータセンターを持って、システムを運用していることで有名だったが、実は現在では一部パブリッククラウドも利用しているという。その動きをさらに進めて、マルチクラウドでシステムを構成し、リダンダンシーの高いサービスを提供しようというわけだ。
ただし、マルチクラウド化に向けた問題もある。各クラウドベンダーに依存しないようにソフトウェアを書かなければならないということはもちろん、ネットワークやセキュリティ、そして利用コストも考えなければならない。一昼夜でできることではない。星野氏は「だからこそ早め早めに進めていきたい」と語り講演を締めくくった。