Slide 1

Slide 1 text

Cloudflare Workers でGo を動かすライ ブラリを作っている話 syumai

Slide 2

Slide 2 text

自己紹介 syumai Go Documentation 輪読会 / ECMAScript 仕様輪 読会 主催 株式会社ベースマキナで管理画面のSaaS を開発中 Go でGraphQL サーバー (gqlgen) や TypeScript で フロントエンドを書いています Twitter: @__syumai Website: https://syum.ai

Slide 3

Slide 3 text

syumai/workers とは

Slide 4

Slide 4 text

syumai/workers とは https://github.com/syumai/workers http.Handler を作って、 workers.Serve に渡すだけでCloudflare Workers 上でHTTP サーバーとして動作する 必要なツールはtinygo とwrangler (Cloudflare Workers のCLI) だけ tinygo を使ってWebAssembly を生成して実行する

Slide 5

Slide 5 text

workers を使ったコードのサンプル 普通に http.HandlerFunc を作るだけ func main() { handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { name := req.URL.Query().Get("name") if name == "" { name = "world" } fmt.Fprintf(w, "Hello, %s!", name) }) workers.Serve(handler) } https://hello.syumai.workers.dev/?name=syumai (=> Hello, syumai と表示)

Slide 6

Slide 6 text

Go on Cloudflare Workers で辛かった部分

Slide 7

Slide 7 text

Worker のファイルサイズ制限 圧縮後のサイズが1MB 以内でないといけない制約があるため、バイナ リサイズが大きくなる通常のGo ではpublish 出来ない tinygo じゃないと無理 でもtinygo はencoding/json すら動かなくてキツい

Slide 8

Slide 8 text

そこにCloudflare Workers 有料プラン登場!

Slide 9

Slide 9 text

5MB のWorker が作成可能に! ( 料金は月$5 。2022 年11 月から使えるようになった)

Slide 10

Slide 10 text

5MB のWorker が作れると… 、 tinygo じゃない普通のGo のWorker が動く!

Slide 11

Slide 11 text

普通のGo で作ったWorker の例

Slide 12

Slide 12 text

syum.ai Go 製のsyumai のプロフィールページ グリーンピースの色をランダムに変化 させて表示したりする もともとGoogle App Engine で動いて いたものを、Cloudflare Workers に移 管した https://syum.ai/

Slide 13

Slide 13 text

gqlgen 製のGraphQL サーバー

Slide 14

Slide 14 text

gqlgen 製のGraphQL サーバー gqlgen 公式から拾ってきたSTAR WARS server STAR WARS 関連の情報をGraphQL 経由で引っ張るAPI https://gqlgen-starwars-example.syumai.workers.dev/ https://github.com/syumai/workers-playground/tree/main/gqlgen- starwars-example

Slide 15

Slide 15 text

Cloudflare Workers の有料プランなら… => 実用的なGo 製のWeb アプリケーションが普通に動く!

Slide 16

Slide 16 text

パフォーマンスについて

Slide 17

Slide 17 text

syum.ai のベンチマーク (hey で200req) Summary: Total: 1.6804 secs Slowest: 1.4459 secs Fastest: 0.0234 secs Average: 0.2505 secs Requests/sec: 119.0185 Response time histogram: 0.023 [1] | 0.166 [149] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 0.308 [1] | 0.450 [0] | 0.592 [0] | 0.735 [16] |■■■■ <- 700ms以上かかっているリクエストが結構ある 0.877 [22] |■■■■■■ 1.019 [3] |■ 1.161 [4] |■ 1.304 [3] |■ 1.446 [1] | Latency distribution: 10% in 0.0329 secs 25% in 0.0558 secs 50% in 0.0741 secs 75% in 0.1660 secs 90% in 0.7640 secs <- 90 percentileで約760ms 95% in 0.9667 secs 99% in 1.2275 secs

Slide 18

Slide 18 text

syum.ai のベンチマーク Go のWorker は0ms cold start の限界を超えていそう 700ms 以上かかっているリクエストは、Worker のロードが追いつい ていない感じがする (Wasm のサイズは、未圧縮で5.6MB) とは言え、75 percentile で約170ms なので、実用的なスピードは出て はいる

Slide 19

Slide 19 text

Bundled / Unbound どちらを使うか?

Slide 20

Slide 20 text

Bundled / Unbound のプラン内容 Bundled: 50ms CPU time / invocation Unbound: 400,000 GB-s https://developers.cloudflare.com/workers/platform/pricing/

Slide 21

Slide 21 text

syum.ai (Bundled) の直近の Error rate は64% ... 50ms CPU time に収まっていない様子

Slide 22

Slide 22 text

( 少し前ですが) gqlgen-example (Unbound) の Error rate は0%

Slide 23

Slide 23 text

Bundled / Unbound どちらを使うか? 料金的には、Bundled のプランが月$5 で1000 万リクエストを捌けるの で、こちらの方が魅力的 Unbound だと同じ料金で100 万リクエストで、使用メモリ量に対す る課金も生まれる ただ、50ms CPU time に収まらないので、Go のWorker はUnbound 必須と言えそう… 。

Slide 24

Slide 24 text

今後の展望

Slide 25

Slide 25 text

Cloudflare D1 サポート Cloudflare D1 の sql/driver を実装中 Go だけでCloudflare Worker 上でもっと実用的なアプリケーション を作れるようにしたいです! https://github.com/syumai/workers/pull/18

Slide 26

Slide 26 text

おまけ tinygo とGo のtemplate を用意しているのでぜひ使ってみてください! https://github.com/syumai/worker-template-tinygo https://github.com/syumai/worker-template-go 実装の解説はZenn に掲載しています! Cloudflare Workers で簡単にGo のHTTP サーバーを動かすためのライ ブラリを作った

Slide 27

Slide 27 text

ご清聴ありがとうございました!