perf(server): improve deliver performance
This commit is contained in:
		
							parent
							
								
									bc2c40a6ca
								
							
						
					
					
						commit
						3cac8e0f6f
					
				
					 1 changed files with 18 additions and 7 deletions
				
			
		|  | @ -1,6 +1,7 @@ | |||
| import { Users, Followings } from '@/models/index.js'; | ||||
| import { ILocalUser, IRemoteUser, User } from '@/models/entities/user.js'; | ||||
| import { deliver } from '@/queue/index.js'; | ||||
| import { IsNull, Not } from 'typeorm'; | ||||
| 
 | ||||
| //#region types
 | ||||
| interface IRecipe { | ||||
|  | @ -82,16 +83,26 @@ export default class DeliverManager { | |||
| 		for (const recipe of this.recipes) { | ||||
| 			if (isFollowers(recipe)) { | ||||
| 				// followers deliver
 | ||||
| 				const followers = await Followings.findBy({ | ||||
| 				// TODO: SELECT DISTINCT ON ("followerSharedInbox") "followerSharedInbox" みたいな問い合わせにすればよりパフォーマンス向上できそう
 | ||||
| 				// ただ、sharedInboxがnullなリモートユーザーも稀におり、その対応ができなさそう?
 | ||||
| 				const followers = await Followings.find({ | ||||
| 					where: { | ||||
| 						followeeId: this.actor.id, | ||||
| 				}); | ||||
| 						followerHost: Not(IsNull()), | ||||
| 					}, | ||||
| 					select: { | ||||
| 						followerSharedInbox: true, | ||||
| 						followerInbox: true, | ||||
| 					}, | ||||
| 				}) as { | ||||
| 					followerSharedInbox: string | null; | ||||
| 					followerInbox: string; | ||||
| 				}[]; | ||||
| 
 | ||||
| 				for (const following of followers) { | ||||
| 					if (Followings.isRemoteFollower(following)) { | ||||
| 					const inbox = following.followerSharedInbox || following.followerInbox; | ||||
| 					inboxes.add(inbox); | ||||
| 				} | ||||
| 				} | ||||
| 			} else if (isDirect(recipe)) { | ||||
| 				// direct deliver
 | ||||
| 				const inbox = recipe.to.inbox; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue