perf: Reduce database query

This commit is contained in:
syuilo 2021-03-19 20:43:24 +09:00
parent 5e61c60f85
commit 87c8f9ff95
8 changed files with 114 additions and 123 deletions

View file

@ -1,12 +1,12 @@
import $ from 'cafy';
import { ID } from '../../../../misc/cafy-id';
import define from '../../define';
import read from '../../../../services/note/read';
import { Notes, Followings } from '../../../../models';
import { generateVisibilityQuery } from '../../common/generate-visibility-query';
import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
import { makePaginationQuery } from '../../common/make-pagination-query';
import { Brackets } from 'typeorm';
import { readMention } from '../../../../services/note/read-mention';
export const meta = {
desc: {
@ -79,9 +79,7 @@ export default define(meta, async (ps, user) => {
const mentions = await query.take(ps.limit!).getMany();
for (const note of mentions) {
read(user.id, note.id);
}
readMention(user.id, mentions.map(n => n.id));
return await Notes.packMany(mentions, user);
});

View file

@ -2,7 +2,6 @@ import autobind from 'autobind-decorator';
import * as websocket from 'websocket';
import { readNotification } from '../common/read-notification';
import call from '../call';
import readNote from '../../../services/note/read';
import Channel from './channel';
import channels from './channels';
import { EventEmitter } from 'events';
@ -14,6 +13,8 @@ import { AccessToken } from '../../../models/entities/access-token';
import { UserProfile } from '../../../models/entities/user-profile';
import { publishChannelStream, publishGroupMessagingStream, publishMessagingStream } from '../../../services/stream';
import { UserGroup } from '../../../models/entities/user-group';
import { readMention } from '../../../services/note/read-mention';
import { readSpecifiedNote } from '../../../services/note/read-specified-note';
/**
* Main stream connection
@ -86,9 +87,10 @@ export default class Connection {
switch (type) {
case 'api': this.onApiRequest(body); break;
case 'readNotification': this.onReadNotification(body); break;
case 'subNote': this.onSubscribeNote(body, true); break;
case 'sn': this.onSubscribeNote(body, true); break; // alias
case 's': this.onSubscribeNote(body, false); break;
case 'readMention': this.onReadMention(body); break;
case 'readSpecifiedNote': this.onReadSpecifiedNote(body); break;
case 'subNote': this.onSubscribeNote(body); break;
case 'sn': this.onSubscribeNote(body); break; // alias
case 'unsubNote': this.onUnsubscribeNote(body); break;
case 'un': this.onUnsubscribeNote(body); break; // alias
case 'connect': this.onChannelConnectRequested(body); break;
@ -141,11 +143,31 @@ export default class Connection {
readNotification(this.user!.id, [payload.id]);
}
@autobind
private onReadMention(payload: any) {
if (!payload.id) return;
if (this.user) {
// TODO: ある程度まとめてreadMentionするようにする
// 具体的には、この箇所ではキュー的な配列にread予定ートを溜めておくに留めて、別の箇所で定期的にキューにあるートを配列でreadMentionに渡すような実装にする
readMention(this.user.id, [payload.id]);
}
}
@autobind
private onReadSpecifiedNote(payload: any) {
if (!payload.id) return;
if (this.user) {
// TODO: ある程度まとめてreadSpecifiedNoteするようにする
// 具体的には、この箇所ではキュー的な配列にread予定ートを溜めておくに留めて、別の箇所で定期的にキューにあるートを配列でreadSpecifiedNoteに渡すような実装にする
readSpecifiedNote(this.user.id, [payload.id]);
}
}
/**
* 稿
*/
@autobind
private onSubscribeNote(payload: any, read: boolean) {
private onSubscribeNote(payload: any) {
if (!payload.id) return;
if (this.subscribingNotes[payload.id] == null) {
@ -157,12 +179,6 @@ export default class Connection {
if (this.subscribingNotes[payload.id] === 1) {
this.subscriber.on(`noteStream:${payload.id}`, this.onNoteStreamMessage);
}
if (this.user && read) {
// TODO: クライアントでタイムライン読み込みなどすると、一度に大量のreadNoteが発生しクエリ数がすごいことになるので、ある程度まとめてreadNoteするようにする
// 具体的には、この箇所ではキュー的な配列にread予定ートを溜めておくに留めて、別の箇所で定期的にキューにあるートを配列でreadNoteに渡すような実装にする
readNote(this.user.id, payload.id);
}
}
/**