驚くほどシンプル: あなたのために大変な仕事をするキャッシュクライアント

Momentoは、サーバーサイドとクライアントサイドの両方で、素晴らしい開発者体験に重点を置いています

Momentoでは、非常に高速なサーバーレス・キャッシュを構築しています。キャッシュをシンプルで楽しいものにすることは、私たちのミッションの重要な部分です。私たちは、驚くほどシンプルであることを目指しています。

このことは、開発者であるあなたにとって何を意味するのでしょうか?我々のキャッシュ・サービスのサーバー・サイドにとっては、クラスタの管理、スケーリング、レプリケーションなど、エンジニアリングに膨大な時間を費やし、あなたのビジネスにとって実際に重要な差別化要因に集中するのを妨げるようなことを心配する必要がないということです。キャッシュを作成するだけでいいのです。あとは私たちにお任せください。

しかし、それは話の半分でしかないのです!キャッシュが必要なら、キャッシュに値を読み書きする必要があるコードがどこかにあるはずです。つまり、キャッシュ・サービスとの対話方法を知っている、お気に入りのプログラミング言語用のクライアント・ライブラリが必要なのです。

第一級の関心事としてのキャッシュ・クライアント

ほとんどのデータベースやキャッシュサービスは、サーバーサイドで優れた機能を提供しますが、クライアントサイドは読者のための練習として残されています。多くの場合、GitHubにある複数のクライアント・ライブラリの選択肢の中から、「星の数が多いのはどれか」というような緩い基準でライブラリの質を評価することになります。そして、ライブラリを選択した後でも、貴重な時間の大半をライブラリのチューニングに費やすことになる可能性が高いのです。あるいはもっと悪いことに、障害発生後に不適切な設定値をデバッグすることになるかもしれません!

Momento Cacheは異なるアプローチを取っています。クライアントサイドの体験も、サーバーサイドの体験と同じように楽しいものであってほしいのです。そのため、ほとんどのプログラミング言語用の公式Momentoクライアントライブラリを提供しています。Momentoのクライアントライブラリは、あなたがMomentoに興味を持ち始める最初の場所であり、サーバーサイドの製品と同じ高い品質基準を満たすようにすることが私たちの責務です。私たちのキャッシュクライアントは、第一級の懸念事項です。

このブログは、私たちがクライアントについてどのように考え、どのようにチューニングしているかについて、技術的な詳細を掘り下げていくシリーズの第1回目です。2回目はJavaScriptのキャッシュクライアントのチューニング方法について、そのつぎははPythonについてです。皮肉なことに、私たちはあなたが私たちが取り上げるオタク的なことについて考える必要がないことを望んでいます。要は、あなたが考える必要がないように、私たちはこの仕事をしているのです。だから、もしあなたがこの記事を読むことに興味があるのなら、私たちのキャッシュ・クライアントのひとつと一緒に仕事をするために知っておくべきことを学ぶことです!もう大丈夫です。もう読むのをやめて、試しに行ってみてください!

しかし、もしソーセージがどのように作られるのか、SDKがあなたのために輝くように私たちが何を考えて磨いているのかを知りたければ、読者の皆さん、ぜひお越しください!

雑草の中に入る

おなじみの顔:タイムアウト、リトライ、バックオフ

タイムアウト、リトライ、バックオフは、クライアント・ライブラリでよく見落とされる設定です。これらのパラメータは、雨の日に致命的な障害を引き起こすまでは、取るに足らないもののように思えます。たとえば、キャッシュ・クライアントのキャッシュ・サーバーへの接続タイムアウトがデフォルトで5秒の場合、キャッシュ・サーバーが正常な間は、数週間から数ヶ月の間、その設定に問題があることに気づかないかもしれません。しかしある日、キャッシュサーバーが何らかの理由で利用できなくなったとします。コードが基礎となるデータソースにフォールバックするまでの丸5秒間、すべてのリクエストがブロックされてしまいます!このような突然の予期せぬボトルネックは、システム全体を大混乱に陥れる可能性があります。

一方、リトライ戦略の設定が不十分だと、誤ったキャッシュミスを引き起こし、データベースサーバーに不必要な負荷をかけることになります。また、バックオフ戦略の設定が不十分だと、再試行の嵐を引き起こし、サーバーに過負荷をかけ、悪い状況をさらに悪化させる可能性があります。

開発環境、商用環境へのオーダーメイドアプローチ

コネクションプール、タイムアウト、リトライなどのチューニングに関しては、開発環境と本番環境の両方にうまく機能する万能のソリューションは通常存在しません。

例えば、開発環境ではネットワーク遅延が大きく、ネットワークの安定性が 低いことがよくあります。そのため、タイムアウトやリトライの戦略には、 ある程度緩やかな値を選びたくなるでしょう。そうしないと、開発時には気にしないようなリクエストのタイムアウトによって、 開発作業が中断されるかもしれません。

しかし、キャッシュ・リクエストがアプリケーション・サーバーから発行され、選択したクラウド・プロバイダーへのレイテンシーが低い本番環境では、より積極的なタイムアウトとリトライ戦略が必要になるでしょう。このようにして、アプリケーションのレイテンシーがサービス・レベル・アグリーメントを満たすようにすることができます。

では、どうすれば両方の長所を生かすことができるのか?

マニュアル・チューニング

クライアント・ライブラリの中には、設定をキーと値のセットとして公開し、それをいじる必要があるものも存在します。「タイムアウトを500ミリ秒、リトライを最大5回、バックオフ係数を2、ジッターを最大5ミリ秒にしたい。そして、実行する環境が変わるたびに、もう一度同じ練習をする必要があります。

Momentoクライアントをそのようにチューニングする機能が必要な場合や、特殊な設定が必要な独自の環境がある場合はサポートします。しかし、ほとんどの場合、私たちはあなたがそのような作業をする必要はないと考えています。

事前に構築された静的コンフィグ

私たちは現在、サポートされるプログラミング言語ごとに、事前に構築された静的な設定バンドルのセットを定義するためのパフォーマンス・チューニング作業を終えています。各クライアント・ライブラリには、DevEnvironmentConfig や ProdEnvironmentConfig のような、すぐに使えるコンフィギュレーションがまもなく含まれるようになります。

私たちは、ビルド済みのコンフィグが特定の環境に適していることを確認するために、すべてのカオステストを行っています。あなたは、ビルド済みコンフィグの簡単な説明を読み、どれがあなたの環境に最も近いかを決定し、実行に移すだけでよいのです!

タッチフリー・アダプティブ・コンフィグ

ほんの一握りのビルド済み静的コンフィギュレーションから選択するのは、すべてのコンフィギュレーション設定を手作業でチューニングするよりもずっと手間がかからないが、この単純化でさえ改善の余地があります。それでもなお、どのビルド済みコンフィギュレーションが自分の環境にベストマッチなのかを見極めなければなりません。その代わりに、クライアントサイドのレイテンシの疎なヒストグラムを保持し、あなたの環境で観測されるリアルタイムのレイテンシに基づいてタイムアウトとリトライの値を動的に調整することができる適応型コンフィギュレーションを想像してみてください!

現時点では、アダプティブ・コンフィグについてのETAはありませんが、クライアント・ライブラリーのユーザー・エクスペリエンスを衝撃的にシンプルにする方法を私たちが考えているもう一つの例です。これは正しく行うのが難しく、我々はこれをプロダクション・レディにすることを切望しています。そのためのアップデートにご期待ください。

本当に雑草の中に入っていく

JavaScriptのSDKをチューニングするためのディープダイブでは、gRPCの設定、コードの最適化、シングルコアCPUのパフォーマンスの最大化など、Momentoを使えば忘れてしまいがちなことを詳しく解説しています!

とりあえず、Momento Cacheを無料で使ってみよう