マイクロサービスも登場、趣向を凝らした「RECRUIT ISUCON 2022」に挑んだ一日

マイクロサービスも登場、趣向を凝らした「RECRUIT ISUCON 2022」に挑んだ一日

バックエンドの設定、データベースのチューニング、あるいはワンライナーを駆使したトラブルシューティングなど、一芸に秀でたエンジニアならばあなたの周りのさまざまな分野で活躍しているでしょう。ただ、こうした要素すべてを網羅できるエンジニアとなると、そう多くはないはずです。そんなエンジニアとしての総合能力を競うイベント「RECRUIT ISUCON 2022」が、2022年7月8日に開催されました。新型コロナ感染症のリスクを考慮し、2年連続でオンライン形式で実施されることになりましたが、社内からは28チーム、のべ71名が参加しました。その模様を紹介します。

老舗の社内ISUCONとして、スキルアップとモチベーションアップ、ネットワーキングの場を提供

エンジニアの方ならば、「いい感じにスピードアップコンテスト」、略して「ISUCON※」というイベントについて聞いたことのある人も多いでしょう。お題として用意されたWebサービスを定められたレギュレーションの中でチューニングし、どれだけ高速化できるかを1〜3名のチームで競うイベントです。インフラからミドルウェア、データベース、そしてその背後にあるアーキテクチャに至るまで幅広いスキルが問われるため、「ITエンジニアの総合格闘技」などと呼ばれることもあります。
※「ISUCON」は、LINE株式会社の商標または登録商標です

パフォーマンスは非機能要件であるとはいえ、ちょっとでも重たくなるとユーザー離れを招く恐れがあり、Webサービスにおいては重要な要素です。普段から意識している人も多いでしょうが、大きいシステムになるとなかなか自分の手で大がかりに手を加えることのできる機会は多くありません。ISUCONはそうしたチャレンジの場でもあり、また他人のコードを読む機会でもあります。単純にベンチマークのスコアを競って楽しむだけでなく、新たな知見を得られる場としてもエンジニアに親しまれています。

こうしたISUCONがもたらす有形無形の効果に着目し、さまざまな企業がそれぞれ趣向を凝らして社内ISUCONを開催するようになりました。RECRUIT ISUCONはそうした社内ISUCONとしては老舗の部類に入り、今回で9回目を迎えます。

RECRUIT ISUCONにはエンジニアが自己研鑽を図り、モチベーションを高める効果もありますが、社内エンジニアのネットワーキングの場という役割もあります。過去には温泉旅館を会場に一泊二日で行われ、新入社員や2年目、3年目といった若手エンジニアと、ベテランエンジニア、普段は異なるプロダクトに携わりコミュニケーションの機会が少ないエンジニアが交流を温める場としても機能してきました。今回はオンラインという制限はありながらも、Gatherなどのツールを用いて、コロナ禍以降難しくなった雑談や交流の場を提供しました。

マイクロサービスが初登場、さまざまな「解き方」が可能なお題を用意

RECRUIT ISUCON 2022のお題は、カレンダーアプリの「R-Calendar」でした。複数のユーザーが日程調整などを行えるWebアプリケーションで、Java、Node.js、Goの3つの言語で実装され、どれを選んでもかまいません。
※実際の問題はGitHubに公開しています

ただ、今回のお題はそれだけでは終わりません。R-Calendarは、マイクロサービスの形で実装された会議室予約システム「orecoco-reserve」と連携するようになっており、この2つのアプリケーションを対象にチューニングを行えるようになっていました。

今回はRECRUIT ISUCONで初めてマイクロサービスが登場しました。「最近はマイクロサービスアーキテクチャを採用するプロダクトが増えてきています。そこでマイクロサービスを持つアプリケーションに対してどうやってパフォーマンスを改善するかを考える問題を用意しました」(出題者のprogfayさん)。それも、通り一遍のやり方ではなく、「たとえば新たなAPIを用意したり、マイクロサービスをほどいてR-Calendarの実装と統合するなど、いろいろな解き方ができるようにと考えました」(出題者の芳賀史都さん

R-Calendarとorecoco-reserveという2つのアプリケーションを用意することで、扱うデータも複数に分かれてしまう可能性があります。その中でどのようにデータを保持し、どう整合性を取るかといった部分も含め、考慮すべき事柄が増えることもポイントでした。

ちなみに、アドバイザーであり、RECRUIT ISUCONの仕掛け人にして本家ISUCONでも活躍してきた古川陽介さんによると、最近は本家ISUCONでもさまざまな「ギミック」が凝らされる傾向にあるそうです。中には、自分たちの手では触れられない、つまりチューニングできない外部サーバが組み込まれている問題もあり、「回を重ねて歴史が深くなり、かついろいろな人が運営に携わることによって新しいギミックが生まれ、面白いなと思っています」(古川さん)

作問チームにはもう一つ意図していたことがありました。それは、パフォーマンスを意識するきっかけになることです。「業務の中でコードを書いている時に、『あ、これはちょっとパフォーマンスが悪くなりそうだな』というところに意識が向くきっかけになればと考えて作問しました」(progfayさん)

運営チームは2021年11月ごろから半年かけてこの問題を準備してきました。「ゲームのバランス、難度調整に時間をかけました。1つは、ある程度ISUCONに慣れている人たちでも、時間内に解ききれないくらいの量を用意すること。もう1つは、難しくて解けず、何もできないまま終わってしまうチームがないようにレベル1で遭遇するスライムが2匹くらいになるように調整しました」(出題者の水木佑哉さん

こうして調整に時間をかけた結果、アプリケーションコード実装完了後のテストと不具合対応にはどうしても時間がかかり、競技日直前には根を詰めての作業になったそうです。結果として教科書的なボトルネックから、今回特有のボトルネックまで含む問題に仕上がったと思います。一方で、ベンチマーカーの実装にバグがあったため、ベンチマークの結果が不安定になるという問題にも直面しました。これは今後の課題といえるでしょう。

Slackやハドルでコミュニケーションを取りながら、ボトルネックをつぶす戦いに

競技当日は朝の9時にオンラインで集合し、競技説明が行われました。はじめは基本的に静かでしたが、入賞者に贈られる「高級バナナ」をはじめとする賞品が発表されると途端に空気感が変わり、Slack上には「これはいい」「やる気が上がった」といったコメントが飛び交うように。その熱気のまま競技はスタートしました。

といっても、どのチームも最初に取り組むのは「計測」から。どこにボトルネックがあるのかを見定め、最も重たいと思われるところから解決を図っていきます。

運営チームが用意した最初の「スライム」は、セッションIDの生成処理の部分でした。該当部分のコードを見ていくと、何らかの処理を1万回も回した後、配列から一つだけ値を取り出してセッションIDを返すという謎の処理が行われていることがわかります。この1万回の処理を1回にするだけでスコアが上がる形で、「まずここにたどり着くのが、今回の問題の第一歩目だったと思います」(progfayさん)

他にも、R-Calendarに格納されたスケジュール情報を取得するgetCalendarの絞り込みやユーザー情報のn+1問題など、ISUCONによく出てくる問題が用意されていました。またマイクロサービスのorecoco-reserve側にも、スケジュール分のn回のリクエストが発生し、データベースに毎回問い合わせが発生してしまうといったボトルネックが組み込まれていました。

「getCalendarとマイクロサービスに関してはいろいろなやり方が取れましたが、それだけにあれもこれもと手を加えていくとバグが生じやすくなります。それをいかに小さく変更するか、ある戦略をいったん諦めて他の部分に取り組むという意思決定ができたかどうかが、今回の問題の重要な部分だったと思います」(progfayさん)

当て推量ではなく、小さな改善の積み重ねが高いスコアに結びつく

各チームはランチもそこそこに、8時間の競技に取り組みました。中には、他のタスクと並行で作業していたらコードにバグが入り込んでしまい、チームのメンバーに「ごめんなさい!」と謝ることになったり、子供が部屋にやってきてチューニングどころではなくなってしまったりと、リモート開催ならではのハプニングもあったそうです。

なかなか点数が伸びず苦戦したチーム、一時はハイスコアをたたき出したものの再びスコアが落ち込んだチームなど参加各チームが苦闘する中、着実にパフォーマンスを高めていったチームもあり、そうしたチームが上位に入賞しました。


3位に入ったのは、何と1人チームの「Boulder」(1,178点)です。ほとんどのチームが2人、3人で手分けして取り組む中、計測やコードのデプロイ作業などを自動化し、一人でこれだけのスコアをたたき出しました。

「Boulder」の山田祥允さんは、最初のころは複数名のチームで本家ISUCONやRECRUIT ISUCONに参加していたそうです。しかし「参加しても全然得点が出せませんでした。そこで、『他の人に頼っていたら、いつまでたってもできるようにはならないだろう。ならば、一人でできるようになろう』と、一人チームでやることを決意しました」と語ってくれました。

一人であれもこれもやらなければいけないということは、それだけ自分の幅が広がるということ。元々業務でもフルスタック系を志向していたこともあり、普段触れているPostgreSQLだけでなく、あまり触れることがなかったNginxなどのスキルを身につけていったそうです。

それでもISUCONはそう甘くはありません。山田さんも最初の頃は歯が立ちませんでした。「RECRUIT ISUCONに一人で参加してみたものの、最初の3回くらいはずっと0点でした。けれど前々回で結果が出て2位に入ることができました。じっくり続けて学んでいけば、いつか報われると思います」と、今回悔しい思いをかみしめた参加者にとって励みになる言葉を残してくれました。

なお2022年の本家ISUCONは、自身の結婚式の前日に当たるため参加は断念。「本家に出られない分、こうやって社内ISUCONに参加でき、結果が出せて良かったです」(山田さん)

2位は、飲食領域でまさにパフォーマンス改善に向けたアーキテクチャの改善などに携わるエンジニアたちが結成したチーム「ハチワレの街」(1,394点)でした。フルリモートで参加するチームがあった一方、ハチワレの街チームはオフィスに集まり、ディスプレイで「現時点ではどこが遅いか」の情報を共有しながら競技を進めていきました。「今、誰が何をやっているかをお互いに把握できるようにしていました。やはり対面の方がやりやすいかな、と感じました」(「ハチワレの街」浅野宏明さん

なお、浅野さんは同月に開催された本家ISUCONの予選でも4位で入賞し本戦に進むことになりました。他にも複数のチームが本戦に出場することが決まっており、社内ISUCON が本家ISUCONでの活躍の一助となっているようです。

RECRUIT ISUCONでも上位に入るチームはどこもそうですが「ハチワレの街」も、当て推量であれこれいじるのではなく、「どこが一番遅いのか」と性能を計測し、順につぶしていく作業を繰り返すことで高いスコアを出しました。

「普段から業務としてパフォーマンスチューニングに携わっているため、その知識が活かされたと思っています。ただ、短い時間の中でいかに素早く手を動かせるか、普段の力をいかに素早く、うまく出せるかが問われる感じでした」(鈴木貴之さん)。一方で、「業務ではそう軽はずみなことはできませんが、競技の中だと『えいや』でチャレンジできるところもあり、そこも面白いと思いました」(高尾知秀さん

ISUCONの認知度が高まって参加者が増える中、ベストプラクティスも蓄積されてきました。ただ、だからこそたまに出てくる変化球に対しては、「引き出しの多さ」がものを言うと、高尾さんは感じているそうです。

「王道の問題に対して手法は出尽くしており差が付きにくいのですが、たまに出てくる複雑な問題に対しては、別の切り口を持ち出すと、普通なら十手かかる動作が一手で終わることがあります。そうした引き出しの多さ、少なさで結果が分かれるように思います」(高尾さん)

その「引き出しの多い」チームとして、堂々の1位に輝いたのが「isucon_friends」(2,164点)でした。運営チームからも「安定感があるという安定感がある」と評されるほどの横綱相撲でした。

名前の通りISUCONに親しみ、経験を積んできたチーム。メンバーの與那城 有さんは、「いかに小さいところの改善を積み上げて効果を出していくかを意識した結果、点数も徐々に右肩上がりになりました。昔に比べると体力がなくなったこともありますが(笑)」と振り返りました。

彼らがISUCONに取り組み始めた頃は、「テンプレートエンジンを剥がして自分で一から組み直す」といった具合に、やや跳び道具的な、見方によっては「無茶」な手法を考え、一気に1万点、2万点というスコアを叩き出す(が、場合によっては0点になる)アプローチを取っていたこともあったとか。しかし経験を積むにつれアプローチも成熟し、今回はボトルネックを一つ一つ、ステップバイステップで潰していったそうです。

「ハチワレの街」チームも触れていたことですが、業務では、わずか数時間の間にコードや環境を修正し、テストし、デプロイするサイクルを何度も回す経験はそうそうありません。「うまくいってもいいし失敗してもいいので、こういう場で手を動かしてチャレンジし、その結果を自分の知識やスキルとして身につけてほしいなと思います」(宮地克弥さん

事実、2年目エンジニアで構成したチーム「前日は早く寝る」の新田潤平さんは、「RECRUIT ISUCONを通してサーバの状態をきちんと把握し、遅いところを改善するプロセスを学び、それを普段の業務に活かせたらと思っています」と述べていました。

「どーんと跳ねるやり方でも、着実に一個一個潰していくやり方でも、やり方は問いませんが、どんどん多くの人に参加してもらえるとうれしいなと思います。3位に入った山田さんのように、若手が活躍し勝ちパターンを見出していき、本家ISUCONのように化け物がたくさん出てくる場になれば、リクルートのエンジニア全体のレベルアップにもつながると思います」(古川さん)

多くのエンジニアの切磋琢磨の場となるRECRUIT ISUCON、来年の開催にも期待

今回のお題は競技後も1週間ほど残され、感想戦に取り組むチームが多々ありました。

次回のRECRUIT ISUCONはどうなるでしょうか。終わったばかりでまだ考える余裕はないかもしれませんが、リベンジを期する参加者は多そうです。オンラインでやるか、それともオフラインに戻すかなど検討すべき事柄は多々ありますが、参加者の皆さんのさらなる活躍を期待したいところです。

ちなみに、「ビューティフルスーモ」チームの里形理興さんは「われわれは2年目なので、まだオフラインのRECRUIT ISUCONには参加したことがありません。温泉に行けるという話を聞いて、うらやましく思っていました。来年はオフラインだといいなと思っています!」とリクエストを寄せていました。