Closed13

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

kobokobo

背景

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

kobokobo

エッジコンピューティングの定義

文献

エッジとは?

ユーザーのデバイスから物理的に近い部分

エッジサーバーとは?

元々はCDN(コンテンツ・デリバリー・ネットワーク)として静的コンテンツをユーザーから近い距離にあるサーバーにキャッシュするために生み出された。

エッジコンピューティングとは?

広義ではCDNもエッジコンピューティングの一つ。
CDNはエッジサーバーにコンテンツキャッシュを保存し、返すというコンピューティングを行なっている。
現在では、エッジサーバーでコードの記述をすることが可能になってきており、それをエッジコンピューティングと呼ぶ。

kobokobo

エッジコンピューティング = サーバレスコンピューティング?

定義が曖昧になりつつあるけど、サーバレスコンピューティングの中でエッジサーバーで動くパターンがエッジコンピューティングと呼ばれている

という理解で大体は良さそう

kobokobo

利点

コスト削減

  • サーバレスコンピューティングによるコスト削減
    • 実行課金になるため、コスト削減が見込まれる
  • オリジンサーバーのリソース最小化よるコスト削減

パフォーマンス向上

  • オリジンサーバーに到達する前にエッジサーバーで処理されるため、パフォーマンス向上が見込める
kobokobo

利点の深堀り

パフォーマンスって本当に向上するのだろうか?という疑問

例えば、オリジンサーバーをGCPで置いたとすると、ロケーションは東京と大阪になる。
前段にFastlyやCloudflareを置いたら少しは近くなるかもしれないけど、日本からアクセスがある分には、ほぼ一緒な気がする

kobokobo

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

kobokobo

後で詳しく調べるが、FastlyやCloudflareでは、サーバレスに動くが、コールドスタンバイによるレイテンシーがほぼない状態で動く

つまり、小さなプログラムコードが瞬時に他のプロセスとは分割された状態で動作する

というのが結構大きそう

これにより、オリジンサーバーへのアクセスが減り、リソースや帯域圧迫されず、動的なスクリプトを動かすことができる

kobokobo

活用方法

  • デバイス検出
  • ジオロケーション
  • ログ
  • 分析
  • キャッシュ
  • 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の例

https://www.fastly.com/jp/blog/run-your-next-js-app-on-fastly

Next.js自体がFastlyのエッジサーバーにのせることができる
全てがサポートされているわけではないが、CloudflareではNext.js自体をホスティングすることはできないので、かなり大きい

kobokobo

もっと活用

サーバーコンポーネントのストリーミング配信

ReactやNextがかなり力を入れてそうな印象
エッジサーバーでサーバーコンポーネントを作り、クライアント側にそれをストリーミング配信する。

サーバーコンポーネントは一つ一つのコンポーネントでデータソースへのアクセスが行われたりするため、オリジンでやってしまうとかなりリソースを食ってしまうのではないかなぁと思っている

その点、エッジサーバーだとV8 Isolete環境で立ち上がったりするので、Nodejsのサーバレス環境などより早く、リソースも気にしないでいけたりするのでは?
エッジサーバーが物理的に近いところにあるというのはどれだけスピードに影響を及ぼすのかよくわからんけど、リソース面やネットワーク面でのメリットは大きそう

kobokobo

話はエッジサーバーからそれちゃうけど、↑のような形になってくるとボトルネックになるのはどちらかというとバックエンドやDBになるのかな

どれくらい大変になるのかはよくわかってないので、そういう未来が来たら調べる

kobokobo

Cloudflare D1などを使えば、ボトルネックは消えるのかな?

このスクラップは2022/10/19にクローズされました