この記事の要点
- Apple は、漏洩したパスワードをユーザーに警告する Password Monitoring サービスのバックエンドを Java から Swift に書き換えました。世界中のデバイスから1日あたり数十億件のリクエストを処理する大規模なクラウドサービスです。
- 移行の動機は パフォーマンスを保ったままスケールさせること でした。リクエストごとに重い暗号計算が必要な一方で、高負荷時でも素早く応答する必要があり、JVM のメモリ管理(特にガベージコレクション)と起動の遅さが妨げになっていました。
- 結果として、Java 版と比べて スループットが約40%向上、99.9%のリクエストで レイテンシ1ms未満、インスタンスあたりのメモリ使用量は 数十GBから数百MBへと1桁削減、コード行数は 約85%削減 という成果が得られました。
- Swift on Server のエコシステム(Vapor、swift-log、swift-cassandra-client、swift-crypto など)が実運用を支え、Kubernetes 上で運用されています。
採用前の課題
Password Monitoring は、ユーザーの保存済みパスワードを、漏洩が確認されたパスワードのリストと定期的に照合する機能です。この照合は private set intersection(秘匿積集合)という暗号プロトコルを用いて、ユーザーのパスワードを Apple に一切明かさないプライバシー保護の形で行われます。そのぶんリクエストごとの計算量が大きく、サービス全体としては高負荷下でも高速に応答し続けなければなりません。
旧サービスは長年 Java で運用され、安定性と実績がありました。しかし、規模の拡大と効率化の目標に対して、JVM のメモリ管理が見合わなくなってきていました。
- ガベージコレクションのコスト。 Java の G1 GC は予測可能なポーズ時間やリージョン単位の回収といった改善をもたらしましたが、それでも大規模運用では高負荷時の長いGCポーズ、実行時オーバーヘッド、多様なワークロードに合わせたチューニングの難しさが残ります。
- 起動の遅さによるスケーリングの制約。 JVM のオーバーヘッドにより、インスタンスを素早く起動・停止できませんでした。Password Monitoring は世界規模で動作し、地域ごとに1日の負荷のピークとボトムが約50%変動します。需要に応じてインスタンスを増減させるには起動時間の速さが重要でしたが、ここが弱点でした。
ハードウェアを増やすのではなく、より効率の良い言語でサーバーのオーバーヘッドを抑えながら成長を支えたい、という考えから、言語の置き換えが検討されました。
Swiftでどう改善したのか
候補を評価した結果、目標を達成できる数少ない言語のひとつとして Swift が選ばれました。表現力の高い構文で学習しやすく、計算負荷の高いワークロードに必要なパフォーマンス改善を実現できる点が決め手でした。
開発では Swift の Web フレームワーク Vapor をベースに、Routing・Controller・Content の各モジュールを土台として利用しました。さらにサービス固有の要件に応じて、Password Monitoring の実装に不可欠な楕円曲線演算、監査、構成管理、エラーハンドリング、カスタムミドルウェアといった独自パッケージを作成しています。
記事では、Java からの移行で特に効果が大きかった Swift の特徴が挙げられています。
- プロトコルとジェネリクス中心の設計。 Java では継承に大きく依存し、複雑なクラス階層と密結合を招きがちでした。Swift では
class・struct・enumがプロトコルを共有でき、「具体的なクラス」ではなく「振る舞い」で考えることが促され、よりモジュール化された再利用しやすいコードになりました。 - 安全性を重視した言語設計。 optional と安全なアンラップにより至るところでの null チェックが不要になり、null ポインタ例外のリスクが減りました。決定的な解放(deterministic deallocation)、copy-on-write、値型といった設計とあわせて、実行時エラーが起きにくくなっています。
- async/await による並行処理。 従来は複雑なコールバックパターンや外部ライブラリに頼っていた非同期処理を、同期コードのように読み書きできるようになりました。高負荷・マルチスレッド環境では、テストしやすく保守しやすい並行処理が特に重要です。
エコシステムの恩恵も大きく、swift-log(ロギング)、swift-cassandra-client(Cassandra クライアント)、swift-crypto(暗号)といったパッケージがすぐに利用できました。こうした要因により、当初の見積もりよりも大幅に速く書き換えを完了でき、コード行数は約85%削減されています。
実運用から得られる示唆
開発・デプロイの全工程でベンチマークを取り続けた結果、チームが最も感銘を受けたのは Swift の 効率の良さ でした。
- スループットとレイテンシ。 数回の性能改善を経て、現行の本番ハードウェア上でスループットが約40%向上し、99.9%のリクエストでレイテンシが1ms未満に収まりました。
- メモリ使用量。 インスタンスあたりのメモリフットプリントは数百MB程度で、同等のスループットとレイテンシを維持するためにピーク時で数十GBを要した Java 実装と比べて1桁小さくなりました。
- キャパシティの解放。 サービスは Kubernetes 上で動作しており、移行による効率改善で、約50%のキャパシティを他のワークロードに振り向けられるようになりました。
Swift 実装は本番環境で安定して効率良く稼働しており、性能の一貫性、安全性、信頼性のいずれの面でも Java 版を上回りながら、より少ないリソースで動いています。重い暗号計算を伴う高負荷なクラウドサービスにおいても、Swift がパフォーマンスと安全性、保守性を両立できる選択肢であることを示す事例です。