ステートレスとステートフルの違い


アプリケーションは「ステートレス アプリケーション(Stateless Application)」と「ステートフル アプリケーション(Stateful Application)」の2種類に分類できるそうです。しかし、このステートレスとステートフルの意味は一見簡単なようでわかりにくいです。いろいろな資料を読めば読むほど頭が混乱してきます。たとえば、アプリケーション設計はシンプルがベストであり、マイクロサービスにおいて、ステートレス アプリケーションは何より重要だと説く声がある一方、この世にステートレス アプリケーションなんてものは存在しないという声もあります。

混乱の理由は視点の違いです。アプリケーション設計にも経済学のようにミクロとマクロの視点があるとすれば、マクロ設計はシステム全体を大局的に捉え、アプリケーションにはステート(状態)が付きものだから、それがないのは初心者プログラマーが最初に作るHello Worldプログラムぐらいだとか。一方、ミクロの視点では、システムを構成する個々の要素を見て、ある部分はステートレスで、ある部分はステートフルであると言います。その場合、ステートフル アプリケーションとは即ちデータベースのことであり、その他のステートレス アプリケーション群をまとめてアプリケーション レイヤーと呼んだりします。

この2つの異なる視点を混ぜ合わせて、ステートレス アプリケーションとステートフル アプリケーションの違いを論じる記事(主に英語)がネットに溢れています。書いている人は当然、私はミクロ視点です、とか、マクロです、とか断って書くわけではないので、読み手が「ははーん、さてはこの筆者はマクロだな」と斟酌して読まなければなりません。

さらに状況を複雑にしているのは、この議論が「コンテナ」と切っても切れない関係にある点です。「コンテナとは本質的にステートレスだ」という言説と、「ステートフル コンテナこそが重要だ」という言説が入り混じっています。

マイクロサービス アーキテクチャにおいて、各要素をステートレスなコンテナに隔離し、個々に独立させて互換性や整合性の問題から切り離し、可搬性を確立することこそがコンテナの真価であり、その意味では「コンテナ=ステートレス」の原理には納得するしかありません。Kubernetesをはじめとするオーケストレーション ツールは、コンテナをシステム リソースに応じて適切なノードに臨機応変に再起動するものであり、可搬性はコンテナがコンテナである所以です。

しかし、マクロ視点に立ち返ると、本来ステートフルなアプリケーションをコンテナ化したら、最低でも1つのコンテナはステートフルでなければアプリケーションが機能しません。それに対して、ミクロ論者は、コンテナ アーキテクチャの外にデータベースを接続すべきだと言います。実際、データベースはコンテナ化も、コンテナ アーキテクチャ内の永続ボリューム(Persistent Volume)に置くことも、コンテナ ストレージ インターフェース(CSI)を通じて、外部ストレージに置くことも可能です。つまり、データベースの配置次第でコンテナは完全にステートレスにも、ステートフルにもなります。ステートレスとステートフルの違いとデータベースの配置を一緒に論じたら、混乱が深まるばかりです。

そもそも「ステートレス」は「ステートがない」ことではありません。正確には、ステートはあるけれど、それは一時的で、そのアプリケーションが終了して、再起動したときにはもうそのステートが消えている、という意味です。つまり「この世にステートレス アプリケーションなんてものは存在しない」は的を射ており、もっと言うと、ステートレス コンテナさえ存在しないのです。

どうです、これですべてクリアになったでしょう?それとも、もうどっちでもよくなりましたか?それが正しいと思います。ステートレスの重要性を説く人も、ステートレスなんてないと言う人も、言葉の定義の違いだけで、実は同じことを言っており、設計上、互い矛盾することはないのですから。

関連したトピックス

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください