summaryrefslogtreecommitdiff
path: root/packages/backend
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-04-12 10:07:14 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-04-12 10:07:14 +0900
commit77f91d67b42ae50ba6176ac95247aad80db34811 (patch)
tree4f0eb4a41bf1b4673549eb9195872fb7c3aadb97 /packages/backend
parentfeat: queueing bulk follow/unfollow and block/unblock (#10544) (diff)
downloadsharkey-77f91d67b42ae50ba6176ac95247aad80db34811.tar.gz
sharkey-77f91d67b42ae50ba6176ac95247aad80db34811.tar.bz2
sharkey-77f91d67b42ae50ba6176ac95247aad80db34811.zip
perf(backend): ノート作成時のアンテナ追加パフォーマンスを改善
Diffstat (limited to 'packages/backend')
-rw-r--r--packages/backend/src/core/AntennaService.ts26
-rw-r--r--packages/backend/src/core/NoteCreateService.ts9
2 files changed, 19 insertions, 16 deletions
diff --git a/packages/backend/src/core/AntennaService.ts b/packages/backend/src/core/AntennaService.ts
index 02e0b455fd..166c78f479 100644
--- a/packages/backend/src/core/AntennaService.ts
+++ b/packages/backend/src/core/AntennaService.ts
@@ -91,14 +91,24 @@ export class AntennaService implements OnApplicationShutdown {
}
@bindThis
- public async addNoteToAntenna(antenna: Antenna, note: Note, noteUser: { id: User['id']; }): Promise<void> {
- this.redisClient.xadd(
- `antennaTimeline:${antenna.id}`,
- 'MAXLEN', '~', '200',
- '*',
- 'note', note.id);
-
- this.globalEventService.publishAntennaStream(antenna.id, 'note', note);
+ public async addNoteToAntennas(note: Note, noteUser: { id: User['id']; username: string; host: string | null; }): Promise<void> {
+ const antennas = await this.getAntennas();
+ const antennasWithMatchResult = await Promise.all(antennas.map(antenna => this.checkHitAntenna(antenna, note, noteUser).then(hit => [antenna, hit] as const)));
+ const matchedAntennas = antennasWithMatchResult.filter(([, hit]) => hit).map(([antenna]) => antenna);
+
+ const redisPipeline = this.redisClient.pipeline();
+
+ for (const antenna of matchedAntennas) {
+ redisPipeline.xadd(
+ `antennaTimeline:${antenna.id}`,
+ 'MAXLEN', '~', '200',
+ '*',
+ 'note', note.id);
+
+ this.globalEventService.publishAntennaStream(antenna.id, 'note', note);
+ }
+
+ redisPipeline.exec();
}
// NOTE: フォローしているユーザーのノート、リストのユーザーのノート、グループのユーザーのノート指定はパフォーマンス上の理由で無効になっている
diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts
index fb7ee7080a..32e4fe7f8a 100644
--- a/packages/backend/src/core/NoteCreateService.ts
+++ b/packages/backend/src/core/NoteCreateService.ts
@@ -493,14 +493,7 @@ export class NoteCreateService implements OnApplicationShutdown {
}
});
- // Antenna
- for (const antenna of (await this.antennaService.getAntennas())) {
- this.antennaService.checkHitAntenna(antenna, note, user).then(hit => {
- if (hit) {
- this.antennaService.addNoteToAntenna(antenna, note, user);
- }
- });
- }
+ this.antennaService.addNoteToAntennas(note, user);
if (data.reply) {
this.saveReply(data.reply, note);