Giter Site home page Giter Site logo

Comments (7)

samunohito avatar samunohito commented on June 12, 2024 2

(実装を軽く調査したメモ書きです)

UserEntityServiceには既にAPIの実行者と対象ユーザの関係を調べる機能は存在するが、これはUserスキーマをUserLiteよりも詳細なもので呼び出した時にのみ返される。しかし、NoteEntityServiceでMiNoteをpack化する際はUserLiteでの呼び出しとなっており、詳細情報の取得は行われていない。

pack化時にUserDetailedを使うようにすればフォロー関係も同時に取得可能で、本件の実現も可能かと思われるが実行時の負荷が懸念…(キャッシュがあるとはいえ、追加情報をそれなりに取るので)
NoteEntityServiceのpackManyでユーザ情報をあらかじめ取得してMapで引き回せばマシになるかとは思われるが…

from misskey.

tamaina avatar tamaina commented on June 12, 2024 2

別途users/relations APIを呼び出せばいい気もするけど、まあ毎ノートそれをやるのはちょっとという感じではある

from misskey.

slofp avatar slofp commented on June 12, 2024 2

別途でusers/relations を呼び出すのであれば、userEntityServiceのpack段階で行われるgetRelationの情報を元にフォロー状態を取得させて、userLiteに新たにfollowStateのようなenumを定義して追加してあげれば現状とそこまで動作的には変わらない気がしますね。

from misskey.

syamatsumi avatar syamatsumi commented on June 12, 2024 2

mastodon上で参考に挙げた実装を作ったのえる氏に解説して頂けたのですが、かなり重たそうな処理をしていたみたいです。
https://fedibird.com/web/statuses/112364167105554633

キャッシュに無いユーザーを見かけたらRelationshipを参照しにいく仕組みだそうで、misskey.ioのローカルや連合タイムラインだとなかなか凄いことになりそうですね……

from misskey.

Sayamame-beans avatar Sayamame-beans commented on June 12, 2024 1

タイムライン上でのフォロー情報という観点では、Related: #11079, #12320

from misskey.

slofp avatar slofp commented on June 12, 2024 1

そこら辺の負荷についてmisskey上のコードを見ていたんですが、
結論から言うと私が調べた限りでは、ユーザー取得時のRelationの参照は最終的にはすべてローカル上でのみ行われており、cacheから取ってきていなく、データベースから直接参照されています。

this.followingsRepository.exists({

なので増えるとしても取得時に毎回クエリが打たれる処理くらいだと思っています(それでもioレベル、ましては中堅でもえげつない処理だと思われ)。
※連合側のフォロー・フォロワー情報の処理はapのinbox側でいい感じに行われているっぽい感じがしたので省きました。

可能性があるとするならばcacheServiceにいい感じにfollowingsCacheが存在しているのでこれをfollowersCacheとかでいい感じに出来たりしないかなってことですかね...

this.userFollowingsCache = new RedisKVCache<Record<string, Pick<MiFollowing, 'withReplies'> | undefined>>(this.redisClient, 'userFollowings', {

(キャッシュがあるとはいえ、追加情報をそれなりに取るので)

まさにこれなんですよね

from misskey.

syamatsumi avatar syamatsumi commented on June 12, 2024

パフォーマンス上の懸念はやはり大きいのですねぇ……

from misskey.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.