Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Hasura の Subscription と向き合う Art of Hasura's subscription: performance tuning Hasura User Group Tokyo Meetup 2022/09/29
Slide 2
Slide 2 text
きむじゅん @kimujun (Twitter: @1130_kimu) 🏢 dinii inc. Software Engineer Hasura User Since 2020 ❤ TypeScript, Node.js, Hasura
Slide 3
Slide 3 text
3 飲食店の All in One Platform “ダイニー”
Slide 4
Slide 4 text
4 toB SaaS じゃなくて、 “すべての消費者” が使う toC エンタメサービス
Slide 5
Slide 5 text
5 消費者をオンライン化し、オフラインに眠っていたデータを集め、 toB と toC の双方において活用することで 飲食の「文明」と「文化」をつくるプラットフォーム
Slide 6
Slide 6 text
Hasura を 2 年間以上本番運用を行っているダイニーが Subscription とどう向き合っているかお伝えします
Slide 7
Slide 7 text
Topics 1. Subscription ってなに? 2. ここがすごいよ (Hasura の) Subscription 3. Subscription の落とし穴
Slide 8
Slide 8 text
Subscription ってなに? What is Subscription ● GraphQL サーバーからリアルタイムにデータの更新情報を受け取る ● Websocket コネクションを介してやりとりするのが一般的 Hasura と Subscription ● Hasura はデフォルトで Subscription スキーマを作成 ✨ ○ Live Queries と Streaming の2種類が利用できる 👉デモ Hasura が生成するスキーマ (一部)
Slide 9
Slide 9 text
Subscription ってなに? Apollo Client と Subscription ● useQuery 同様に useSubscription hooks が利用できる😎 ○ WebSocket Link を追加して Subscription を実行 ● キャッシュを使いたい時は useQuery の subscribeToMore を利用する https://www.apollographql.com/docs/react/data/su bscriptions/
Slide 10
Slide 10 text
ここがすごいよ (Hasura の) Subscription ● クエリ結果に変更があった時だけデータをやりとりする 🥇 ● 似たクエリをまとめて一つの最適な SQL として実行 🥇 ● ユースケースに合わせて2種類の Subscription を選択できる🥇 Subscription multiplexing of Hasura (https://hasura.io/docs/latest/subscriptions/postgres/livequer y/execution-and-performance/)
Slide 11
Slide 11 text
Subscription の落とし穴 ダイニーが出会った Subscription の落とし穴 2 選 ● パフォーマンスチューニング ● Subscription 停止への対策
Slide 12
Slide 12 text
Subscription の落とし穴: パフォーマンスチューニング パフォーマンスチューニング ● Subscription のコスト >>>>> Query のコスト ● 1s に一度実行される SQL が重いと DB に大きな負荷がかかる😢 クエリ実行時のコスト 同じクエリを Subscription した時のコスト
Slide 13
Slide 13 text
Subscription の落とし穴: パフォーマンスチューニング チューニング方針 1. クエリを小さく実行する ● ジョインを避けて集約レベルで実行する ○ Query ならページ単位で必要なデータを全てジョインすれば OK ○ Subscription の場合は細かく実行することで負荷を下げたい!
Slide 14
Slide 14 text
Subscription の落とし穴: パフォーマンスチューニング チューニング方針 2. DB レベルで負荷を下げる努力をする ● 日々クエリのパフォーマンスを監視して DB レベルの改善に向き合う 💪 ● Subscription を実行するための Read Replica を用意するのも有効
Slide 15
Slide 15 text
Subscription の落とし穴: Subscription 停止 Subscription 停止への対策 ● 様々な要因で Subscription が停止する場合がある 😢 ○ インターネット不調による Websocket コネクション切断等 ● 「データの反映が遅れる」「最新のデータに更新されない」という報告となる ○ リアルタイム性が求められるシステムなので深刻な問題...
Slide 16
Slide 16 text
Subscription の落とし穴: Subscription 停止 Subscription 停止への対策 ● 対策方針 ○ Subscription が停止している間は polling に切り替える ○ Websocket コネクションを貼り直し続けて復帰を待つ ● 実装方針 ○ Subscription の生死状態をグローバルで持つ ○ Websocket の pong が来ていなければ停止状態とする ○ 停止状態中は 10s に一度 Websocket クライアントを作り直す ○ pong が来ているのを確認したら稼働状態に戻す👍
Slide 17
Slide 17 text
No content
Slide 18
Slide 18 text
まとめ ● Hasura の Subscription はとても便利 ● だけど本番運用する上では注意が必要! ○ 日々クエリのパフォーマンスを監視する ○ Subscription が止まってしまった場合を想定しておくのが吉 (余談) ● Subscription を本番想定で負荷試験する手段がないです ... ○ いい方法があれば誰か教えてください 😂
Slide 19
Slide 19 text
No content