servers()->get() ->filter(fn (DnsServer $server) => $server->status === 'activated' && $server->servesHosting()) ->values(); } public function pick(ServicePlan $plan, array $excludeIds = []): ?DnsServer { return $this->candidates($plan)->first( fn (DnsServer $server) => ! in_array($server->id, $excludeIds, true) && $this->isHealthy($server) ); } public function hasHealthyServer(ServicePlan $plan): bool { return $this->pick($plan) !== null; } public function isHealthy(DnsServer $server): bool { return Cache::remember($this->cacheKey($server), self::HEALTH_TTL_SECONDS, fn () => $this->probe($server)); } public function forget(DnsServer $server): void { Cache::forget($this->cacheKey($server)); } private function probe(DnsServer $server): bool { try { return $this->plesk ->client($server, self::PROBE_TIMEOUT_SECONDS) ->get($this->plesk->url($server, 'server')) ->successful(); } catch (Throwable) { return false; } } private function cacheKey(DnsServer $server): string { return 'hosting-server-health:' . $server->id; } }