Closed SanMurakami closed 1 year ago
キャッシュを消さないと追加した絵文字が反映されないのはめちゃめちゃ使いにくい
絵文字のキャッシュも部分的に消しているわけではなく全部消していて、毎回すべての絵文字を取得しているため通信量も無駄に多い。
以前はページ読み込み毎に全カスタム絵文字取得してたからそれに比べたらそれでも10分の1以下にはなってると思う
以前はページ読み込み毎に全カスタム絵文字取得してたからそれに比べたらそれでも10分の1以下にはなってると思う
ブラウザキャッシュを使っているはずなのでそれはないと思われる
ブラウザキャッシュ使ってたら
キャッシュを消さないと追加した絵文字が反映されない
が起こる気がした
v12まではそもそも実装が違ったので起こらなかった
のため全てv12の仕様に戻すというのはしない
メンテナンス性はともかくパフォーマンスは確実に落ちていることを体感している
やるならメディアプロキシなどの外部サーバーとして使える様にするべき(DDoSを受けても本体が影響を受けないため)だし、Misskey本体でこの処理をするのは問題でしかない
投稿などについては戻すらしい
ローカルのmetaとemojisを分離して取得するようににゃった仕様は変更にゃし ノートとかにくっついてくるリモート絵文字情報はemojisとして復活する予定 https://misskey.io/notes/9af6xzf708
v12でも外部カスタム絵文字は毎回プロキシ通してたからDDoSされる可能性はあった模様
それを言ったらプロキシの存在自体がDDoSなんでは
(DDoSの問題は/emoji.webpの話では)
それを言ったらプロキシの存在自体がDDoSなんでは
そういうことっぽい 例えばユーザーアイコン用エンドポイントもカスタム絵文字用プロキシも処理的には同じものだけど、
ということと理解している
v12でも外部カスタム絵文字は毎回プロキシ通してたからDDoSされる可能性はあった模様
v12は直リンクだったのでキャッシュが使えたのとリダイレクトじゃないのでレートリミットが使えた
それを言ったらプロキシの存在自体がDDoSなんでは
そう。 なので個人的にはMisskey公式でMediaProxyを作ってもらって別鯖で建てれるようにしてほしい
(DDoSの問題は/emoji.webpの話では)
そう
プロキシしてもリダイレクトじゃなくて直接画像返せば問題ない(というよりはv12と負荷的には同等になる)のであれば、やっぱりノートとかにemojisくっつける必要ないかも?
プロキシしてもリダイレクトじゃなくて直接画像返せば問題ない(というよりはv12と負荷的には同等になる)のであれば、やっぱりノートとかにemojisくっつける必要ないかも?
emoji.webpをFileServerServiceに移すといった感じかしら
そうね
でも
なので個人的にはMisskey公式でMediaProxyを作ってもらって別鯖で建てれるようにしてほしい
が微妙になるかも
プロキシ用サーバーが別に存在する場合はmetaとかでそのホストを返してクライアントがそれを見てリクエスト先変えれば良いと思った
ノートとかにemojisくっつける必要ないかも?
これMilkteaの実装めっちゃ大変だったと聞いているのでサードパーティクライアントが育たなくなりそう
今までのクライアントが移行するのは大変かもしれないけど、新たに出るクライアントが実装する場合はむしろ簡単になってるはず
画像のURLを投稿に返さず、リダイレクトもしないでどうやって拾ってくるの
プロキシ用サーバーが別に存在する場合はmetaとかでそのホストを返してクライアントがそれを見てリクエスト先変えれば
emojisのURL情報がない場合(v13初期の場合)のプロキシ用サーバーへのリクエストって可能?(ただしMisskey本体へのリクエストをせずに)
今までのクライアントが移行するのは大変かもしれないけど、新たに出るクライアントが実装する場合はむしろ簡単になってるはず
簡単かなぁ…
Misskey Webもクライアントだけど実際emojisが無いことでかなり実装が簡潔になる
画像のURLを投稿に返さず、リダイレクトもしないでどうやって拾ってくるの
プロキシに絵文字名を投げると絵文字画像が返ってくる
それプロキシ前提ってことでしょ プロキシ使わないサーバーはどうやって処理すればいいの
プロキシに絵文字名を投げると絵文字画像が返ってくる
HTMLのimgは301リダイレクトはブラウザが勝手にやってくれるけど、他の環境ではどうなんだかという
プロキシは組み込まれてるからプロキシ使わないという選択肢はないと思う アバターもそうだけど各インスタンスのアイコンとかもプロキシ通してる
プロキシ使わないサーバー
それはMisskey互換と言えない気がする
プロキシに絵文字名を投げると絵文字画像が返ってくる
HTMLのimgは301リダイレクトはブラウザが勝手にやってくれるけど、他の環境ではどうなんだかという
画像直接返すのを想定してる
リモートのカスタム絵文字のパフォーマンスについては、CDNでキャッシュするか、それができない場合はリモートのものも直URLリクエストするようにする
それができない場合はリモートのものも直URLリクエストするようにする
これはやめるってこと?
(「プロキシから絵文字画像が返ってくる」は処理的にはまさにv12がやっていたこと)
(「プロキシから絵文字画像が返ってくる」は処理的にはまさにv12がやっていたこと)
やってないと思う 直でproxyからURLにアクセスしてる
リモートのカスタム絵文字のパフォーマンスについては、CDNでキャッシュするか、それができない場合はリモートのものも直URLリクエストするようにする
それができない場合はリモートのものも直URLリクエストするようにする
これはやめるってこと?
プロキシ通しても画像を直接返せば負荷的にv12と変わらないということが分かったからやめるかも
(「プロキシから絵文字画像が返ってくる」は処理的にはまさにv12がやっていたこと)
やってないと思う 直でproxyからURLにアクセスしてる
直で「proxyからURLにアクセスしてる」ということは「プロキシから絵文字画像が返ってくる」と同じ
プロキシ通しても画像を直接返せば負荷的にv12と変わらないということが分かったからやめるかも
それならそれでもいいけど、それやるならMediaProxy公式で作ってほしい もちろんユーザーアバター、絵文字、リモートファイルに対応したものを
直で「proxyからURLにアクセスしてる」ということは「プロキシから絵文字画像が返ってくる」と同じ
コメントした後に編集が入ってたのに気付いた
↓最初のこれに対して言っていた
(「プロキシに絵文字名を投げると絵文字画像が返ってくる」は処理的にはまさにv12がやっていたこと)
v12と本質的には一緒だからこの変更をすることによってMediaProxyの必要性が増すわけではないと思うけど、MediaProxyやりたいはやりたい
MediaProxy公式で作ってほしい
これをやるとしたら(やったほうがいいと思うけど)、/emoji.webpとしてデータベースと密結合してぶら下げた状態ではMediaProxyに切り分けることができない
脱線するけどONLY_SERVER / ONLY_QUEUE みたいに ONLY_PROXY オプション作れば解決かしら
MediaProxy公式で作ってほしい
これをやるとしたら(やったほうがいいと思うけど)、/emoji.webpとしてデータベースと密結合してぶら下げた状態ではMediaProxyに切り分けることができない
まあこれはアバターとかも言えるね
MediaProxyってデータベースに関与できない縛りあるのかな
/emoji.webpとしてデータベースと密結合してぶら下げた状態ではMediaProxyに切り分けることができない
外部プロキシに投げると言う形であればDDoSされてもそこが落ちるだけでサービスの根幹には影響しないので /emoji/emoji@remote-instance.example
や /avatar/user@remote-instance.example
みたいな形式で投げても良さそう
MediaProxyってデータベースに関与できない縛りあるのかな
ん〜〜、なんとなく個人的にデータベースと切り離したいんだよね
MediaProxyがDBと繋がってるとDDoSされた時にDBが死にそう
DDoSされた時にDBが死にそう
リードレプリカで良くね(リードレプリカが死ぬんだけど)
DDoSされたらDBが死ぬというのは全てのエンドポイントにおいて言えることだった
脱線するけどONLY_SERVER / ONLY_QUEUE みたいに ONLY_PROXY オプション作れば解決かしら
MediaProxyとしてドメインを分けた時の挙動がどうなるのという感じがしており
/emoji.webpとしてデータベースと密結合してぶら下げた状態ではMediaProxyに切り分けることができない https://github.com/misskey-dev/misskey/issues/9721#issuecomment-1404823398
訂正: できんことはないが私が個人的に実装するならデータベースと接続させない
MediaProxyとしてドメインを分けた時の挙動
というかもしドメインを分けずに動かす場合、ディレクトリごとにnginxとかでサーバー宛先を仕分け……るなら別にONLY_PROXYオプションというか、そもそも別個のMediaProxyなんて必要ないんだな
というかもしドメインを分けずに動かす場合、ディレクトリごとにnginxとかでサーバー宛先を仕分け……るなら別に
DDoSされたらNginx落ちるけど
これはあくまで提案なんだけど、こう言う形式にできないの?
[絵文字の場合]
外部プロキシを使わない場合: https://misskey.io/emoji/emoji@remote-instance.example
外部プロキシを使う場合: https://proxy.misskey.io/emoji/emoji@remote-instance.example
[ユーザーアバターの場合]
外部プロキシを使わない場合: https://misskey.io/emoji/emoji@remote-instance.example
外部プロキシを使う場合: https://proxy.misskey.io/emoji/emoji@remote-instance.example
[リモートファイルの場合]
外部プロキシを使わない場合: https://example.com/example.png
外部プロキシを使う場合: https://proxy.misskey.io/file?url=https%3A%2F%2Fexample.com%2Fexample.png
もちろん全て直接ファイルを返す前提で
v13になってから絵文字の仕様が変わったが、はっきり言ってキャッシュを消さないと追加した絵文字が反映されないのはめちゃめちゃ使いにくいし、外部絵文字を謎プロキシで圧縮する様になってからサーバーのCPU使用率も無駄に増えた。
かと言ってクライアントが軽くなっているかというとそうでもなく、301リダイレクトが多発しているためむしろ体感レスポンスは悪く、絵文字の様な元々小さい画像はWebPに圧縮しているサイズよりもHTTPヘッダーのサイズが上回っている物も多数あるため通信容量も増えている。
絵文字のキャッシュも部分的に消しているわけではなく全部消していて、毎回すべての絵文字を取得しているため通信量も無駄に多い。
また以前指摘したとおりDDoSに使われる可能性が十分あり、ユーザーアイコンと違ってかなり頻繁に呼ばれる絵文字の場合レートリミットをある程度緩める必要があり、キャッシュなどを行っても根本的な対策を取ることができない。