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

    View Slide

  2. 自己紹介
    syumai
    Go Documentation
    輪読会 / ECMAScript
    仕様輪
    読会 主催
    株式会社ベースマキナで管理画面のSaaS
    を開発中
    Go
    でGraphQL
    サーバー (gqlgen)
    や TypeScript

    フロントエンドを書いています
    Twitter: @__syumai
    Website: https://syum.ai

    View Slide

  3. syumai/workers
    とは

    View Slide

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

    View Slide

  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
    と表示)

    View Slide

  6. Go on Cloudflare Workers
    で辛かった部分

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. 5MB
    のWorker
    が作れると…

    tinygo
    じゃない普通のGo
    のWorker
    が動く!

    View Slide

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

    View Slide

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

    View Slide

  13. gqlgen
    製のGraphQL
    サーバー

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  19. Bundled / Unbound
    どちらを使うか?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  24. 今後の展望

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide