perf(enrich): ускорить бэкафилл (батч 240 каждые 5 мин, ~50 треков/мин)

В базе ~22к треков — прежние 30/10мин слишком медленно. Батч подобран под
троттлинг очереди (~50 запросов/мин, под лимитом Discogs 60/мин), пропускаем
тик если прошлый батч ещё не дожёван.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
nk
2026-06-03 13:43:19 +03:00
parent 0efba7c691
commit 149421740f

View File

@@ -32,15 +32,18 @@ export class EnrichmentService {
void this.drain(); void this.drain();
} }
// Периодически добираем не обогащённые треки (в т.ч. накопленные ранее) // Периодически добираем не обогащённые треки (в т.ч. накопленные ранее).
@Cron(CronExpression.EVERY_10_MINUTES) // Батч ≈ объёму, который очередь успевает прожевать за интервал при троттлинге
// ~50 запросов/мин (под лимитом Discogs 60/мин) — конвейер идёт почти непрерывно.
@Cron(CronExpression.EVERY_5_MINUTES)
async backfill(): Promise<void> { async backfill(): Promise<void> {
if (!this.discogs.enabled) return; // без токена смысла нет — не крутим вхолостую if (!this.discogs.enabled) return; // без токена смысла нет — не крутим вхолостую
if (this.running || this.queue.length > 0) return; // ещё жуём прошлый батч
const pending = await this.prisma.track.findMany({ const pending = await this.prisma.track.findMany({
where: { enrichStatus: 'pending' }, where: { enrichStatus: 'pending' },
select: { id: true }, select: { id: true },
orderBy: { firstSeenAt: 'desc' }, orderBy: { firstSeenAt: 'desc' },
take: 30, take: 240,
}); });
for (const t of pending) this.enqueue(t.id); for (const t of pending) this.enqueue(t.id);
} }