Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

リアルタイム更新時のノートのデータをCDNにキャッシュできるようにするオプション #15187

Open
1 task done
kakkokari-gtyih opened this issue Dec 28, 2024 · 19 comments · May be fixed by #15188
Labels
✨Feature This adds/improves/enhances a feature

Comments

@kakkokari-gtyih
Copy link
Contributor

kakkokari-gtyih commented Dec 28, 2024

Summary

特定のフラグ付きでWebSocket Channelに接続すると

  • WebSocket経由では、公開ノート(公開範囲がpublic/homeかつログイン制限などがないもの)についてはノートの部分的なデータ(リアクション・pollなどのリアルタイム性のあるデータとnoteId)しか流れてこないように
  • WebSocketでノートが来たらノートのデータをAPIからGETで取得して(←ここでCDNやブラウザキャッシュが効く)、WSのデータと突合する

というような仕様になるモードを用意する

Purpose

いままでWebsocketにてリアルタイムにノートのすべての情報を対象のユーザーすべてにブロードキャストしていた。つまり「ノートの投稿数 * ノートの情報量 * WSで購読しているユーザー数」分の通信量と処理負荷がサーバーにかかっていることになる。

これをIDのみ渡し実体の取得をCDNのキャッシュに委譲することでWebsocketでの通信量およびサーバー負荷を削減する。

TLでリアルタイムに取得する投稿は大部分がパブリックの投稿であるため、それなりの通信、処理負荷の削減が見込まれると考えられる。(サーバーの処理は「ノートの投稿数 * ID情報 * WSで購読しているユーザー数 + CDNにキャッシュされる前の最初の1回のリクエストへの応答)」になる)

ノートの実体についてはCDNでキャッシュすることで本体サーバーの処理をノートごとに1回にする。CDNにキャッシュされたあとは、当然ながらCDNのキャッシュから返却されるようになるため本体サーバーの(通信/処理)負荷にはならない。

上記の問題点として、限定公開投稿の権限管理をサーバー側でしているため限定公開投稿はCDNでキャッシュできないことである。
そちらの対策として、限定公開投稿はWebsocketで受け渡す方式とする(既存実装と同等)。
またCache-Controlを制御することで意図せずCDN側でキャッシュされることを防ぐ対策を行う。

MisskeyIO#834

Additional Info

  • CloudflareのCache Rulesを前提にするなら、キャッシュさせるノートデータを取得する専用のエンドポイントを持たせたほうがCache Rulesの設定がしやすそう(それこそioの実装どおりhttps://host/notes/xxxyyyzzz.jsonとか)
  • キャッシュさせたくないノートはその全体をWSで流すのではなく、単純に{ id: 'xxxyyyzzz', vary: true }とかをWSで送ったうえでepをnotes/showのPOSTに切り替えるほうが単純かも

Do you want to implement this feature yourself?

  • Yes, I will implement this by myself and send a pull request
@kakkokari-gtyih kakkokari-gtyih added the ✨Feature This adds/improves/enhances a feature label Dec 28, 2024
@kakkokari-gtyih kakkokari-gtyih changed the title ノートのデータをCDNにキャッシュできるようにするオプション リアルタイム更新時のノートのデータをCDNにキャッシュできるようにするオプション Dec 28, 2024
@syuilo
Copy link
Member

syuilo commented Dec 28, 2024

  • キャッシュできる情報は限られる
  • クライアントの視点に立つとノートごとに追加のHTTPリクエストが発生する

からパフォーマンス的な恩恵は大きくはない気はするわね
とにかくサーバー側の通信量さえ減らせれば良いというユースケースでは効果はありそう

@kakkokari-gtyih
Copy link
Contributor Author

kakkokari-gtyih commented Dec 28, 2024

それはそうなのでオプションで有効にできる形(オプトイン)で実装すると良いんじゃないかなと思ったりしている
(こういうのって、大規模サーバーでは恩恵が大きいが中小規模ならそうでもない系の機能なので)

@syuilo
Copy link
Member

syuilo commented Dec 28, 2024

「負荷やクライアントの通信量が増えても良いからサーバーの通信量を削減したいケース」がどれくらいあるかによるわね

@kakkokari-gtyih
Copy link
Contributor Author

負荷

どこで負荷が増えそう?

@syuilo
Copy link
Member

syuilo commented Dec 28, 2024

HTTPリクエストを送ったり送られてきたりする負荷かしら

@kakkokari-gtyih
Copy link
Contributor Author

kakkokari-gtyih commented Dec 28, 2024

  • クライアントが送る方についてはそれはそう(「負荷やクライアントの通信量が増えても良いからサーバーの通信量を削減したいケース」)
    • ただしクライアントからのHTTPリクエストについてもブラウザキャッシュが効くので実際はたいしたことないかも
  • サーバーからのレスポンスについては、CDN等にキャッシュさせることが前提の機能なのでキャッシュされないはじめの数回だけで済みそう(CDN等を用意していないサーバーはこの機能を使わなければいいだけ)

@syuilo
Copy link
Member

syuilo commented Dec 28, 2024

そのような負荷が増えることよりも通信量が減るメリットを優先したいサーバーがどれくらいあるのかという話だわね

@kakkokari-gtyih
Copy link
Contributor Author

需要調査がむずかしいわね
(サーバー負荷の軽減にはなりそうだけどクライアント側の負担が大きくなる…)

とはいえ今のところioのクライアントがこの変更の影響で極端に重くなったかと言われればそんなことはない気がする(体感)

@syuilo
Copy link
Member

syuilo commented Dec 28, 2024

投稿がされるごとに最初の数回リクエストが飛んでくるだけでも投稿数が多いと無視できない負荷になる

@kakkokari-gtyih
Copy link
Contributor Author

Cloudflareの場合はいい感じにキャッシュが当たるように遅延が入るようになっているらしい

MisskeyIO#834 (comment)
MisskeyIO#834 (comment)
https://developers.cloudflare.com/cache/concepts/revalidation/#example-2

@syuilo
Copy link
Member

syuilo commented Dec 28, 2024

サーバーの負荷軽減になるかどうかはよくわからないわね

@syuilo
Copy link
Member

syuilo commented Dec 28, 2024

(「負荷」はCPUやメモリ使用率のことを指してる)

@kakkokari-gtyih
Copy link
Contributor Author

サーバーの負荷軽減になるかどうかはよくわからないわね

後日ioに効果があったかどうか聞いてみるとか

@syuilo
Copy link
Member

syuilo commented Dec 28, 2024

あとクライアントは重さもそうだけど通信量増加のインパクトがどれくらいあるかも気になる

@syuilo
Copy link
Member

syuilo commented Dec 28, 2024

結構ギガを気にする人が多い印象

@kakkokari-gtyih
Copy link
Contributor Author

kakkokari-gtyih commented Dec 28, 2024

通信量増加のインパクト

もともとWSで来ていたデータが(リアルタイム性のある部分が一部重複が発生するとはいえ)HTTP経由になるだけなのでいきなり2倍になるとかは無いとは思う
それか、「一部重複が発生する」部分をWSで取る前提でCDN用データから抜いておくか(抜けが発生しそうで怖いのでそこまでしなくても)

@syuilo
Copy link
Member

syuilo commented Dec 28, 2024

HTTPはペイロード以外にもデータが結構ある印象

@syuilo
Copy link
Member

syuilo commented Dec 28, 2024

重複を考えたら最悪2倍くらいになってもおかしくはないと思う

@kakkokari-gtyih
Copy link
Contributor Author

サーバーの負荷軽減になるかどうかはよくわからないわね

後日ioに効果があったかどうか聞いてみるとか

これできるなら参考になりそう

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨Feature This adds/improves/enhances a feature
Projects
2 participants