巷で話題のエッジワーカーというやつ。
お仕事で使えるかもしれないというわけで、Docsを一通り読んでみて、ちょっとしたコードをデプロイしてみたところまでの感想。
Docsを読んでの学び
コールドスタートがない
AWSやらGCPのそれと違って、ランタイムごとにコンテナを〜という構造ではないから。
V8のIsolateなる機能を使って、基本的に立ちっぱのホストの上で、ランタイムだけを起動できるとのこと。
なので、たまーに動かすコードでも実行が速いというわけ。
リージョン: 地球
普通にそう書いてあってカッコいい・・ってなった。
実行時間の制限がない
時間に関する制限は、CPU時間だけ。
Netlify functionsやLambdaで気軽にできなかった、
みたいなことが、単独でできる。
Slack Botは、チュートリアルでもカバーされててGitHubにコードもある。
そして実行時間で課金されるわけでもないっていうのがポイント。
用途によってはCPU時間がオーバーすることもあるかもしれんけど、ほとんどの一般人は困らない感じよね。
Cronでの定期実行もできる
さすが〜欲しい機能わかってる〜って感じ。
この場合は、`addEventListener("fetch")`ではなく、`addEventListener("scheduled")`でハンドラを定義する。
HTTPしか話せない
通信プロトコルとして。
つまり、MySQLやMongoDBやらを簡単に読みに行けないし、SMTPやらUDPやらも、もちろん使えない。
いわゆる`ServiceWorkerGlobalScope`でコード書いてるという認識がなくて、単なるFaaS代替と捉えてると、思ってるのと違う・・ってなりそう。
そういうデザインなので仕方がない気はするけど、実用性という意味では割と大きな制限かなーと思う。(DBの前段にGraphQL置くか〜〜〜ってなる)
Node.jsではない
つまり、`EventEmitter`とか`child_process`とか`Buffer`とか`crypto`とか、そういうのはない。
WHATWG Streamsとか、Web Cryptoとかそういうのはある。(これも`ServiceWorker`なので・・と思えばまあ)
`npm`から持ってきたライブラリがそのままでは動かない、みたいなのはよくありそうで、よくわかってないと誤解されそう。
(FaaS代替として)コードを書いてみて
wanglerがよくできてる
WorkerをデプロイするためのCLIが`wrangler`というコマンドで、これがよくできてるなと思った。
`webpack`が同梱されてて、`wrangler publish`ってするだけで、自動でprodビルドしてデプロイしてくれる便利・・!
単にFaaS代替として使ううちは、自分でビルドしたい気持ちもそんなに出てこないので、`sls`の代わりに使える。
あとは`wrangler secret put MY_SECRET_KEY`ってすると、環境変数的な値を埋め込めたりするのも、GUIから設定したくない派としては嬉しいポイント。
wrangler dev惜しい
`wrangler dev`という、仮の実行環境にコードをデプロイして、それを透過的に`localhost`からアクセスする機能がある。
(実際にデプロイしてるということに気づかず、ローカルで完結してるっていう先入観があると、即リロードしても反映されてないあれ?ってなるはず)
`console.log()`でデバッグできるのはすごい便利な反面、ファイルの増減で割とカジュアルにcrashしたりする感じがある・・。
シンプルゆえに
そもそもの発端がFaaS代替ではなく、CDN前のServiceWorkerなメンタルモデルなので、そこに慣れてないといろいろハマるかなーと思った。
- `Response`生成したら`Request`の中身さわれなくなるとか
- `waitUntil()`、`passThroughOnException()` の使い方いまいちわからんとか
あとは、リクエストをパースするコードも用意されてないので、ルーターみたいなのが欲しくなるまでに時間はかからないと思う。
観測範囲だとやはり https://github.com/lukeed/worktop 推しかな・・?