Cloudstate と Akka Serverless を使用した Google Cloud 上のステートフル サーバーレス
Google Cloud Japan Team
※この投稿は米国時間 2020 年 10 月 28 日に、Google Cloud blog に投稿されたものの抄訳です。
近年、水平方向のスケーラビリティを簡単に実現できる方法として、ステートレスの中間ティアが大きく宣伝されています。しかし、マイクロサービスの台頭によって、ステートレス アーキテクチャ パターンの限界が押し上げられたことにより、デベロッパーは代替手段を探し求めるようになりました。
ステートレス中間ティアは、サーバー アフィニティ(別名、スティッキー セッション)の必要性を軽減することで水平方向のスケーリングをサポートするため、アーキテクチャ パターンとして好んで使用されてきました。サーバー アフィニティは、レイテンシの低いアクセスとキャッシュの容易な無効化を実現し、中間ティアでのデータ保持を簡単にするものでした。ステートレス モデルでは、すべての「ステート(状態)」が中間ティアからバックアップ データ ストレージに移行しますが、実際には、複雑さとボトルネックを解消することなく、そのままバックアップ データ ティアに移行させたにすぎません。技術的には、マイクロサービスは他のサーバーとのみ通信し、データティアを共有するべきではありません。そのため、マイクロサービス アーキテクチャは成長するにつれ中間ティアをより圧迫し、問題をさらに悪化させました。これらのパターンがもたらす課題を克服するために、あらゆる手段を駆使して対処が試みられています。現在、多くのマシンで運用中のさまざまなサービスから、システムの構成方法を根本的に変える新たなパターンが出現しています。
たとえば、不正検出システムを使用した例を見てみましょう。トランザクションは従来巨大なデータベースに保存されており、データに対してなんらかの分析を実行する唯一の方法は、データベースに定期的にクエリを実行し、必要なレコードをアプリケーションに取り出して分析を行うことでした。しかし、これらのシステムはパーティショニングやスケーリングが容易ではありません。また、リアルタイム解析の機能もありません。そのため、近年ではイベント ドリブン型のアプローチをとるアーキテクチャに移行しつつあります。このアプローチでは、トランザクションはバスに配置され、そこでスケーラブルなイベント コンシューマ ノードのフリートがトランザクションを取り出します。このアプローチにより、パーティショニングはより簡単になりますが、大量のクエリを受け取る巨大なデータベースに依存したままであることに変わりはありません。そのため、イベント ドリブン型のアーキテクチャは、複数のシステムが同じイベントを使用するにあたって、そのレートがそれぞれ異なるという課題にたびたび直面していました。
もう一つの(より良いと思われる)アプローチは、耐久性の高い外部ストアにイベントログをバックアップしながら、アプリケーション ティアでパーティション化されたデータを同じ場所に配置する、イベント ドリブン型システムを構築することです。不正検出の例を挙げると、これは、ユーザーが特定の顧客のトランザクションを受信し、そのトランザクションを必要な期間メモリに保存して外部クエリを行うことなくリアルタイム解析を実行できることを意味します。各コンシューマ インスタンスはコマンドのサブセットを受信し(トランザクションの追加など)、蓄積された状態の独自の「クエリ」 / 予測を維持します。次に例を示します。
コマンドとクエリを分離することで、エンドツーエンドの水平方向スケーリング、フォールト トレラント、マイクロサービスのデカップリングを簡単に実現することができます。また、データがアプリケーション ティアでパーティション化されているため、イベントの数やサイズに基づいてそのティアを簡単にスケールアップ、スケールダウンでき、サーバーレスの操作を実現できます。
Cloudstate との併用
このアーキテクチャはまったく珍しいというわけではなく、イベント ソーシング、コマンドクエリ責務分離(CQRS)、コンフリクトフリー レプリケーテッド データ型と呼ばれています(注: これについての概要は、Jonas Bonér 氏によるプレゼンテーション「Cloudstate - ステートフル サーバーレスに向けて」をご覧ください)。しかし、これまではプログラミング モデルと運用モデルが旧式だったために、これらのアーキテクチャを使用してシステムを構築することはとても面倒なことでした。新しい Cloudstate オープンソース プロジェクトは、よりアプローチしやすいプログラミング モデルと運用モデルを構築することで、それを変えようとしています。
Cloudstate のプログラミング モデルは、進化型のデータスキーマと生成されたサービス インタラクション スタブを有効にするプロトコル バッファ(protobuf)の上に構築されています。データスキーマに関しては、protobuf を使用することにより、旧バージョンのプロジェクトを今でも使用しているシステムを中断することなく、イベント / メッセージ オブジェクトに項目を追加できます。同様に、gRPC プロジェクトでは、protobuf をクライアントとサーバーの「スタブ」で自動的にラップできるため、protobuf ベースのネットワーク通信を処理するためのコードを記述する必要がありません。たとえば、不正検出システムでは、protobuf は次のようになります。
「トランザクション」メッセージには、トランザクションに関する詳細が含まれ、[user_id] の項目はユーザーに基づいてデータの自動シャーディングを有効にします。
Cloudstate は、この基盤の上にイベント ソーシングのサポートを追加するため、デベロッパーは、特定のコンポーネントが必要とするコマンドと蓄積された状態だけに集中できます。不正検出の例では、分散された状態を保持して新しいトランザクションをそれぞれ処理するクラス / エンティティを定義するだけです。あらゆる言語を使用できますが、ここでは Java を拡張させた、Google がサポートする言語である Kotlin を使用します。
少数のブートストラップ コードを除き、Cloudstate を使用したイベント ソーシング システムの構築に必要なのはこれだけです。
また、運用モデルも Kubernetes と Knative 上に構築されているため、同様に快適です。まず、サービスをコンテナ化する必要があります。JVM ベースのビルド(Maven、Gradle など)では、Jib を使用してこれを行うことができます。この例では、Gradle を使用して実行するだけです。
これにより、サービスのコンテナ イメージが作成され、Google Container Registry に保存されます。Cloudstate サービスを独自の Kubernetes / Google Kubernetes Engine(GKE)クラスタで実行するには、Cloudstate オペレーターと次のようなデプロイ記述子を使用できます。
これで、スケーラブルで分散されたイベントソース型のサービスができました。
また、独自の Kubernetes クラスタを管理したくない場合は、Cloudstate を推進する企業である Lightbend が提供する Akka Serverless マネージド環境で Cloudstate サービスを実行することもできます。
Cloudstate サービスを Lightbend Cloudstate にデプロイするには、以下を実行するだけです。
とても簡単です。不正検出の例を詳しく説明する動画がこちらにあります。
例のソースは GitHub をご覧ください: github.com/jamesward/cloudstate-sample-fraud
Akka Serverless を詳しく知る
なお、Akka Serverless そのものも Google Cloud 上に構築されています。このステートフル サーバーレス クラウド サービスを Google Cloud で提供するには、Cloudstate にはメッセージ用に分散型の永続的なストレージが必要です。オープンソースの選択肢として、Cloudstate では、PostgreSQL または Apache Cassandra を使用できます。マネージド Akka Serverless サービスは、グローバルな規模と高いスループットを提供する Google Cloud Spanner 上に構築されています。また、Lightbend は、GKE の自動スケーリングとセキュリティ機能を活用するために、GKE でワークロードの実行を構築することを選択しています。
Lightbend と Google Cloud には、Lightbend のオープンソースと Google のクラウド サービスを併用し、最新かつ復元性に優れ、スケーラブルなシステムを構築した数多くの共通した顧客がいます。そのために、Cloudstate が Lightbend と Google Cloud の機能を統合することをうれしく思います。また、Cloudstate を使用してどのようなものが構築されるのかを目にすることを楽しみにしています。使用を開始するには、Open Source Cloudstate プロジェクトと Lightbend の Akka Serverless マネージド クラウド サービスをご覧ください。
-Google Cloud デベロッパー アドボケイト James Ward
-Lightbend クラウド エンジニアリング担当責任者兼副 CTO Viktor Klang 氏