パフォーマンス

このドキュメントはドラフトであり、まもなくより実践的な情報を追加する予定です。しかし、私たちは私たちの取り組みを早期に伝えることを望んでいました。

Remixは、SSGのような制約を伴う正確なアーキテクチャを規定する代わりに、分散コンピューティングのパフォーマンス特性を活用することを奨励するように設計されています。

ユーザーに送信する最も速いものは、言うまでもなく、ユーザーに近いCDN上の静的ドキュメントです。最近まで、サーバーは世界のある地域でしか実行されていませんでした。これは、世界中の他の地域では応答が遅くなる原因となった可能性があります。これは、SSGが非常に人気を得た理由の1つかもしれません。開発者は、データをHTMLドキュメントに「キャッシュ」し、それを世界中に配布することができました。これは、ビルド時間、ビルドの複雑さ、翻訳のための複製されたWebサイト、認証されたユーザーエクスペリエンスでの使用不可、非常に大きく動的なデータソース(プロジェクトunpkg.comなど!)での使用不可など、多くのトレードオフを伴います。

エッジ

(U2のメンバーではありません。)

今日、分散コンピューティングの「エッジ」では、多くのエキサイティングなことが起こっています。「エッジ」でのコンピューティングは、一般的に、米国東海岸のような1つの場所だけでなく、ユーザーに近いサーバーでコードを実行することを意味します。私たちは、この動きを目の当たりにしているだけでなく、分散データベースもエッジに移行しているのを見ています。私たちはしばらく前からこれらを予測していました。それが、Remixがこのように設計されている理由です。

エッジで分散サーバーとデータベースを実行すると、動的なコンテンツを静的ファイルに匹敵する速度で配信できるようになりました。サーバーを高速化することはできますが、ユーザーのネットワークについては何もできません。 残された唯一のことは、コードをブラウザバンドルからサーバーに移し、ネットワーク経由で送るバイト数を減らし、比類のないWebパフォーマンスを提供することです。それがRemixが設計された目的です。

このWebサイト + Fly.io

このWebサイト自体には、First Byte Time(最初のバイトまでの時間)が非常に短くなっています。世界の大部分の人々にとっては、100ミリ秒未満です。ドキュメントの誤字脱字を修正すれば、1〜2分以内に、世界中でサイトが更新されます。再ビルド、再デプロイ、HTTPキャッシュなしです。

私たちは分散システムでこれを達成しました。アプリケーションは、世界中のFly上の複数のリージョンで実行されるため、ユーザーに近いです。各インスタンスには独自のSQLiteデータベースがあります。アプリケーションが起動すると、GitHub上のRemixソースリポジトリからtarballをフェッチし、マークダウンドキュメントをHTMLに処理してからSQLiteデータベースに挿入します。

このコードは、実際には、Gatsbyサイトがビルド時にgatsby-node.jsまたはNext.jsのgetStaticPropsで実行することと非常によく似ています。アイデアは、遅い部分(GitHubからのドキュメントの取得、マークダウンの処理)を処理し、それをキャッシュすることです(SSGはHTMLにキャッシュし、このWebサイトはサーバー上のSQLiteにキャッシュします)。

ユーザーがページをリクエストすると、アプリケーションはローカルのSQLiteデータベースにクエリを実行し、ページを送信します。私たちのサーバーは、これらのリクエストを数ミリ秒で完了します。このアーキテクチャで最も興味深いのは、スピードと新鮮さを犠牲にする必要がないことです。GitHubでドキュメントを編集すると、GitHubアクションが最も近いアプリケーションインスタンスのwebhookを呼び出し、そのリクエストを世界中の他のすべてのインスタンスにリプレイします。その後、すべてがGitHubから新しいtarballを引き出し、起動時に実行したのと同様に、データベースをドキュメントと同期させます。ドキュメントは、1〜2分以内に世界中で更新されます。

しかし、これは私たちが調査したいと考えていたアプローチの1つにすぎません。

Cloudflare Workers

Remix Cloudflare Workers Demo

Cloudflareは、長い間エッジコンピューティングの限界を押し広げてきました。Remixは、その利点を最大限に活用するように配置されています。デモの応答時間は、静的ファイルを提供するのと同じであることがわかりますが、デモで示されている機能は、明らかに静的ではありません!

Cloudflareは、アプリケーションをユーザーに近づけて実行するだけでなく、KVDurable Objectsなどの永続的なストレージシステムも提供しているため、データのデプロイや独自の増分ビルダーバックエンドへの結合なしに、SSGレベルの速度を実現できます。

まもなくサポートする予定の、他の類似のプラットフォームもあります。

バンドル分析

このドキュメントは、Classic Remix Compilerを使用する場合にのみ関連しています。

Remixは、サーバーのビルドディレクトリ(デフォルトではbuild/)に出力ファイルを生成するため、バンドルのサイズと構成を分析できます。

  • metafile.css.json : CSSバンドルのメタファイル
  • metafile.js.json : ブラウザのJSバンドルのメタファイル
  • metafile.server.json : サーバーのJSバンドルのメタファイル

Remixはesbuildのメタファイル形式を使用するため、これらのファイルをhttps://esbuild.github.io/analyze/に直接アップロードして、バンドルを視覚化できます。

その他のテクノロジー

サーバーの速度を上げるのに役立つその他のテクノロジーを次に示します。

  • FaunaDB - ユーザーに近い場所で実行される分散データベース
  • LRU Cache - メモリ内キャッシュ。いっぱいになると、自動的により多くのスペースを解放します。
  • Redis - よく使われているサーバー側のキャッシュ