Cloudflare Workers を使う前に知っておきたい注意点
Cloudflare WorkersでNode.jsを動かすためのあれこれをスクラップに残していたのですが、ハマったポイントが多かったのでこちらに整理しておきます。
今回やろうとしたのは、Zennのマークダウン→HTML変換のAPIをCloudflare Workersで動かすというものです。試行錯誤の末に断念したのですが、以下でその理由をまとめておきます。
CPUやメモリ、ファイルサイズなどの制限が厳しめ
2023/07/25時点でのCloudflare Workersの制限一覧がこちら。
CDNのエッジで動くので、パフォーマンスが良いぶん制限が厳しめです。
- メモリ上限は128MB
-
サイズ上限は無料プランだと圧縮後1MBまで
- 有料プランだと10MBの上限となるが、できるかぎり1MB以内に抑えたい(参考:Server Side JavaScript のためのバンドル最適化)
CPU Runtimeが10ms / 50ms(有料プラン)というのも気になります。CPU Runtimeの詳細には以下のように書かれています。
Most Workers requests consume less than a millisecond. It’s rare to find a normally operating Workers script that exceeds the CPU time limit. A Worker may consume up to 10ms on the free plan and 50ms on the Bundled tier. The 10ms allowance on the free plan is enough execution time for most use cases including application hosting.
There is no limit on the real runtime for a Workers script. As long as the client that sent the request remains connected, the Workers script can continue processing, making subrequests, and setting timeouts on behalf of that request. When the client disconnects, all tasks associated with that client request are canceled. You can use event.waitUntil() to delay cancellation for another 30 seconds or until the promise passed to waitUntil() completes.
つまり50msというのは実際にスクリプトの実行にかかる時間のことで、例えば「外部APIにリクエストして待機してる時間」などはカウントされないようです(良かった)。
ダイナミック・インポートはできない
また、現状ではCloudflare Workers上でダイナミック・インポートをすることができません。
- "self.webpackChunk is not a function" when publishing to development env #1044
- Support of dynamic import #1060
Zennもマークダウン変換ではPrism.jsを使っており、これが最大のネックになりました。Prism.jsではハイライトのルールが言語ごとに分割されており、Node.jsで動かすときにはこれらを必要になったときにダイナミック・インポートすることになります。
あらかじめ全てインポートしておく手も考えられますが、それだと1MBの制限を超えてしまいます。
以上の理由からZennのマークダウン変換APIをCloudflare Workersにデプロイするのは一旦断念しました。Prism.jsをクライアント側で動かせば解決する問題なので余裕ができたら再度検討したいと思います。
参考
Discussion
2023/07/25時点
Script size -> Worker sizeになって1MB -> 10MBになった
Number of scripts -> Number of Workersになって30,100から100,500になった
他にも色々変わってるようです
ありがとうございます。有料だとサイズ上限が10MBになったのですね。追記しておきました。