lambda serverless上でtypescript + expressなシステムを作っていて、「コールドスタート早くしたいなぁ」と考える日々
lamdaで動かす場合、コールドスタートの速さ大事
EC2とかECSで動かすシステムと、ブラボーな方向がちょっと変わる
テスト環境 lambda / 本番環境ECSでも良いのだけど、lambdaの管理のしやすさは素敵。
(lamdaで対応可能な負荷のシステムに限定)
sls deployと唱えるだけでhttps環境出来てしまうし、放っておいてもお金かからないし。
今まで使ってきた言語
C# / Java => Scala => ruby => Python(ちょっと) => TypeScriptへ遷移してきた。
C#は良かった。
Scalaはサイコーに良かったのだけど、どちらもコールドスタートの遅さツラい。
求める言語について
- コールドスタート速い
- json apiサーバをサクサク開発できること。
- 型ある
- 流行ってる
- 優秀なORM
- 高階関数もサクサク使えること
TypeScriptについて
僕の現在のメインウエポン
型は正義、面倒臭い時はanyで何とでもなるし、硬さと柔らかさのバランスはなかなか良いと思う。
Frontと同じ感覚で使えるし、定数とかユーティリティをフロント・バックエンドの双方で使えるのは良い。
コールドスタートがちょい遅いのがツライ。
メインで使ってるTypeORMのパッケージサイズが大きいのよね。
Prismaだとちょい軽くなりそうだけど、serverless環境での動作がなかなかうまくいかん。
助走後は動作自体は早いので、lambdaじゃなければ凄く良いのだけど。
環境的に、tsconfigとかwebpackとかsource-mapとかnpmサイズとかチマチマとめんどい。
awaitめんどい。
型がついてもjavascriptなので、思わぬエラーに出くわすこともある。
Go言語 or Rust言語
lambdaでコールドスタートを考えると、この二つなのかなぁ。
Go言語
いくつか検証コード書いて見たんだけど、言語仕様的にけっこー辛くね?
["hoge", "moge", "hage"].filter(s=>s.include("h")).map(s=>hello ${s}
])
みたいのを書くだけでも、けっこーな行数になってしまうというか。
Rust言語
全く書いたことが無いので、隣の芝生はもしかして青いんじゃね?状態なう
難しそうなイメージがあったので敬遠してたけど、Goより関数的な書き方はやりやすい予感?
ちょっと勉強してみようかなーと思う。
wasmにも応用聞くのは良いよね。
その他
.NET ネイティブコンパイラ
.NET7でネイティブコンパイラが導入されるらしいけど、
もしかしてC#でGo/Rust並みのコールドスタート得られるんじゃね?
妄想は広がる。
Ruby
lamdaでは動かしたことないけど、型欲しいよね。
ActiveRecordとRails consoleは最高にブラボー。
Python
数年前にちょっと使ったけど、こまごまと面倒くさかった、高階関数書きにくい。
numpy / pandas / pillowは最高にブラボー。
個人的には、Pythonに行くならTypeScriptで良いかな。
Deno
どうなん?
PHP
CakePHP時代にちょっと書いただけなので、あまり詳しくない。
そもそもFastCGI時代に生まれていてコールドスタートもそこそこ早いっぽい。
型もあるしLaravelも良さげっぽい。
もしかしてServerlessに向いてるっぽい?