misskey icon indicating copy to clipboard operation
misskey copied to clipboard

No WebSocketモード

Open syuilo opened this issue 2 years ago • 11 comments

Summary

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

syuilo avatar Nov 02 '23 21:11 syuilo

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

slofp avatar Nov 07 '23 02:11 slofp

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

  • 設定→全般→動作あたりに「リアルタイム更新を利用しない」みたいなのを作る(クライアント側でoff出来るようにする)
    • MkTimelineのソケット接続処理を↑で制御する
  • slofpさんが仰っているような通知有無を返すエンドポイントを実装 ☆1
    • ノートIDを渡せばそのノートよりも新しいノートの有無を返す
      • TL種別を渡すことで件数取得ロジックを切り替え(HTL、LTL、STL、GTL、チャンネル、リスト、アンテナ、ユーザロールTLぶん)
      • 各TLの最新ノートのIDを持つキャッシュを用意し、これよりも古いIDが渡されてたら無しを返す(☆1次第で変わるかも)
  • 10秒に1回↑のエンドポイントを叩いて最新の有無を問い合わせる ☆2
    • 新しいノートがあれば「新しいノートがあります」ボタンを出したい

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

samunohito avatar Nov 16 '23 12:11 samunohito

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

syuilo avatar Nov 16 '23 21:11 syuilo

※メモ

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

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

samunohito avatar Nov 16 '23 23:11 samunohito

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

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

syuilo avatar Nov 17 '23 01:11 syuilo

@syuilo

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

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

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

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

samunohito avatar Nov 17 '23 05:11 samunohito

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

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

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

syuilo avatar Nov 17 '23 05:11 syuilo

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

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

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

samunohito avatar Nov 17 '23 07:11 samunohito

良さそう

syuilo avatar Dec 21 '23 06:12 syuilo

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...

temtemy avatar Apr 29 '24 05:04 temtemy

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

kakkokari-gtyih avatar Jun 22 '24 05:06 kakkokari-gtyih

SSE使う手もある

syuilo avatar Feb 24 '25 11:02 syuilo