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

No WebSocketモード #12227

Open
syuilo opened this issue Nov 2, 2023 · 11 comments
Open

No WebSocketモード #12227

syuilo opened this issue Nov 2, 2023 · 11 comments
Labels
✨Feature This adds/improves/enhances a feature 🔥high priority 🐢Performance Efficiency related issue/PR

Comments

@syuilo
Copy link
Member

syuilo commented Nov 2, 2023

Summary

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

@syuilo syuilo added the ✨Feature This adds/improves/enhances a feature label Nov 2, 2023
@slofp
Copy link
Contributor

slofp commented Nov 7, 2023

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

@samunohito
Copy link
Member

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

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

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

@syuilo
Copy link
Member Author

syuilo commented Nov 16, 2023

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

@samunohito
Copy link
Member

samunohito commented Nov 16, 2023

※メモ

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

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

@syuilo syuilo added the 🐢Performance Efficiency related issue/PR label Nov 17, 2023
@syuilo
Copy link
Member Author

syuilo commented Nov 17, 2023

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

#11090

@samunohito
Copy link
Member

@syuilo

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

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

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

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

@syuilo
Copy link
Member Author

syuilo commented Nov 17, 2023

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

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

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

@samunohito
Copy link
Member

最新ノート取得時にまとめて更新するのではなく、リアクションの鮮度のみを重要視されるのであれば…
ノート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のオブジェクトに上書き…みたいな形で更新できるかとおもいます

@syuilo
Copy link
Member Author

syuilo commented Dec 21, 2023

良さそう

@temtemy
Copy link

temtemy commented Apr 29, 2024

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
Copy link
Contributor

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

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 🔥high priority 🐢Performance Efficiency related issue/PR
Projects
Development

No branches or pull requests

5 participants