$30 off During Our Annual Pro Sale. View Details »

Hasura の Subscription と向き合う

kimujun
September 29, 2022

Hasura の Subscription と向き合う

Hasura User Group Tokyo Meetup で登壇した際の発表資料です。
https://www.meetup.com/hasura-user-group-tokyo/events/287738311/

kimujun

September 29, 2022
Tweet

More Decks by kimujun

Other Decks in Technology

Transcript

  1. Hasura の Subscription と向き合う Art of Hasura's subscription: performance tuning

    Hasura User Group Tokyo Meetup 2022/09/29
  2. きむじゅん @kimujun (Twitter: @1130_kimu) 🏢 dinii inc. Software Engineer  

    Hasura User Since 2020 ❤ TypeScript, Node.js, Hasura
  3. 3 飲食店の All in One Platform “ダイニー”

  4. 4 toB SaaS じゃなくて、 “すべての消費者” が使う toC エンタメサービス

  5. 5 消費者をオンライン化し、オフラインに眠っていたデータを集め、 toB と toC の双方において活用することで 飲食の「文明」と「文化」をつくるプラットフォーム

  6. Hasura を 2 年間以上本番運用を行っているダイニーが Subscription とどう向き合っているかお伝えします

  7. Topics 1. Subscription ってなに? 2. ここがすごいよ (Hasura の) Subscription 3.

    Subscription の落とし穴
  8. Subscription ってなに? What is Subscription • GraphQL サーバーからリアルタイムにデータの更新情報を受け取る • Websocket

    コネクションを介してやりとりするのが一般的 Hasura と Subscription • Hasura はデフォルトで Subscription スキーマを作成 ✨ ◦ Live Queries と Streaming の2種類が利用できる 👉デモ Hasura が生成するスキーマ (一部)
  9. Subscription ってなに? Apollo Client と Subscription • useQuery 同様に useSubscription

    hooks が利用できる😎 ◦ WebSocket Link を追加して Subscription を実行 • キャッシュを使いたい時は useQuery の subscribeToMore を利用する https://www.apollographql.com/docs/react/data/su bscriptions/
  10. ここがすごいよ (Hasura の) Subscription • クエリ結果に変更があった時だけデータをやりとりする 🥇 • 似たクエリをまとめて一つの最適な SQL

    として実行 🥇 • ユースケースに合わせて2種類の Subscription を選択できる🥇 Subscription multiplexing of Hasura (https://hasura.io/docs/latest/subscriptions/postgres/livequer y/execution-and-performance/)
  11. Subscription の落とし穴 ダイニーが出会った Subscription の落とし穴 2 選 • パフォーマンスチューニング •

    Subscription 停止への対策
  12. Subscription の落とし穴: パフォーマンスチューニング パフォーマンスチューニング • Subscription のコスト >>>>> Query のコスト

    • 1s に一度実行される SQL が重いと DB に大きな負荷がかかる😢 クエリ実行時のコスト 同じクエリを Subscription した時のコスト
  13. Subscription の落とし穴: パフォーマンスチューニング チューニング方針 1. クエリを小さく実行する • ジョインを避けて集約レベルで実行する ◦ Query

    ならページ単位で必要なデータを全てジョインすれば OK ◦ Subscription の場合は細かく実行することで負荷を下げたい!
  14. Subscription の落とし穴: パフォーマンスチューニング チューニング方針 2. DB レベルで負荷を下げる努力をする • 日々クエリのパフォーマンスを監視して DB

    レベルの改善に向き合う 💪 • Subscription を実行するための Read Replica を用意するのも有効
  15. Subscription の落とし穴: Subscription 停止 Subscription 停止への対策 • 様々な要因で Subscription が停止する場合がある

    😢 ◦ インターネット不調による Websocket コネクション切断等 • 「データの反映が遅れる」「最新のデータに更新されない」という報告となる ◦ リアルタイム性が求められるシステムなので深刻な問題...
  16. Subscription の落とし穴: Subscription 停止 Subscription 停止への対策 • 対策方針 ◦ Subscription

    が停止している間は polling に切り替える ◦ Websocket コネクションを貼り直し続けて復帰を待つ • 実装方針 ◦ Subscription の生死状態をグローバルで持つ ◦ Websocket の pong が来ていなければ停止状態とする ◦ 停止状態中は 10s に一度 Websocket クライアントを作り直す ◦ pong が来ているのを確認したら稼働状態に戻す👍
  17. None
  18. まとめ • Hasura の Subscription はとても便利 • だけど本番運用する上では注意が必要! ◦ 日々クエリのパフォーマンスを監視する

    ◦ Subscription が止まってしまった場合を想定しておくのが吉 (余談) • Subscription を本番想定で負荷試験する手段がないです ... ◦ いい方法があれば誰か教えてください 😂
  19. None