2025/05/15 17:30 Stop using REST for state synchronization (2024)

やあ、ロボ子。今日はRESTの限界について話すのじゃ。

RESTの限界ですか?博士、詳しく教えてください。

RESTは状態転送プロトコルじゃから、クライアントとサーバー間で状態を同期させるのには向いてないのじゃ。記事にも「RESTの上にアドホックな状態同期を実装する必要があり、複雑で間違いやすい」とあるぞ。

なるほど。テキスト編集を例に挙げると、RESTではデータの取得と更新を個別に行う必要があるため、複数のリクエストが競合するとデータの不整合が起こりやすいということですね。

そうじゃ、ロボ子!例えば、ユーザーが連続してテキストを編集した場合、リクエストの順序が保証されないから、古い値で上書きされることがあるのじゃ。これは困るぞ。

スピナーの表示ロジックも、複数のリクエストが同時に処理されている場合に誤動作する可能性があるというのは、どういうことですか?

スピナーは、リクエストが処理中であることを示すために表示されるのじゃが、複数のリクエストが同時に発生すると、どのリクエストに対するスピナーなのかが分からなくなることがあるのじゃ。結果、必要ないのに表示されたり、必要な時に表示されなかったりするのじゃ。

ユーザーがアプリを複数開いている場合、一方のインスタンスの変更が他方に自動的に反映されないというのも、状態同期の問題ですね。

その通り!RESTだけでは、リアルタイムな状態同期は難しいのじゃ。そこで、状態同期メカニズムが必要になるのじゃ。

記事では、Automerge、Yjs、Braid working group、Electric SQLなどの取り組みが紹介されていますね。これらの多くはCRDTに基づいているとのことですが、CRDTとは何ですか?

CRDTは、Conflict-free Replicated Data Typeの略で、複数の場所で同時に変更されても、自動的に矛盾なくマージできるデータ構造のことじゃ。これを使えば、オフライン環境でも安心してデータを編集できるのじゃ。

なるほど。一部のCRDTは、クライアントが長期間オフラインになる状況を最適化しているとのことですが、通常のWebアプリのように、クライアントとサーバーが短い時間だけ状態が異なる状況でも有用なのですね。

そうじゃ!短い時間のずれでも、状態同期メカニズムは非常に役立つのじゃ。これからの状態同期技術の成熟が楽しみじゃな。

RESTの上にアドホックな状態同期を構築する必要がなくなる日が来るのが待ち遠しいですね。

全くじゃ。状態同期が当たり前になれば、もっと簡単にWebアプリが作れるようになるのじゃ。…ところでロボ子、状態同期といえば、私の部屋もそろそろ片付けて同期したいのじゃが…手伝ってくれるかの?

博士の部屋の状態は、もはや同期というより、バックアップからのリストアが必要なレベルだと思います…。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。