サーバーレスは甲殻類の夢を見るか?
TL; DR: 見ません
ド深夜に勢いで書いてるので多少文章が適当でも許してください。
Cloudflare Workers について
Cloudflare Workers、みなさん使ってますか?
最近何かとクラウドコンピューティング事業に積極的な Cloudflare。中でも Workers は AWS Lambda のようなサーバーレスコードをデプロイして *.workers.dev
ドメインの下で API エンドポイントとしてホストしておけるものです。
無料で使える枠としては概ね以下のような感じ。そんなに悪くないように見えますね。
項目 | 数値 |
---|---|
リクエスト数 | 100k Request / day |
ワーカー数 | 30 |
実行時間 | CPU Time 10ms 1 |
実行時間については少ないように見えますが、「実際のところほとんどのタスクは 10ms ぐらいで終わるからいいでしょ(意訳)」というのが Cloudflare 側の見解のようです。僕もこれ自体はまあそんなもんだと思っています。
Rustacean の苦悩
Rust を書く人のことを crustacean (甲殻類) に引っかけて Rustacean といいます。関係ないけどマスコットキャラクターの Ferris くんをよろしくね。
Rustacean は書けるものならなんでも Rust で書くという悪癖習性があることが知られています[誰によって?]。かくいう僕もその一人なんですが。実際本当になんでも Rust で書ける世界ができつつあるのは事実ですからね。
WASM に変換すれば Web フロントエンドもやろうと思えばできる時代。すごい時代になったものです。
しかし、何でも書けるからといって Rust の謳い文句の一つである生成されるコードの高速さがどこでも通用するかというとそうでもありません。 Web フロントエンドに近い部分についていえば、正直 V8 などの JavaScript エンジンの最適化が進んでいる現状 パフォーマンスで勝てるとはあまり言えません。ただでさえ WASM の境界を超えるためのオーバーヘッドがあるのに、WASM のプリミティブさがそこに拍車をかけています。
それでも僕は Rust でサーバーレスがしたい
Rust そのものの言語機能や型システム、あるいは cargo などのツールチェインのエコシステムは魅力的です。「元々 C++ で書かれていたコードを unsafe 多めな Rust に移植する」という事例もあると聞きます。
逆に TypeScript とかは書きたくないのかって?これについては、 「書きたくないわけではないがセットアップが地味にダルい」 というほぼ一点で選択肢から外れています(テンプレートを使えというのは一旦おいといてください)。 書き慣れているというのを差し引いても、 Go や Rust にはまともな静的解析・フォーマッティングに至るまでのステップ数が少ないという利点があります。あるよな?
サーバーフル に書けば Rust で快適に書けるようなものを、サーバーレスに迎合するためだけに TypeScript などで渋々書くようなマネはしたくありません。なんとかして Rust のコードとしてデプロイしたいのです。
ということでデプロイ先の選定です。AWS Lambda はネイティブバイナリをアップロードする機能があるので Rust のバイナリも理論上は動かせます。 でも僕今 AWS ひとつも使ってないんすよ。これだけのためにまた AWS を依存スタックに入れるのはなあ……という思いがありました。
そこで出てくるのが Cloudflare Workers 。今のところ手持ちのドメインはネームサーバーと DNS とキャッシュを Cloudflare に寄せていますから、ほげaaS の依存先企業が増えるということはありません。 あと単純に Cloudflare のその辺のサービスを使ってみたかったというのもあります。そして何より、Service Worker のコードとして WASM が動かせます。これを使わない手はありません。
やりました
ちょうど Rust でサーバーレスをやってデプロイして解決したい問題がここ数日で浮上したので、それの前調査としてちょっとしたコードを書いて試しました。サムネイルはそのコードの一部です。 詳しくは今後の記事で説明しようと思っています。
結果・感想
僕の意見としては 文字列操作がメインならやめとけ という感じに落ち着きました。理由は↓こんなところです。
- いくらなんでもオーバーヘッドがでかすぎる
- アセンブリのサイズ削るのは非本質的作業の割にしんどい
- UTF-8 と UTF-16 を往復したりしなかったりするから
全部 TypeScript 直接書けば解決しますね!!!チクショウめ!!!!
……普通に API サーバー書きます。
-
そのコード自体が消費した時間。インターネットアクセスなどの待機時間や sleep はカウントされない ↩︎