大きな飛躍は、地道な改善の積み重ねから生まれる

技術の成果は外から見ると劇的です。しかし内側では、何か月もの地味で小さな改善が積み重なっています。不可能に見える成果になるまで、注目されることのない仕事です。

Allen Helton Allen Helton
塔にブロックを積み上げる Mo

私たちは、技術における大きな成功を華々しいものとして捉えがちです。

急角度で伸びる性能グラフ。不可能に思える数字を示す基調講演のスライド。「毎秒 10 億リクエストを達成しました」という、控えめな言い方での自慢。

そうした瞬間の背後にあるのは、一つの大きな発明ではありません。何十、場合によっては何百もの小さな変更や改善です。PR では平凡に見え、リリースノートでは読み飛ばしてしまうようなものです。積み重なって革新的な成果になるまで、誰も祝わない種類の仕事です。

最近、Cache It ポッドキャストを聞いて、そのことを思い出しました。Valkey プロジェクトのメンテナー Harkrishn Patro が、システムを毎秒 10 億リクエストの処理までスケールさせた経緯を説明していました。語られていたのは新機能の公開ではなく、システムのあらゆる部分を継続的に磨いた結果でした。

私を含め、エンジニアはシステムの小さな部分に集中し、木を見て森を見失うことがあります。しかし、大きな見出しや刺激的な宣伝を前にすると、森は木々からできていることを忘れます。その結果、大きな革新が「重大発表」までの何か月、何年もの努力を覆い隠してしまいます。

では、その森を歩いて、大きな発表の本当の中身を確かめたらどうでしょうか。

革新は抵抗を取り除く

革新というと、画期的なフレームワーク、特許を持つアルゴリズム、大規模なアーキテクチャの再設計など、華々しいものを想像しがちです。しかし実際の革新の多くは、もっと地味です。小さな抵抗を削り続け、システム全体が滑らかに動くようにする過程です。小さな問題が無数に積み重なって大きな損失になる現象は、実際に存在します。

分散システムでは、そのことが痛いほど分かります。「通常」の規模を超えた途端、正常系のベンチマークではほとんど見えない非効率が何十も現れます。これはハイパースケールだけの話ではありません。概念実証からスタートアップへ、地域規模へ、そして世界規模へと、規模の段階ごとに課題は変わります。毎秒数百万リクエストを処理する数千の関数、ノード、コンテナ全体で増幅されると、小さな問題はもはや小さくありません。

Valkey チームも、当初想定されていなかった限界を超えてクラスターを拡大したとき、まさにこれを発見しました。システムを一から書き直す代わりに、抵抗の原因を一つずつ特定して取り除きました。例えば、初期の pub/sub ワークロードは、データを必要としているかにかかわらず、クラスター内の全ノードへメッセージを配信していました。シャード化したメッセージングでこれを減らすと、クラスターバスのトラフィックが大幅に減り、本来の仕事に使う容量が生まれました。

内部調整用メッセージのサイズと頻度も一例です。パケットを小さく効率的にすることで、通信のオーバーヘッドに CPU サイクルを浪費せず、実際のリクエスト処理に使えるようになりました。

個々の変更だけで、開発者がカンファレンスの壇上に立つことはないでしょう。「軽量になったゴシッププロトコル」を目玉機能として公開する人はいません。しかし改善を長く積み重ねると、かつて不可能に思えた水準でシステムが動き始めます。

革新とは、増やすことより、取り除くことです。

十分に抵抗を取り除くと、システムは突然飛躍したように感じられます。実際には、小さな変更を一つずつ重ねて、そこに達したのです。

信頼性は他の改善の効果を増幅する

理想的な条件でだけ速いシステムは、まだ試作品です。本番で日常的に起こる混乱を加えた瞬間、性能は崩れるか、改善の効果を発揮し続けるかに分かれます。どちらになるかを決めるのが信頼性です。

抵抗の除去が容量を生むように、信頼性の改善は機会を生みます。分散システムでは、脆さも性能と同じ速度で増幅されます。一つのノードが劣化し、次のノードも劣化すると、それまで正常だったクラスターが、リクエスト処理より復旧に容量を費やし始めます。フェイルオーバーを適切に扱わなければ、将来の性能ボトルネックになります。

Valkey の小さな改善に戻りましょう。アベイラビリティゾーンの障害などで複数のプライマリが同時に停止すると、立候補のリクエストが一斉に集中し、新しいリーダーの選出が難しくなっていました。リーダーを巡る競合が下流の処理を停滞させ、負荷がかかったクラスター全体を不安定にしていました。解決策は、選出の動作に意図的な遅延を加え、システムを圧倒せずにレプリカが確実かつ円滑に引き継げるようにすることでした。

ここでも、耐障害性がスループットの余力を生みます。CPU やテールレイテンシを急上昇させずに障害を迂回できるクラスターは、ユーザーが最も必要とする時も高速です。Valkey では、悪条件下でのスループット改善が CPU サイクルの余力を保ち、毎秒より多くのリクエストを処理できました。これも、リリースノートの小さな一項目が大きな飛躍へ積み重なった例です。

信頼性は、システムの他のすべての改善を増幅します。余裕を生み、大胆なスケーリングを可能にし、チームに現在の限界を超えて成長する自信を与えます。復旧が日常的で平穏な作業になると、進歩は加速します。

スケーリングは運用の行動である

想像と違うかもしれませんが、スケーリングはハードウェアの問題ではなく、行動の問題です。規模の変更が危険で、混乱を招き、高価だと感じられるなら、チームは必要なときでも実行しません。最初から余分に確保し、後で想定外の事態が起きないよう願う、保守的な道を選びます。

ただ持ちこたえるだけの状態から、革新は生まれません。

本当の拡張性は、容量調整のコストが十分に下がり、特別な出来事ではなくなったときに現れます。サーバーレスが支持される理由の一つでもあります。ノード追加、データ再分散、ワークロードの変更が速く安全に感じられるほど、チームは頻繁に実行します。頻度が上がるほど、無駄、負担、コストを抑えながら、インフラを現実の需要に近づけられます。

Valkey チームも、これを実体験から学びました。Redis 1.0 以来、データ移行は不安を伴う操作でした。ノード間のスロット移動には、性能低下、処理停止、複雑で誤りやすい手動介入のリスクがありました。そのため人々は移行を避け、クラスターは小さいままか、過大なままでした。能力を最大限に使う運用が綱渡りのように感じられ、革新が止まっていたのです。

アトミックなスロット移行が、その行動を変えました。クラスター内のデータ移動は、予測可能で制御でき、平穏なものになりました。まさに本番システムの運用担当者が必要としていたことです。この機能は、すでに存在していても安全には使えなかった能力を使えるようにしました。

スケーリングが容易になると、チームは最後の手段として扱うのをやめ、自然に行うようになります。進歩が積み重なり、容量と自信が互いを強めます。そして、かつて節目に感じられたことが、いつもの日常になります。

飛躍は徐々に、そして突然起こる

外から見ると、飛躍は一気に起きたように見えます。ある日、見出しが現れ、グラフが垂直に伸びる。「かなり良い」システムが、こんな短期間に「信じがたいほど良い」状態になるのはなぜかと、皆が驚きます。

しかし内側では、何か月も、ときには何年も、粗い部分を磨いています。祝うほどではない小さな問題を直し、プロファイリングでしか見えない挙動を最適化し、PR を一つずつ重ねて抵抗を取り除いています。

Valkey で起きたのも、まさにそれです。10 億 RPS は当初の目標ではなく、数え切れない目に見えない改善の証しでした。その達成が魔法のように見えるのは、当たり前に動くようにするまでの努力が見えていないからです。

これは分散システムやキャッシュエンジンだけの話ではありません。技術全般に当てはまります。大きな技術的成果はどれも、誰かが扱いづらい部分を見つけ、そのままにしなくてよいと決めた瞬間から作られています。

進歩は積み重なり、自信も能力も積み重なります。飛躍は徐々に、そして突然起こります。

段階的な変更を出し、例外的なケースを整理し、信頼性や運用性を少しずつ改善する日々のただ中にいるなら、少し安心してください。あなたは積み重ねています。特別な成果が、無理なく実現したように見えるための条件を作っているのです。

大きな発表の日が来て、システムが安定して動き、人々が簡単だったと思う日が来ます。しかし、あなたは知っています。一つひとつの小さな改善で得た成果だということを。

ぜひ開発にお役立てください。

あわせて読みたい