Open12

自社サービスのバックエンドを Go から TypeScript へ切り替えるための整理

voluntasvoluntas

切り替える理由

  • 自社の主力製品で利用している技術(WebRTC / WebTransport)がブラウザベースのため TypeScript を利用する
  • Go を採用したのは sqlc が使いたかったという理由
  • 自社サービスチーム全員が Go にまったく興味が無い
    • sqlc 自体は便利
    • そもそも自社に Go への興味がある人がいない
  • 自社サービスの規模ではボトルネックになるのはデータベースであって言語ではない
    • もしアプリでスケールが必要なときは Rust や Erlang/OTP に切り替えれば良い
  • コネクションプールは PgBouncer を利用すればいい
    • TypeScript からは 1 コネクション 1 接続で問題無い
  • どうせフロントエンドでは TypeScript を書く
    • 自社では React 一択
  • 当たり前だが VS Code の TypeScript サポートは素晴らしい
  • ChatGPT や GitHub Copilot は TypeScript に詳しい
  • すでに BFF を Cloudflare Workers + Remix で 2 年運用してきてあまり困っていない
  • Remix は良い
  • Biome, toolchain of the web は良い
  • fast-check は良い

懸念

sqlc を採用した感想

  • ORM を覚えたくない、SQL を覚えたいというモチベーションだったが、結果最高だった
  • PostgreSQL で利用する前提だった事もあり、困ることがかなり少なかった
  • 一番めんどくさかったのは pgx/v4 から pgx/v5 移行
  • 自分のような SQL 初心者にとって SQL をコンパイルしてチェックできる仕組みは素晴らしい
  • 共通語としての SQL は本当に最高
  • sqlc 以外を今後利用するつもりは無いくらいに最高だった
voluntasvoluntas

技術選定

ランタイム

  • Cloudflare Workers
    • 採用
    • 今まで運用してきてあまり困ってはいない
    • ただログ周りはかなり不便
    • wrangler のアップデートが頻繁で、バグに苦しめられることある
    • 圧倒的な安さ
  • Deno
    • 期待
    • Deno Deploy が良さそうに見える
    • ログ周りがどうなのかが気になる
    • 価格面で Cloudflare Workers にまけてる
    • Deno KV では sqlc が使えない
  • Node.js
    • 不採用
    • ローカル開発や CI はイイが運用は避けたい
    • Node.js を自前で運用することはない、あくまでローカル用という認識
  • Bun
    • 不採用
    • 未知数
    • 破壊的変更が多そう

Remix

PostgreSQL

ClickHouse

Meilisearch

sqlc-gen-typescript

S3 クライアント

Base32

Slack クライアント

UUID 生成

OIDC

JWT

テスト

voluntasvoluntas

デプロイ

  • コスト重視
    • 安くて安定してること
  • Go と Linode (Akamai Connected Cloud) の場合は最低でも $20/月かかる
    • NodeBalancers $10/月
      • Let's Encrypt を利用した証明書の更新が大変大変めんどくさそう
      • Cloudflare Proxy 経由でオリジン証明書を利用する方向なら許容範囲
    • Nanode 1 GB $5/月 x2
  • ClickHouse と PostgreSQL に繋げられるのが必須条件
    • Cloudflare Workers はコレを満たしている

Cloudflare Workers

  • 採用

  • 月 $5

  • 1000 万リクエスト/月

    • 100 万リクエスト/$0.30
  • 3000 万 CPU ミリ秒/月

    • 100 万 CPU ミリ秒/$0.02
  • 勝手にスケールしてくれるのは本当に便利

  • 価格面を考えると圧倒的に Cloudflare Workers

    • HTTP/3 も利用できる
    • FW も気軽に利用できる
    • ZeroTrust も利用できる
  • GitHub Actions を利用したデプロイも嬉しい

  • ClickHouse は HTTP ベースなので TCP Socket 経由で通信できるようにしてほしい

Deno Deploy

  • 期待
  • 月 $20

Fly.io

  • 不採用
  • 未調査
  • 価格が別に安くない

Linode (で自前運用)

  • 不採用
  • Go と同じ構成になり最低でも $20 / 月
  • スケールアウトがめんどくさいので、基本スケールアップになりそう
voluntasvoluntas

PostgreSQL

サービス

voluntasvoluntas

データベースを含めた構成

sqlc-gen-typescript

別にまとめてある。

Hyperdrive

$ pnpm exec wrangler hyperdrive create $NAME \
    --connection-string="postgres://{user}:{password}@{host}:{port}/{database_name};"
node_compat = true

[[hyperdrive]]
binding = "HYPERDRIVE"
id = "a76a99bc342644deb02c38d66082262a"
localConnectionString = "postgres://user:password@localhost:5432/{databasename}"
# hyperdrive 作成時に指定した connection string が利用される
$ pnpm exec wrangler --remote

# localConnectionString が利用される
$ pnpm exec wrangler dev

Remix + Cloudflare Workers + pg + sqlc-gen-typescript + Hyperdrive + PostgreSQL 検証

  • ローカルから Hyperdrive 経由で docker compose で上げた Postgres へ接続する
    • pnpm exec wrangler dev ./server.ts
    • ▲ [WARNING] Hyperdrive does not currently support 'wrangler dev' in local mode at this stage of the beta. Use the '--remote' flag to test a Hyperdrive configuration before deploying. と出るが普通にいける
  • ローカルから Hyperdrive 経由で neon のシンガポールに上げた Postgres へ接続する
    • pnpm exec wrangler dev --remote ./server.ts
  • デプロイして Hyperdrive 経由で neon のシンガポールに上げた Postgres へ接続する
voluntasvoluntas

Cloudflare Workers

voluntasvoluntas

Neon

  • 無料検証サービスのバックエンドには十分そう
  • Neon — Serverless, Fault-Tolerant, Branchable Postgres
  • PostgreSQL マネージドサービス
  • https://neon.tech/pricing
    • 価格がお安い
    • $ 19 は素晴らしい
    • もし商用サービスで使うなら $69 かな
  • 日本リージョンがなくて、シンガポールリージョン
    • Hyperdrive の強みがでそう
    • 日本リージョンきたらスゴイ使う人増えそう
  • 管理画面はとても使いやすい
  • 最大同時接続数 10,000
    • 無料プランでもそうらしくて、衝撃
  • ダッシュボードが充実していて参考になる
voluntasvoluntas

ClickHouse

検証

  • ローカルで docker compose で上げた ClickHouse にデータを追加
    • HTTP なのでちょっと癖がある、正直 TCP Socket 使えるようにしてほしい
  • デプロイで ClickHouse Cloud にデータを追加
voluntasvoluntas

外形監視