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

HonoとPostgreSQL with Workersを本番投入に向けて検証している話

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Horai Horai
February 26, 2024
1.3k

HonoとPostgreSQL with Workersを本番投入に向けて検証している話

Avatar for Horai

Horai

February 26, 2024
Tweet

Transcript

  1. Workers Tech Talks in Osaka #1 2024/02/26 Honoと PostgreSQL with

    Workersを 本番投⼊に向けて検証している話
  2. ⽬次 Chapter 1 Chapter 2 Chapter 3 なぜWorkersを使うのか 制約と必要なピース Workersの制約

    必要なピース 遭遇する問題 node compatibility contextの引き回し connection pooling Chapter 4 Chapter 5 Chapter 6 実装のtipsや解決策 DB関連サービス AsyncLocalStorage パフォーマンス検証 CloudSQL HyperDrive Supabase Neon 今後の展望
  3. • Paid Planでも$5〜 • $0.02/100万[CPU ms] • $0.3/100万[req] • コールドスタートもほぼ

    意識しなくてよい すごい安いうえにコールドスタートもほとんどない なぜWorkersを使うのか https://developers.cloudflare.com/workers/platform/pricing/
  4. • CPU Time(Standard pricing) • Max of 30 seconds of

    CPU time per invocation • Max of 15 minutes of CPU time per Cron Trigger or Queue Consumer invocation • Node.jsの全てのAPIが使えるわけではない • Cloudflare Workers uses the V8 JavaScript engine from Google Chrome • 例えばfsは使えない Cloudflare Workersにおける制約 制約と必要なピース
  5. • CPU Time(Standard pricing) • 外部との通信は含まれない • 普通のapiで30秒は⼗分だし、CronやQueueでのバッチも15分あれば適切 に切り分けて実⾏すればよいのでは •

    Node.jsの全てのAPIが使えるわけではない • とはいえ回避可能なことが多い • コミュニティの盛り上がりによるエコシステムの充実も感じる • 例: Firebaseなどのjwtの取り扱いはWeb Standards APIのみで組むのは⼀苦労だけど Code-Hex/firebase-auth-cloudflare-workers のお陰で楽に回避可能 Cloudflare Workersにおける制約 制約と必要なピース
  6. Cloudflare Workers周辺技術 • Workers/Pages, Pub/Sub, Queues, KV, R2(Object Storage), Stream,

    Images… • Zero Trust, Load Balancing, WAF… 制約と必要なピース 基本的なWebアプリケーションに 必要な技術は揃っているのではないか
  7. 遭遇する問題 • 新しいフラグ • AsyncLocalStorageが使える • pg (node-postgres)が使えない • 旧来のフラグ

    • globalThisが使える • pg (node-postgres)が使える → Postgres.js(porsager/postgres)でnodejs_compatに寄せることが可能 https://github.com/cloudflare/workers-sdk/issues/4082 nodejs_compat vs node_compat お気持ち: ロギングなどにAsyncLocalStorageを活⽤していきたい。今後もnodeの互換性に関する実装はnodejs_compatの⽅が進みそう。新しい⽅を使いたい。
  8. Connection poolはDatabase側に任せる Serverless環境で利⽤しやすいDatabaseサービス • Hyperdrive(Connection Poolingとクエリキャッシュのみで別途Databaseは必要) • WorkersがPaid PlanであればConnection Poolingは無料

    • PostgreSQLであれば基本的に使える(2024/02現在) • Supabase • supabase/supavisorによってConnection Poolingの対応できる • Neon • ただし⽇本リージョンがなくレイテンシーが無視できない ⼿元では単純なクエリを1回実⾏するだけでも500ms以上かかった(TCP接続) 実装のtipsや解決策
  9. AsyncLocalStorageを活⽤する 実装のtipsや解決策 • compatibility_flags = [ "nodejs_compat" ] で使える •

    Request単位でmemory safeで⼀意なインスタンスを作成可能 • AsyncLocalStorageによりglobalなinstanceを代⽤する
  10. 調査⽅法 パフォーマンス検証 • データはNeonが提⽰しているサンプルデータPeriodic table data • 1table, 118 Records,

    source file size 17KB • 1リクエスト内で50件取得するselect⽂を5回実⾏ • performance.now()によりそのクエリ部分の時間を記録 • クエリ `SELECT * FROM periodic_table limit 50` • リクエストは2回続けて⾏い、初回と2回⽬を記録 • PostgreSQL clientは Postgres.js(porsager/postgres) • 調査対象は下記 • Cloud SQL(Tokyo), Hyperdrive + Cloud SQL(Tokyo), Neon(Singapore), Supabase(Tokyo)
  11. 調査結果 パフォーマンス検証 Supabase Cloud SQL Hyperdrive (Cache無効) Hyperdrive (Cache有効) Neon

    初回 2回⽬ 初回 2回⽬ 初回 2回⽬ 初回 2回⽬ 初回 2回⽬ 1 102ms 81ms 79ms 72ms 974ms 400ms 325ms 91ms 1537ms 775ms 2 16ms 15ms 11ms 11ms 375ms 326ms 53ms 63ms 86ms 84ms 3 16ms 16ms 12ms 11ms 432ms 324ms 58ms 62ms 86ms 84ms 4 22ms 15ms 11ms 11ms 414ms 325ms 64ms 62ms 87ms 85ms 5 16ms 15ms 11ms 11ms 327ms 325ms 37ms 62ms 86ms 84ms
  12. 調査結果 パフォーマンス検証 • 初回リクエスト、初回クエリは接続にオーバーヘッドがある Supabase Cloud SQL Hyperdrive (Cache無効) Hyperdrive

    (Cache有効) Neon 初回 2回⽬ 初回 2回⽬ 初回 2回⽬ 初回 2回⽬ 初回 2回⽬ 1 102ms 81ms 79ms 72ms 974ms 400ms 325ms 91ms 1537ms 775ms 2 16ms 15ms 11ms 11ms 375ms 326ms 53ms 63ms 86ms 84ms 3 16ms 16ms 12ms 11ms 432ms 324ms 58ms 62ms 86ms 84ms 4 22ms 15ms 11ms 11ms 414ms 325ms 64ms 62ms 87ms 85ms 5 16ms 15ms 11ms 11ms 327ms 325ms 37ms 62ms 86ms 84ms 所感: Cloud SQLのみ Connection Poolの仕組みはないことにより初回と2回⽬があまり変わらないのかもしれない
  13. 調査結果 パフォーマンス検証 • SupabaseとCloud SQLが速い Supabase Cloud SQL Hyperdrive (Cache無効)

    Hyperdrive (Cache有効) Neon 初回 2回⽬ 初回 2回⽬ 初回 2回⽬ 初回 2回⽬ 初回 2回⽬ 1 102ms 81ms 79ms 72ms 974ms 400ms 325ms 91ms 1537ms 775ms 2 16ms 15ms 11ms 11ms 375ms 326ms 53ms 63ms 86ms 84ms 3 16ms 16ms 12ms 11ms 432ms 324ms 58ms 62ms 86ms 84ms 4 22ms 15ms 11ms 11ms 414ms 325ms 64ms 62ms 87ms 85ms 5 16ms 15ms 11ms 11ms 327ms 325ms 37ms 62ms 86ms 84ms
  14. 調査結果 パフォーマンス検証 • Hyperdriveもクエリキャッシュが有効であれば速い 所感: 1つのworkersでHyperdriveのクエリキャッシュ有効/無効の2接続を使い分けるといいかもしれない(共存可能) Supabase Cloud SQL Hyperdrive

    (Cache無効) Hyperdrive (Cache有効) Neon 初回 2回⽬ 初回 2回⽬ 初回 2回⽬ 初回 2回⽬ 初回 2回⽬ 1 102ms 81ms 79ms 72ms 974ms 400ms 325ms 91ms 1537ms 775ms 2 16ms 15ms 11ms 11ms 375ms 326ms 53ms 63ms 86ms 84ms 3 16ms 16ms 12ms 11ms 432ms 324ms 58ms 62ms 86ms 84ms 4 22ms 15ms 11ms 11ms 414ms 325ms 64ms 62ms 87ms 85ms 5 16ms 15ms 11ms 11ms 327ms 325ms 37ms 62ms 86ms 84ms
  15. 所感 パフォーマンス検証 • Supabaseが速くてConnection Poolもやってくれてよい(再掲) • Hyperdriveも検討したい • Cloud SQLもよいがConnection

    Pooling問題を気にする必要がある • 1 request 1 connectionになるので同時接続数が気になる • c.executionCtx.waitUntil(client.end())を確実に呼んだり • 個⼈的にはNeonに期待してたけど⽇本regionが...... • CloudflareのHyperdrive発表記事でもNeonが最初に⾔及されていた > Hyperdrive works not only with PostgreSQL databases ̶ including Neon, Google Cloud SQL, AWS RDS......
  16. Hyperdriveに期待したい 今後の展望 • 接続をprivate network上に構築する課題が残っている • CloudflareのDiscordではroadmapとして、Hyperdriveがealy 2024に private networksの接続をサポートすると2023/09/28に⾔及されている

    > Support for databases in private networks (Magic WAN, Cloudflare Tunnels) in early 2024. • 引き続き検証進めつつproductionにのせていきたい • 最悪、Honoを使っているのでCloud Runにする⼿段も簡単なはず
  17. • JavaScript Containers • https://tinyclouds.org/javascript_containers • Hyperdrive試してみた🛸 • https://speakerdeck.com/aiji42/hyperdriveshi-sitemita •

    Workers & Pages Pricing • https://www.cloudflare.com/plans/developer-platform-pricing/ • AsyncLocalStorage | Node.js v21.6.2 Documentation • https://nodejs.org/api/async_context.html#class-asynclocalstorage • Neon Sample Data • https://github.com/neondatabase/postgres-sample- dbs/blob/f6c2e24910e9a1eb9c11c69628544d4d60d42e47/periodic_table.sql 参考⽂献
  18. • Hyperdrive: making databases feel like theyʼre global • https://blog.cloudflare.com/hyperdrive-making-regional-databases-

    feel-distributed • Hyperdriveのprivate network接続のサポートに関する⾔及 • https://discord.com/channels/595317990191398933/11505579862390 21106/1156944940086083704 参考⽂献