mirror of
https://github.com/tiennm99/coolify.git
synced 2026-04-19 05:20:41 +00:00
refactor: send immediate Traefik version notifications instead of delayed aggregation
Move notification logic from NotifyOutdatedTraefikServersJob into CheckTraefikVersionForServerJob to send immediate notifications when outdated Traefik is detected. This is more suitable for cloud environments with thousands of servers. Changes: - CheckTraefikVersionForServerJob now sends notifications immediately after detecting outdated Traefik - Remove NotifyOutdatedTraefikServersJob (no longer needed) - Remove delay calculation logic from CheckTraefikVersionJob - Update tests to reflect new immediate notification pattern Trade-offs: - Pro: Faster notifications (immediate alerts) - Pro: Simpler codebase (removed complex delay calculation) - Pro: Better scalability for thousands of servers - Con: Teams may receive multiple notifications if they have many outdated servers 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -32,65 +32,14 @@ class CheckTraefikVersionJob implements ShouldQueue
|
||||
->whereRelation('settings', 'is_usable', true)
|
||||
->get();
|
||||
|
||||
$serverCount = $servers->count();
|
||||
|
||||
if ($serverCount === 0) {
|
||||
if ($servers->isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Dispatch individual server check jobs in parallel
|
||||
// Each job will send immediate notifications when outdated Traefik is detected
|
||||
foreach ($servers as $server) {
|
||||
CheckTraefikVersionForServerJob::dispatch($server, $traefikVersions);
|
||||
}
|
||||
|
||||
// Dispatch notification job with delay to allow server checks to complete
|
||||
// Jobs run in parallel via queue workers, but we need to account for:
|
||||
// - Queue worker capacity (workers process jobs concurrently)
|
||||
// - Job timeout (60s per server check)
|
||||
// - Retry attempts (3 retries with exponential backoff)
|
||||
// - Network latency and SSH connection overhead
|
||||
//
|
||||
// Calculation strategy:
|
||||
// - Assume ~10-20 workers processing the high queue
|
||||
// - Each server check takes up to 60s (timeout)
|
||||
// - With retries, worst case is ~180s per job
|
||||
// - More conservative: 0.2s per server (instead of 0.1s)
|
||||
// - Higher minimum: 120s (instead of 60s) to account for retries
|
||||
// - Keep 300s maximum to avoid excessive delays
|
||||
$delaySeconds = $this->calculateNotificationDelay($serverCount);
|
||||
if (isDev()) {
|
||||
$delaySeconds = 1;
|
||||
}
|
||||
NotifyOutdatedTraefikServersJob::dispatch()->delay(now()->addSeconds($delaySeconds));
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the delay in seconds before sending notifications.
|
||||
*
|
||||
* This method calculates an appropriate delay to allow all parallel
|
||||
* CheckTraefikVersionForServerJob instances to complete before sending
|
||||
* notifications to teams.
|
||||
*
|
||||
* The calculation considers:
|
||||
* - Server count (more servers = longer delay)
|
||||
* - Queue worker capacity
|
||||
* - Job timeout (60s) and retry attempts (3x)
|
||||
* - Network latency and SSH connection overhead
|
||||
*
|
||||
* @param int $serverCount Number of servers being checked
|
||||
* @return int Delay in seconds
|
||||
*/
|
||||
protected function calculateNotificationDelay(int $serverCount): int
|
||||
{
|
||||
$minDelay = config('constants.server_checks.notification_delay_min');
|
||||
$maxDelay = config('constants.server_checks.notification_delay_max');
|
||||
$scalingFactor = config('constants.server_checks.notification_delay_scaling');
|
||||
|
||||
// Calculate delay based on server count
|
||||
// More conservative approach: 0.2s per server
|
||||
$calculatedDelay = (int) ($serverCount * $scalingFactor);
|
||||
|
||||
// Apply min/max boundaries
|
||||
return min($maxDelay, max($minDelay, $calculatedDelay));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user