雑に読むMisskey
雑に読むMisskey
草.icon雑に読むのそっちかbsahd.icon
基素.icon
こんなことがわかると良い
スケーラビリティの工夫
他のサーバーとどうやってメッセージをやり取りするの?
ActivityPubってどうやって使うの?
noteのデータが大きくなってきたらどうするの?
noteのデータはDBに保存されると思うけど、それがかなり大きくなったらどうする?
画像はどこに保存されるの?
配信URLはark.jp
村上さんのドメインっぽい
https://blog.arkjp.net/2021/12/1003io/
これはS3とかに保存すればいいか(興味が消えた)
BackendもTypeScriptで書かれている
フレームワークnestjs
ORM TypeORM
src/coreがcoreっぽい(小並感)
nestjsのimport from '@/'
コミットメッセージ面白い
https://gyazo.com/2fa1094505198d01b8c8bf2ac8ef8603
なんかもうめっちゃ変えた
https://github.com/misskey-dev/misskey/blob/7e8700514f18409874737cd5b439280bb03b829c/packages/backend/src/misc/reset-db.ts
ActivityPubの実装
https://github.com/misskey-dev/misskey/tree/develop/packages/backend/src/core/activitypub
ApInboxをちょっと見るといろんなアノテーションがいっぱい
仕組みを理解していない段階でこれを眺めるのは難しそう
雑にActivityPubの勧告読見ながら実装を見ていく基素.icon
https://www.w3.org/TR/activitypub/
2つのレイヤーがある
サーバー間で情報を共有するプロトコル
クライアント-サーバーでのプロトコル
片方だけの実装でも良いが、1つを実装したらもう一方も実装が容易
両者は似ているってことかな基素.icon
サーバーのユーザーアカウントをユーザーのことをActorという
Actorにはメッセージをやり取りする方法(エンドポイント)が提供されている
https://gyazo.com/28b76540c1d91aa8dbb74aee0260a0c1
inbox メッセージを受信する
サーバー間のみが、誰かのinboxにPOSTできる
misskeyだとサーバーのエンドポイントのPOSTの実装はここ(outboxも同様)
キューがつまれる
https://github.com/misskey-dev/misskey/blob/e4fc9ea816eabba03933d9845ba0918b1ad365ab/packages/backend/src/core/QueueService.ts#L59-L67
取り出されるのはどこ?
QueueProcessorServiceがそれっぽい
https://github.com/misskey-dev/misskey/blob/e4fc9ea816eabba03933d9845ba0918b1ad365ab/packages/backend/src/queue/QueueProcessorService.ts#LL112C117-L112C117
https://github.com/misskey-dev/misskey/blob/e4fc9ea816eabba03933d9845ba0918b1ad365ab/packages/backend/src/queue/processors/InboxProcessorService.ts#L62 で処理される
Activityの種類によって処理が行われる
https://github.com/misskey-dev/misskey/blob/0ec5327474d7bf6f16ad5219e928e510e899d517/packages/backend/src/core/activitypub/ApInboxService.ts#L113
actorはinboxからGETすることでメッセージを読むことができる
キューの実装はbull
BullMQに差し替えるPRを出すと喜ばれるかもしれない
https://github.com/misskey-dev/misskey/issues/6221
redis 5だから..という話もあるけど、とっくにredis7だからこの点は問題ない
https://github.com/misskey-dev/misskey/blob/c7fbf5637ff6a4781f81babf81bee395b06a71c7/.devcontainer/docker-compose.yml#L20
outbox 送信する
ここにActorが送信すると世界中にメッセージが配信される
誰かのOutboxからメッセージをGETすることができる
サーバー to サーバー
サーバー間で別のサーバーのユーザーのメッセージを受け渡すときに使うのかな基素.icon
クライアント to サーバー
AlyssaがBenにメッセージを送信するとき、まず自分のoutboxにpostする
するとサーバーがbenのinboxにpostする
BenのActivityStreams actor objectを検索する
ということは、misskeyのinboxの実装にもこういう実装があるはず基素.icon
AlyssaのスマホはinboxにGETをポーリングしてメッセージを確認する
GET /inbox の実装どこ?
noteのデータがどうなっているのか
noteのスキーマ
OpenAPIを使ってドキュメントを自動生成しているっぽい
API https://misskey-hub.net/docs/api/endpoints.html
MisskeyはRESTを採用していません。
DBはPostgreSQL
貢献できそうなポイント
トレンドのハッシュタグのロジック
https://github.com/misskey-dev/misskey/blob/01d4d55e78fd977b9d44a68a2504e6091d346b7a/packages/backend/src/server/api/endpoints/hashtags/trend.ts#L15
起動時に出るMisskeyのアスキーアートを発見したMijinko_SD.icon
https://gyazo.com/cbdecdeb1fca2c06437c048ca8c4c1d4
https://github.com/misskey-dev/misskey/blob/13.8.1/packages/backend/src/boot/master.ts#L27