misskey icon indicating copy to clipboard operation
misskey copied to clipboard

TLをPush型にする

Open syuilo opened this issue 2 years ago • 59 comments

Summary

DBへのリクエストを1でも減らしたい

syuilo avatar Dec 14 '22 05:12 syuilo

Redisはなかなかハードル高いからまずはnodeにキャッシュする? ただ複数サーバーで運営しているインスタンスだと効果が少なくなる

syuilo avatar Dec 31 '22 07:12 syuilo

まずはnodeにキャッシュする?

再起動したらすぐにパーになる

tamaina avatar Jan 26 '23 11:01 tamaina

RedisにTLをキャッシュ(というより構築)するデメリットとしては、TLを取得する際の負荷は劇的に減るけど代わりに投稿する際の負荷が今と比べてかなり高くなる

TwitterもMastodonもそういうTLの実装してるらしい(Push型というらしい)からそのデメリットよりメリットの方が上回るんだろうけど

syuilo avatar Jan 26 '23 11:01 syuilo

アンテナもPush型…だがちょっと負荷高いか

tamaina avatar Jan 26 '23 11:01 tamaina

あと単にデータベースにクエリ投げるだけじゃなくなるから実装も結構複雑になる

syuilo avatar Jan 26 '23 11:01 syuilo

負荷的にはユーザー全員がタイムラインというアンテナを持つようなものだと思っている

syuilo avatar Jan 26 '23 11:01 syuilo

TwitterやMastodonと違って、Misskeyはそれぞれのノートがリアクション情報を持っているからRedisにあるそれらも適宜更新する必要があるからちょっと他のソフトウェアとは事情が違うかも

syuilo avatar Jan 26 '23 11:01 syuilo

FYI: Mastodonでの実装 https://github.com/mastodon/mastodon/blob/fdd1facba16db75e425c02807323eb2666688652/app/lib/feed_manager.rb

ikuradon avatar Jan 26 '23 11:01 ikuradon

TwitterやMastodonと違って、Misskeyはそれぞれのノートがリアクション情報を持っているからRedisにあるそれらも適宜更新する必要があるからちょっと他のソフトウェアとは事情が違うかも

IDだけ置いとけばいいか

syuilo avatar Jan 27 '23 22:01 syuilo

なんならidでソートも可能

tamaina avatar Jan 28 '23 03:01 tamaina

負荷的にはユーザー全員がタイムラインというアンテナを持つようなものだと思っている

データベースにレコードを挿入するのとRedisに値を追加するのだったら後者の方が圧倒的に負荷は低いだろうからそこまで重くはないと思われる

ただローカルのフォロワーが100人いたら100回Redisにリクエスト投げなきゃいけないのかが気になる 1回のリクエストにまとめられるかな

syuilo avatar Feb 01 '23 05:02 syuilo

別の案

  1. ユーザーごとの自身のノート一覧もRedisにためておく
  2. フォローしている各ユーザーのノート一覧を結合してソートしてタイムラインとする
    Push型のTLにはしない
  3. フォロー数が多いと結合ソートが大変かもしれないので、Push型TLを採用する?

(リストでも同様のことを行えそう)

tamaina avatar Feb 05 '23 15:02 tamaina

ただローカルのフォロワーが100人いたら100回Redisにリクエスト投げなきゃいけないのかが気になる 1回のリクエストにまとめられるかな

まとめられないっぽい

syuilo avatar Feb 07 '23 08:02 syuilo

memo image

syuilo avatar Feb 07 '23 11:02 syuilo

添付ファイルありのみのTLもキャッシュしたさがある

tamaina avatar Feb 09 '23 11:02 tamaina

Renoteを積極的に表示しないようにするとなると意外とRenote周りの扱いがきわどいか、というかもういっそのことPostgreSQLにRenote保持しなくてよくねとすら思い始めてきた

tamaina avatar Feb 11 '23 15:02 tamaina

RenoteをPostgresql上に保持しなかった場合通知周りの構造はどうなる感じでしょうか? 仮にPostgresql上に保持させないようにする場合 通知にRenoteのNoteを参照させるのではなく、Renote先のNoteを参照させるようになる感じでしょうか?

pantasystem avatar Feb 11 '23 15:02 pantasystem

MongoDB をキャッシュ用に使うのってどうだろう

acid-chicken avatar Feb 18 '23 09:02 acid-chicken

二種類DB扱うのアレだからPostgreSQLをキャッシュには使えないかな

syuilo avatar Feb 18 '23 09:02 syuilo

ポスグレへのアクセスを減らしたいのならポスグレでキャッシュ作るのが目的を満たしてるのかよくわからない

acid-chicken avatar Feb 18 '23 09:02 acid-chicken

別のポスグレにするとか

syuilo avatar Feb 18 '23 09:02 syuilo

確かに理論上可能だけどキャッシュみたいな捨てる前提のデータベースにマイグレーションとか too much すぎないかとか逆に運用の観点から二つ存在するのがややこしくならないかとかは気になる

acid-chicken avatar Feb 18 '23 09:02 acid-chicken

キャッシュとはいうものの、捨てる前提でRedisにタイムラインを蓄積していたらそれはそれで厄介な実装になりそう

tamaina avatar Feb 18 '23 09:02 tamaina

キャッシュというか「構築」の方が近いかも

syuilo avatar Feb 18 '23 09:02 syuilo

なのでRedisを永続化する必要があり、運用の観点的には面倒だと思う

tamaina avatar Feb 18 '23 09:02 tamaina

例えば MongoDB の Capped Collection (規定サイズを超えたら勝手にデータを捨てる) とかを想像している

acid-chicken avatar Feb 18 '23 09:02 acid-chicken

あー永続化するのか

acid-chicken avatar Feb 18 '23 09:02 acid-chicken

ポスグレへのアクセスを減らしたいのならポスグレでキャッシュ作るのが目的を満たしてるのかよくわからない

というよりかは複雑なタイムラインクエリが(恐らく)悪いので、ホームタイムラインの投稿IDだけを入れたテーブルを作って全投稿JOINしてもそっちのほうが早い気はする

rinsuki avatar Feb 18 '23 10:02 rinsuki

なのでRedisを永続化する必要があり、運用の観点的には面倒だと思う

  1. そもそもジョブキューあるんだからRedisはもともと永続化されてないと困る
  2. ホームタイムラインもどうせ新規投稿来たら構築し直されるので飛んでも最悪なんとかなる

rinsuki avatar Feb 18 '23 10:02 rinsuki

MongoDB での構想だけど timeline と note の 2 collection を作って insertMany で timeline (userId, type, notes をもつオブジェクト) の notes (noteId と userId をもつオブジェクト) に $addToSet していくとかを現在イメージしている

acid-chicken avatar Feb 18 '23 10:02 acid-chicken