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

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. きむじゅん @kimujun (Twitter: @1130_kimu) 🏢 dinii inc. Software Engineer  

    Hasura User Since 2020 ❤ TypeScript, Node.js, Hasura
  2. Subscription ってなに? What is Subscription • GraphQL サーバーからリアルタイムにデータの更新情報を受け取る • Websocket

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

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

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

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

    ならページ単位で必要なデータを全てジョインすれば OK ◦ Subscription の場合は細かく実行することで負荷を下げたい!
  7. Subscription の落とし穴: Subscription 停止 Subscription 停止への対策 • 様々な要因で Subscription が停止する場合がある

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

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

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