🐈

Momento 入門3:Momentoの基盤を知る

2023/09/03に公開

Momento入門2の記事を上げたところ中の人から連絡をいただきました!

「...2つのEC2インスタンスにアクセスしているようです。これがキャッシュのエンドポイントのようです。(あくまで通信先でありMomento本体がEC2で動いているかどうかは不明ですので注意してください)」と記載したのですが、その接続先の向こう側である、AWSバージョンのアーキテクチャはこちらに資料があるとのことです。

https://present.momentolabs.io/building-a-serverless-cache

私はキャッシュやWebプログラミングは素人レベルなのですがAWSは長年使っているので楽しみな資料です。ちょっと見ていきましょう。

まずMomentoは大きく3つの基盤に分かれているようです。
Control Planeである、Cache Admin
リクエストルーターの、MR2
データ本体をつかさどる、Cache Node

それぞれを見ていきたいと思います。なお、以下の考察は中の人ではない一ファンが書いているので間違いがあるかもしれないのでご容赦ください。

Cache Admin

いわゆるコントロールプレーンです

システム全体の管理をつかさどっています。資料にはHealthと記載されていましたが、監視の仕組みは公開されていませんでした。DynamoDBが複数使われているのが面白いところです。キャッシュされる個別データがDynamoDBに格納されているわけではありません。
後述するCache Nodeのキャパシティ管理も行っているようです。
test.jsで言うと

const createCacheResponse = await client.createCache(CACHE_NAME);

の処理が行われています。
その後キャッシュクライアントが作成され、キャッシュクライアントに対する指示はMR2で行われます。

MR2

const setResponse = await client.set(cacheName, key, data);
const readResponse = await client.get(cacheName, key);

読み込み書き込み部分のリクエストがまず処理されCache Nodeへルーティングされます。

図を見て、ほほう!と思ったのは通信がgRPCであることと、ALBではなくNLBが利用されていることです。

gRPCについてはMomentoの公式ドキュメントにこのような記載がありました。

There are two main benefits for you of using gRPC as a Momento user.

First, gRPC is fast. You may be familiar with using JSON-based REST APIs for interacting with other services. While this method is flexible, the plaintext format of the message results in a larger message size and slower performance. Conversely, gRPC uses protocol buffers by default to exchange messages between the client and server. Protocol buffers will serialize your data into a more efficient binary format, allowing for faster transport plus faster serialization and deserialization of your data. When you are using a cache like Momento, this additional speed is critical.

Second, gRPC has cross-language support. You can use the .proto files to quickly generate clients in a large number of supported languages. While this doesn't directly help you as a Momento user, you indirectly benefit by quickly receiving new features in your language of choice. The Momento team can generate base clients across languages, lowering the burden of maintaining SDKs for each language. We will craft a consistent, language-specific interface on top of the generated code for each language, but the baseline work of interacting with the Momento service is much lower.

DeepL先生にお世話になりながらサマリーすると2つの利点があるといっています。
一つ目は従来の方式はプレインテキストであるのに対し、gRPCはプロトコルバッファを用いてバイナリ形式のデータのシーケンシャルに扱えるため、より効率のいい通信、つまりより早くかつデータのシリアライズ/デシリアライズを効率化させる。
ElastiCacheの通信はHTTPSになりますので、これは確かにミリ秒単位でのパフォーマンスを追求するMomentoならではの考え方ですね。

二つ目は.protoファイルの存在により多言語対応が容易となりSDKのメインテナンスコストを低減させることができ、結果としてスムーズなバージョンアップを実現させやすいという点です。私はprotoファイル自体が初耳でしたので今後勉強していきたいと思います。

そしてALBではなくNLBが使われています。

ALB と NLB の違い

ALB(Applicaiton Load Balancer) と NLB(Network Load Balancer) は両方ともAWSが提供するマネージド型ロードバランサとしてまとめてELB (Elastic Load Balancer) と言われていますが、その実態は大きく異なります。

ALBはインスタンスが下に存在しており、開発者はそれを意識する必要があります。急激なトラフィックスケールの際にALBを支えるインスタンス増強が間に合わない恐れがあることから、上限緩和申請や暖気などが必要になります。

一方NLBはどちらかというとAWS HyperplaneというVPCをさせる機能の一部として実装されておりかなり高いパフォーマンスと可用性を提供します。また長期にわたり固定のセッションを維持できるのもインスタンスレスである一つのメリットでしょう。デフォルト状態で毎秒数百万のリクエストを処理可能です。このためMomento のリクエストルーターはかなり高い負荷に耐えられるように設計されていることがわかります。

直接検証環境が複数のEC2と通信しているように見えていたのはまさにこれでした。NLBはALBと異なり透過的に通信をルーティングさせるため、通信先が各EC2となっていたわけです。

Cache Node

キャッシュデータが一時的に格納されている場所です。

EC2を中心として、コンテナで構成されています。各コンテナはパーティションをつかさどっています。一般的に大規模なデータを取り扱う際には、各パーティションに分散してデータを配置することで読み込み速度を向上させているはずです。なぜならパーティション単位に下を支えるインスタンスに起因するネットワークやメモリのスループットに上限があるからです。(キャッシュですからもちろんストレージよりはるかに早いですけど)

DynamoDBやS3なども同様に、どのようにデータを等しくパーティションを分散させて配置することでランダムアクセス時の読み込み速度を上げるか?というのがデータ配置戦略の中で重要な比重を占めており、アプリケーションの方で各Keyに乱数を付与するなどのテクニックがありましたが、AWSは時間とともにその問題を解決し今ではアプリケーション側での対応はほとんど必要なくなっています。
Momentoも近しい仕組みを導入しパーティションへの最適なデータ配置戦略がとられているはずですが、これはまた分かり次第勉強してご報告します。

以上Momentoの中身を資料からわかる分について纏めてみました。

さて、次回予告です。入門その2でこんなことを書いていました。

上の検証環境を見ると、MomentoキャッシュへはPublicIPを用いて通信を行っています。これはインターネット、つまり公衆網を通信が通っているのでしょうか?
あまり知られていないことですが、AWS内部のパブリックエンドポイントの通信はAWSが管理している内部ネットワークを通ります。EC2からS3、CloudFrontからEC2やS3なども同様です。
このためMomentoキャッシュへの通信はVPC外ではあるが、AWS内部通信といえます。企業にとってはVPCしか利用が許可されないため、Momentoを使いたくてもElastiCacheしか許可されないケースがあると思いますので、これは知っておくと便利な知識です。

Private Linkを使えるようです。
https://docs.momentohq.com/learn/security/private-link
これはMomento側の対応が必要ですので申し込んでみました。使えるようになったらまた記事を上げたいと思います。

Discussion