エッジコンピューティング

背景
FastlyやCloudflareのエッジサーバー上でjsを動かすことがトレンディーな気がするけど、結果、何がいいんだっけ?がわからなくなってきたのでまとめ

エッジコンピューティングを提供しているサービス
- Fastly
- Cloudflare
- Akamai
- AWS

GCPはどうなんだろう、、
Cloud functionsがそれっぽく出てくるけど、リージョン設定もあるっぽいし、エッジコンピューティングと言えるのだろうか、、

エッジコンピューティングの定義
文献
エッジとは?
ユーザーのデバイスから物理的に近い部分
エッジサーバーとは?
元々はCDN(コンテンツ・デリバリー・ネットワーク)として静的コンテンツをユーザーから近い距離にあるサーバーにキャッシュするために生み出された。
エッジコンピューティングとは?
広義ではCDNもエッジコンピューティングの一つ。
CDNはエッジサーバーにコンテンツキャッシュを保存し、返すというコンピューティングを行なっている。
現在では、エッジサーバーでコードの記述をすることが可能になってきており、それをエッジコンピューティングと呼ぶ。

エッジコンピューティング = サーバレスコンピューティング?
定義が曖昧になりつつあるけど、サーバレスコンピューティングの中でエッジサーバーで動くパターンがエッジコンピューティングと呼ばれている
という理解で大体は良さそう

利点
コスト削減
- サーバレスコンピューティングによるコスト削減
- 実行課金になるため、コスト削減が見込まれる
- オリジンサーバーのリソース最小化よるコスト削減
パフォーマンス向上
- オリジンサーバーに到達する前にエッジサーバーで処理されるため、パフォーマンス向上が見込める

利点の深堀り
パフォーマンスって本当に向上するのだろうか?という疑問
例えば、オリジンサーバーをGCPで置いたとすると、ロケーションは東京と大阪になる。
前段にFastlyやCloudflareを置いたら少しは近くなるかもしれないけど、日本からアクセスがある分には、ほぼ一緒な気がする

ざっと調べてみた感じ、アクセスが日本ばかりということであれば、距離によるパフォーマンス改善というより、サーバレスコンピューティングによるリソースや帯域の節約というのが大きそう

後で詳しく調べるが、FastlyやCloudflareでは、サーバレスに動くが、コールドスタンバイによるレイテンシーがほぼない状態で動く
つまり、小さなプログラムコードが瞬時に他のプロセスとは分割された状態で動作する
というのが結構大きそう
これにより、オリジンサーバーへのアクセスが減り、リソースや帯域圧迫されず、動的なスクリプトを動かすことができる

活用方法
- デバイス検出
- ジオロケーション
- ログ
- 分析
- キャッシュ
- etc...
かなり色々なことができるようになってきている。
Cloudflare
Cloudflare Workersを用いることでスクリプトを実行することができる
JavaScriptが正式サポートされているのがかなり大きく、V8エンジンで動作するため、コールドスタンバイによるレイテンシーはほぼなくサーバレスに動作する。
Cloudflare KVを用いることでコンテンツを格納することもできるし、Cloudflare D1を用いることでデータベースをエッジサーバーに持つみたいなことも可能になってきている
以下に、Cloudflare Workersを用いた二つの例を挙げておく
Next.js(Vercel)の例
Vercelでは、内部的にCloudflareを用いているっぽいけど、Next.jsのMiddlewareを実行することができ、サーバーサイドに到達する前に処理を行うことができる。
- 認証やアクセスコントロール
- 認証情報にアクセスし、パーミッションチェックを行うことができる。認証情報を持っていなかったらリダイレクトさせたりという使い方
- APIの実行
- 小さな単位でデプロイされていればエッジ上でスクリプトが動かせるため、データの取得・保存などをすることも可能
- 小さいアプリケーションであれば、オリジンサーバーを持たないという選択もできる
- 小さな単位でデプロイされていればエッジ上でスクリプトが動かせるため、データの取得・保存などをすることも可能
- Cookie操作
- httponly cookieなどにもアクセスできるため、cookieを操作することが可能
- これにより、ABテストを振り分けたり、広告のタグをつけたりということが可能
などができる
Remixの例
RemixだとRemix自体をCloudflare Workersにデプロイすることができる
Remixはloaderやactionを実装することで、サーバーサイドで処理をすることができるため、実質、小さなアプリケーションであれば、Cloudflare上で全てを処理することが可能
つまり、オリジンサーバーを必要とせず、エッジサーバーで各プロセスが動き、高速にユーザーに返すことができる。
Fastly
Rustが正式サポートされており、高速にスクリプトを実行することが可能
JavaScriptはβとなっている
Next.jsの例
Next.js自体がFastlyのエッジサーバーにのせることができる
全てがサポートされているわけではないが、CloudflareではNext.js自体をホスティングすることはできないので、かなり大きい

もっと活用
サーバーコンポーネントのストリーミング配信
ReactやNextがかなり力を入れてそうな印象
エッジサーバーでサーバーコンポーネントを作り、クライアント側にそれをストリーミング配信する。
サーバーコンポーネントは一つ一つのコンポーネントでデータソースへのアクセスが行われたりするため、オリジンでやってしまうとかなりリソースを食ってしまうのではないかなぁと思っている
その点、エッジサーバーだとV8 Isolete環境で立ち上がったりするので、Nodejsのサーバレス環境などより早く、リソースも気にしないでいけたりするのでは?
エッジサーバーが物理的に近いところにあるというのはどれだけスピードに影響を及ぼすのかよくわからんけど、リソース面やネットワーク面でのメリットは大きそう