No WebSocketモード
Summary
WebSocketを一切使わずにクライアントを利用するモード 場合によってはサーバーの負荷軽減になるかも
Twitter(X)みたいに「n件の新しいツイート」の件数だけを返すのと、新しい通知があればtrue返すみたいなapiがあれば出来そうだと思った(現状がここらへんをwebsocketを使用してるため)
@syuilo この件、差し支えなければ自分がやろうと思うのですが… 実装イメージ的に以下で大丈夫そうでしょうか??(☆の部分は議論の余地あるかもと思った所)
- 設定→全般→動作あたりに「リアルタイム更新を利用しない」みたいなのを作る(クライアント側でoff出来るようにする)
- MkTimelineのソケット接続処理を↑で制御する
- slofpさんが仰っているような通知有無を返すエンドポイントを実装 ☆1
- ノートIDを渡せばそのノートよりも新しいノートの有無を返す
- TL種別を渡すことで件数取得ロジックを切り替え(HTL、LTL、STL、GTL、チャンネル、リスト、アンテナ、ユーザロールTLぶん)
- 各TLの最新ノートのIDを持つキャッシュを用意し、これよりも古いIDが渡されてたら無しを返す(☆1次第で変わるかも)
- ノートIDを渡せばそのノートよりも新しいノートの有無を返す
- 10秒に1回↑のエンドポイントを叩いて最新の有無を問い合わせる ☆2
- 新しいノートがあれば「新しいノートがあります」ボタンを出したい
☆1…ひとまず有無のみで考えていますが、件数のほうが良さそうでしょうか。 件数ありの場合、取得処理が少し複雑になるかと(FTTありのときはredisでOK、なしのときは…実装コストやばそう) ☆2…もっと間隔は長くても良さそう??
そんな感じになりそうですが、リアクションの更新をどうするかなど他にも考えなければならないことが膨大にありそうですね
※メモ
10秒に1回↑のエンドポイントを叩いて最新の有無を問い合わせる
これに、RedisのlatestReadNotificationを見る機能を増やす
mark-all-as-read.tsあったNotificationService.readAllNotification() を叩くエンドポイントも生やしておけば既読化も出来そう。
そんな感じになりそうですが、リアクションの更新をどうするかなど他にも考えなければならないことが膨大にありそうですね
https://github.com/misskey-dev/misskey/issues/11090
@syuilo
リアクションの更新をどうするか
最新ノート取得時に、新規で取得するノートの規定数にプラスして、既に表示されているノートの最新数件(MkPaginationが持ってるdisplayLimitあたりが妥当と考えます)を取るのが良いかと思いました。新しいノートを取得しつつ、リアクションの状況、リノートやリプライなどの状態も一緒に更新できるかとおもいます。
以下のようなイメージです。
- MkPaginationが持ってるノートの一覧をdisplayLimitの件数でトリミング
- 1の中の一番古いノートIDをsinceIdに設定してTL取得
- 表示更新 ・MkPagination内に既にあるノート →リノート数やリアクションなどの中身を上書きして最新化 (ノートの表示枠ごと消すのは表示がちらつくのでやらない) ・MKPagination内にあるが、2の戻り値にないノート →表示を削除 ・MkPagination内に無いノート →新しいノートとして先頭に継ぎ足す
リアクションを考えると、5秒に1回程度は表示を更新したいけど、5秒に1回
1の中の一番古いノートIDをsinceIdに設定してTL取得
をしてると通信量がかなり増えてしまいそうな気がした
最新ノート取得時にまとめて更新するのではなく、リアクションの鮮度のみを重要視されるのであれば…
ノートIDをまとめてpostすると、以下のようにMisskey.entities.Noteのreactions/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のオブジェクトに上書き…みたいな形で更新できるかとおもいます
良さそう
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...
#13929 でWebSocketを回避する実装をやった(WebSocket未使用時の通常UIの振る舞い等は未実装)
SSE使う手もある