perf(enrich): cover-проход эфира 8 параллельно + защита от наложения

~447 живых станций, смена ~120 треков/мин — проход по 4 не успевал. Теперь 8
параллельно + guard против перекрытия крон-запусков.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
nk
2026-06-03 21:02:33 +03:00
parent 36043c32b0
commit ed94bd73d7

View File

@@ -63,8 +63,20 @@ export class EnrichmentService {
// Раз в минуту обеспечиваем ОБЛОЖКУ у играющих СЕЙЧАС треков — быстрый проход
// ТОЛЬКО через iTunes (без Discogs, который лимитирован 54/мин и тормозил бы
// обложки). Полное обогащение (жанр/стили) идёт фоном через backfill/enqueue.
private nowPlayingRunning = false;
@Cron(CronExpression.EVERY_MINUTE)
async enrichNowPlaying(): Promise<void> {
if (this.nowPlayingRunning) return; // не накладываем проходы
this.nowPlayingRunning = true;
try {
await this.runEnrichNowPlaying();
} finally {
this.nowPlayingRunning = false;
}
}
private async runEnrichNowPlaying(): Promise<void> {
const rows = await this.prisma.nowPlaying.findMany({
select: { artist: true, song: true },
});
@@ -84,9 +96,10 @@ export class EnrichmentService {
// полное обогащение (жанр) — в общую очередь, если ещё не сделано
if (track.enrichStatus !== 'done') this.enqueue(track.id);
}
// Быстрый cover-only проход, по 4 параллельно (iTunes терпимо)
for (let i = 0; i < todo.length; i += 4) {
await Promise.all(todo.slice(i, i + 4).map((t) => this.coverFast(t)));
// Быстрый cover-only проход, по 8 параллельно — чтобы успевать за сменой
// треков по всем сетям (~120/мин)
for (let i = 0; i < todo.length; i += 8) {
await Promise.all(todo.slice(i, i + 8).map((t) => this.coverFast(t)));
}
}