misskey-dev / misskey

🌎 An interplanetary microblogging platform 🚀
https://misskey-hub.net/
GNU Affero General Public License v3.0
9.64k stars 1.28k forks source link

No WebSocketモード #12227

Open syuilo opened 8 months ago

syuilo commented 8 months ago

Summary

WebSocketを一切使わずにクライアントを利用するモード 場合によってはサーバーの負荷軽減になるかも

slofp commented 7 months ago

Twitter(X)みたいに「n件の新しいツイート」の件数だけを返すのと、新しい通知があればtrue返すみたいなapiがあれば出来そうだと思った(現状がここらへんをwebsocketを使用してるため)

samunohito commented 7 months ago

@syuilo この件、差し支えなければ自分がやろうと思うのですが… 実装イメージ的に以下で大丈夫そうでしょうか??(☆の部分は議論の余地あるかもと思った所)

☆1…ひとまず有無のみで考えていますが、件数のほうが良さそうでしょうか。   件数ありの場合、取得処理が少し複雑になるかと(FTTありのときはredisでOK、なしのときは…実装コストやばそう) ☆2…もっと間隔は長くても良さそう??

syuilo commented 7 months ago

そんな感じになりそうですが、リアクションの更新をどうするかなど他にも考えなければならないことが膨大にありそうですね

samunohito commented 7 months ago

※メモ

10秒に1回↑のエンドポイントを叩いて最新の有無を問い合わせる

これに、RedisのlatestReadNotificationを見る機能を増やす NotificationService.readAllNotification() を叩くエンドポイントも生やしておけば既読化も出来そう。 mark-all-as-read.tsあった

syuilo commented 7 months ago

そんな感じになりそうですが、リアクションの更新をどうするかなど他にも考えなければならないことが膨大にありそうですね

https://github.com/misskey-dev/misskey/issues/11090

samunohito commented 7 months ago

@syuilo

リアクションの更新をどうするか

最新ノート取得時に、新規で取得するノートの規定数にプラスして、既に表示されているノートの最新数件(MkPaginationが持ってるdisplayLimitあたりが妥当と考えます)を取るのが良いかと思いました。新しいノートを取得しつつ、リアクションの状況、リノートやリプライなどの状態も一緒に更新できるかとおもいます。

以下のようなイメージです。

  1. MkPaginationが持ってるノートの一覧をdisplayLimitの件数でトリミング
  2. 1の中の一番古いノートIDをsinceIdに設定してTL取得
  3. 表示更新 ・MkPagination内に既にあるノート →リノート数やリアクションなどの中身を上書きして最新化  (ノートの表示枠ごと消すのは表示がちらつくのでやらない) ・MKPagination内にあるが、2の戻り値にないノート →表示を削除 ・MkPagination内に無いノート →新しいノートとして先頭に継ぎ足す  
syuilo commented 7 months ago

リアクションを考えると、5秒に1回程度は表示を更新したいけど、5秒に1回

1の中の一番古いノートIDをsinceIdに設定してTL取得

をしてると通信量がかなり増えてしまいそうな気がした

samunohito commented 7 months ago

最新ノート取得時にまとめて更新するのではなく、リアクションの鮮度のみを重要視されるのであれば… ノートIDをまとめてpostすると、以下のようにMisskey.entities.Notereactions/reactionEmojisと互換性がある形でnote_reactionテーブル内の中身を返してくれるエンドポイントを新たに生やすのは如何でしょう??

[
  {
    "noteId": "9m2rp5kn45mv000r",
    "reactionEmojis": {
       'neo_armstrong_cyclone_jet_armstrong_hou@misskey.io' : "https://s3.arkjp.net/misskey/ceb88abf-e2dd-4e14-b226-82dc5c21b2f7.png"
    },
    "reactions": {
      ':60fpsparrot:' : 2,
      '🍮' : 2,
      ':neo_armstrong_cyclone_jet_armstrong_hou@misskey.io:' : 334
    }
  },
  {
    "noteId": "9m30fhprh0ym0008",
    "reactionEmojis": {},
    "reactions": {
      '🎉' : 4,
      '🦄' : 1
    }
  }
]

MkPagination内にあるノートのIDをまとめて投げる→受信結果をMkPaginationが持ってる各Noteのオブジェクトに上書き…みたいな形で更新できるかとおもいます

syuilo commented 6 months ago

良さそう

temtemy commented 2 months ago

Is there any update on this? Being able to have WebSockets be optional for timeline auto-updates, notifications, and emoji reactions would be really useful for servers behind CDNs that have no support for proxying WebSocket requests to origin...

kakkokari-gtyih commented 1 week ago

13929 でWebSocketを回避する実装をやった(WebSocket未使用時の通常UIの振る舞い等は未実装)