Ship production optimization M1-M12.5A: queues, metrics, HTTP observability, and vector search reliability.
Keep similar-ai from tripping the global circuit on a lone URL 502, clamp Qdrant search to 100, and add Server-Timing plus slow-request logging. Studio shared props, Academy S3 exists caching, heat chunking, and Redis/scheduler hygiene stay in this rollout.
This commit is contained in:
+61
-30
@@ -44,16 +44,31 @@ Schedule::command('skinbase:reset-windowed-stats --period=7d')
|
||||
->withoutOverlapping();
|
||||
|
||||
// Daily maintenance
|
||||
Schedule::command('uploads:cleanup')->dailyAt('03:00');
|
||||
Schedule::command('uploads:cleanup')
|
||||
->dailyAt('03:00')
|
||||
->name('uploads-cleanup')
|
||||
->withoutOverlapping();
|
||||
Schedule::command('enhance:cleanup --force')
|
||||
->dailyAt('03:30')
|
||||
->name('enhance-cleanup')
|
||||
->withoutOverlapping()
|
||||
->runInBackground();
|
||||
Schedule::command('analytics:aggregate-similar-artworks')->dailyAt('03:10');
|
||||
Schedule::command('analytics:aggregate-feed')->dailyAt('03:20');
|
||||
Schedule::command('analytics:aggregate-discovery-feedback')->dailyAt('03:25');
|
||||
Schedule::command('analytics:aggregate-tag-interactions')->dailyAt('03:35');
|
||||
Schedule::command('analytics:aggregate-similar-artworks')
|
||||
->dailyAt('03:10')
|
||||
->name('analytics-aggregate-similar-artworks')
|
||||
->withoutOverlapping();
|
||||
Schedule::command('analytics:aggregate-feed')
|
||||
->dailyAt('03:20')
|
||||
->name('analytics-aggregate-feed')
|
||||
->withoutOverlapping();
|
||||
Schedule::command('analytics:aggregate-discovery-feedback')
|
||||
->dailyAt('03:25')
|
||||
->name('analytics-aggregate-discovery-feedback')
|
||||
->withoutOverlapping();
|
||||
Schedule::command('analytics:aggregate-tag-interactions')
|
||||
->dailyAt('03:35')
|
||||
->name('analytics-aggregate-tag-interactions')
|
||||
->withoutOverlapping();
|
||||
Schedule::command('academy:analytics-rollup')
|
||||
->hourlyAt(12)
|
||||
->name('academy-analytics-rollup')
|
||||
@@ -74,8 +89,9 @@ Schedule::command('academy:analytics-prune-events --days=180')
|
||||
|
||||
// Drain Redis artwork-stat delta queue so MySQL counters stay fresh.
|
||||
// Offset this off the :00/:10 boundaries so it does not pile onto publish jobs.
|
||||
// :18 not :21 so this does not start with leaderboards:refresh (observed >2 min).
|
||||
Schedule::command('skinbase:flush-redis-stats')
|
||||
->cron('1,11,21,31,41,51 * * * *')
|
||||
->cron('1,11,18,31,41,51 * * * *')
|
||||
->name('flush-redis-stats')
|
||||
->withoutOverlapping();
|
||||
|
||||
@@ -226,11 +242,13 @@ Schedule::job(new \App\Jobs\Sitemaps\CleanupSitemapReleasesJob())
|
||||
->name('sitemaps-cleanup')
|
||||
->withoutOverlapping();
|
||||
|
||||
Schedule::command('collections:dispatch-maintenance')
|
||||
->hourlyAt(43)
|
||||
->name('dispatch-collection-maintenance')
|
||||
->withoutOverlapping()
|
||||
->runInBackground();
|
||||
if ((bool) config('collections.v5.queue.dispatch_enabled', false)) {
|
||||
Schedule::command('collections:dispatch-maintenance')
|
||||
->hourlyAt(43)
|
||||
->name('dispatch-collection-maintenance')
|
||||
->withoutOverlapping()
|
||||
->runInBackground();
|
||||
}
|
||||
|
||||
Schedule::job(new \App\Jobs\RankBuildListsJob())
|
||||
->hourlyAt(15)
|
||||
@@ -253,10 +271,11 @@ Schedule::job(new \App\Jobs\RecalculateRisingNovaCardsJob())
|
||||
->name('nova-cards-rising-cache-refresh')
|
||||
->withoutOverlapping();
|
||||
|
||||
Schedule::command('nova:prune-metric-snapshots --keep-days=7')
|
||||
->dailyAt('04:00')
|
||||
// After hourly snapshot at :02 so prune does not share the 04:02 upsert window.
|
||||
Schedule::command('nova:prune-metric-snapshots')
|
||||
->dailyAt('04:25')
|
||||
->name('prune-metric-snapshots')
|
||||
->withoutOverlapping();
|
||||
->withoutOverlapping(120);
|
||||
|
||||
Schedule::command('skinbase:sync-countries')
|
||||
->monthlyOn(1, '03:40')
|
||||
@@ -269,17 +288,13 @@ Schedule::command('health:tick')
|
||||
->name('health-scheduler-tick')
|
||||
->withoutOverlapping();
|
||||
|
||||
Schedule::command('forum:ai-scan')
|
||||
->hourlyAt(16)
|
||||
->name('forum-ai-scan')
|
||||
->withoutOverlapping()
|
||||
->runInBackground();
|
||||
|
||||
Schedule::command('forum:bot-scan')
|
||||
->hourlyAt(22)
|
||||
->name('forum-bot-scan')
|
||||
->withoutOverlapping()
|
||||
->runInBackground();
|
||||
if ((bool) config('skinbase_ai_moderation.queue.dispatch_enabled', false)) {
|
||||
Schedule::command('forum:ai-scan')
|
||||
->hourlyAt(16)
|
||||
->name('forum-ai-scan')
|
||||
->withoutOverlapping()
|
||||
->runInBackground();
|
||||
}
|
||||
|
||||
Schedule::command('forum:scan-posts --limit=250')
|
||||
->hourlyAt(17)
|
||||
@@ -287,13 +302,29 @@ Schedule::command('forum:scan-posts --limit=250')
|
||||
->withoutOverlapping()
|
||||
->runInBackground();
|
||||
|
||||
Schedule::command('forum:firewall-scan')
|
||||
->hourlyAt(40)
|
||||
->name('forum-firewall-scan')
|
||||
->withoutOverlapping()
|
||||
->runInBackground();
|
||||
if ((bool) config('forum_security.queues.dispatch_enabled', false)) {
|
||||
Schedule::command('forum:bot-scan')
|
||||
->hourlyAt(22)
|
||||
->name('forum-bot-scan')
|
||||
->withoutOverlapping()
|
||||
->runInBackground();
|
||||
|
||||
Schedule::command('forum:firewall-scan')
|
||||
->hourlyAt(40)
|
||||
->name('forum-firewall-scan')
|
||||
->withoutOverlapping()
|
||||
->runInBackground();
|
||||
}
|
||||
|
||||
Schedule::command('horizon:snapshot')
|
||||
->hourlyAt(45)
|
||||
->name('horizon-snapshot')
|
||||
->withoutOverlapping();
|
||||
|
||||
if ((bool) config('traffic.online_visitors.prune_enabled', false)) {
|
||||
Schedule::command('skinbase:prune-online-visitor-index --execute')
|
||||
->hourlyAt(33)
|
||||
->name('prune-online-visitor-index')
|
||||
->withoutOverlapping(25)
|
||||
->runInBackground();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user