Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

syumai
January 24, 2023

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

syumai

January 24, 2023
Tweet

More Decks by syumai

Other Decks in Programming

Transcript

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

  2. 自己紹介 syumai Go Documentation 輪読会 / ECMAScript 仕様輪 読会 主催

    株式会社ベースマキナで管理画面のSaaS を開発中 Go でGraphQL サーバー (gqlgen) や TypeScript で フロントエンドを書いています Twitter: @__syumai Website: https://syum.ai
  3. syumai/workers とは

  4. syumai/workers とは https://github.com/syumai/workers http.Handler を作って、 workers.Serve に渡すだけでCloudflare Workers 上でHTTP サーバーとして動作する

    必要なツールはtinygo とwrangler (Cloudflare Workers のCLI) だけ tinygo を使ってWebAssembly を生成して実行する
  5. 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 と表示)
  6. Go on Cloudflare Workers で辛かった部分

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

    はencoding/json すら動かなくてキツい
  8. そこにCloudflare Workers 有料プラン登場!

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

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

  11. 普通のGo で作ったWorker の例

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

    いたものを、Cloudflare Workers に移 管した https://syum.ai/
  13. gqlgen 製のGraphQL サーバー

  14. 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
  15. Cloudflare Workers の有料プランなら… => 実用的なGo 製のWeb アプリケーションが普通に動く!

  16. パフォーマンスについて

  17. 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
  18. syum.ai のベンチマーク Go のWorker は0ms cold start の限界を超えていそう 700ms 以上かかっているリクエストは、Worker

    のロードが追いつい ていない感じがする (Wasm のサイズは、未圧縮で5.6MB) とは言え、75 percentile で約170ms なので、実用的なスピードは出て はいる
  19. Bundled / Unbound どちらを使うか?

  20. Bundled / Unbound のプラン内容 Bundled: 50ms CPU time / invocation

    Unbound: 400,000 GB-s https://developers.cloudflare.com/workers/platform/pricing/
  21. syum.ai (Bundled) の直近の Error rate は64% ... 50ms CPU time

    に収まっていない様子
  22. ( 少し前ですが) gqlgen-example (Unbound) の Error rate は0%

  23. Bundled / Unbound どちらを使うか? 料金的には、Bundled のプランが月$5 で1000 万リクエストを捌けるの で、こちらの方が魅力的 Unbound

    だと同じ料金で100 万リクエストで、使用メモリ量に対す る課金も生まれる ただ、50ms CPU time に収まらないので、Go のWorker はUnbound 必須と言えそう… 。
  24. 今後の展望

  25. Cloudflare D1 サポート Cloudflare D1 の sql/driver を実装中 Go だけでCloudflare

    Worker 上でもっと実用的なアプリケーション を作れるようにしたいです! https://github.com/syumai/workers/pull/18
  26. おまけ tinygo とGo のtemplate を用意しているのでぜひ使ってみてください! https://github.com/syumai/worker-template-tinygo https://github.com/syumai/worker-template-go 実装の解説はZenn に掲載しています! Cloudflare

    Workers で簡単にGo のHTTP サーバーを動かすためのライ ブラリを作った
  27. ご清聴ありがとうございました!