LINE Blockchainを使ったwebアプリの構成検討
想定
規模
100k user /per day
せいぜい100user / sec
認証
LINE Loginのみ
認証済みユーザーがアクセスできるページと認証してなくても見られるページがある
その他要件や要望
LINE Blockchainを利用する。transactionのconfirmationを受け取るためにcallbackをハンドリングする必要がある。
LINE BlockchainのAPIへサーバーサイドからリクエストを送るエンドポイント、DBへ接続するエンドポイント、その両方が混在するなどのパターンがありえそう。
websocketでserver pushするほどのリアルタイム性は不要だが必要ないがフロント側ではtransactionの更新をなるべくすぐ受け取りたいので最低でもpoolingは必須かも。
もしかするとゲーム的な要素が入ってきたらユーザー同士のマッチングを実装しないといけなくなるとか出てくるとだるそ〜。
DBへのwriteが大量に発生したりは無さそう
画像のアップロードもそんなに無さそう
決済はstripeとか使えば良いか
フロントエンドはほぼモバイルのUIでSPAっぽい動きが望まれてそう
開発者がめっちゃ少ないので出来るだけ楽したい
出来るだけ安くしたい
技術選定
フロントエンドアプリ(fr)・バックエンドアプリ(bk)・インフラ(ir)の組み合わせ。
A) fr + Vercel + Firebase/Supabaseみたいなサーバレス
Next.jsをfr&bkとして運用する
B) fr + bk + AWS/GCP
Next.jsをfr、bkにRailsやNestJS、AWS/GCPでRDB,Session Storage, VPC, LB
C) フルスタックfr/bk + + AWS/GCP
Rails on AWS/GCPみたいな感じ
A
一番楽できる。インフラをBaaSに任せられるので。
LINE Loginがネックになる。Firebase/Supabase共にAuthenticationでデフォルトのProviderが利用できないので。カスタム認証もしくはEmail用のユーザーを無理くり作ってLINEのuidを紐付けるゴリ押し運用が必要になる。
またAuthenticationのユーザー数制限もやや気になる。FirebaseはSMS認証を使わなければ気にしなくても良いがSupabaseはPro契約で100,000までなので。それ以上はContactへ連絡が必要になる。
価格的には一番安く済みそう。ユーザーが急増した場合のパフォーマンスは気になる。
pollingが発生するならFirebaseはread/write課金がネックになるかも。
B
インフラが馴染みのクラウドサービスを組み合わせるだけなので勝手はよくわかる。Authentication周りも自前のDBやsession storeで管理なので制限なし。一方でAよりインフラの構築やCI/CD環境の作成、その他リリース後の管理はだるいし運用が必要になる。あとAと同じレベルのパフォーマンスや冗長性にすると値段が結構かかる。RDS/CloudSQLは高い。
C
昔ながらの作り方でわかりやすいしシンプル。インフラ周りはBと同じ。SPAの構築が肝。Rails7でHotwireで頑張れるのか???というのと頑張りたいか???あたりがネック。
Auth周りをなんとかできるならAが良い。B,Cはインフラの構築の点ではそんなに変わらん。Bだとfr,bkどちらも作る必要があり、CだとフルスタックにできるがHotwire頑張れますか?というのがある。
Aの認証をSupabaseで出来るか
検証した結果なんとかギリギリできそう。最終的にどうやったか↓
LINE Login -> 認証・認可 -> UIDとEmailアドレスを取得 -> これら情報とsecret seed値を元に内部用のSupabaseユーザを作成 -> refresh_tokenを取得する -> 短い時間の期限付きcookieに載せる -> getServerSidePropsでcookieからrefresh_tokenを取得 -> フロントエンドのuseEffect内でsupabase.auth.setSession(refresh_token)をしてsupabase.authを初期化する->初期化されると期限付きでブラウザに永続化されるので次回ページランディング時はsupabase.auth.user()でユーザーが取得できる