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