Ho una lista di 75000 siti web che devono essere monitorati per i tempi di attività. Il monitoraggio dei siti Web comporta l'esecuzione di una richiesta HTTP per il sito Web ogni minuto e il sito Web viene definito "attivo" o "inattivo" in base al fatto che è possibile eseguire correttamente una richiesta HTTP e ricevere una risposta HTTP. Questo tipo di "polling" è l'unica cosa che posso fare, perché non ho il controllo degli host che gestiscono i siti web.
Inizialmente, pensavo di avere un paio di nodi, ognuno dei quali avrebbe il compito di monitorare un sottoinsieme dei siti web. Ogni nodo eseguirà un programma progettato in questo modo:
isServerUp(httpClient, url) {
time = Time.now()
try {
httpClient.get(url)
status = true
}
catch (e) {
status = false
}
// do some other stuff, like saving the
// status to a database.
}
websiteChecker(url) {
httpClient = HttpClient()
t = Thread(isServerUp, httpClient, url)
while (true) {
t.run()
sleep(60)
}
}
main() {
for (website in websiteList) {
t = Thread(websiteChecker, url)
t.run()
}
}
Fondamentalmente, il programma crea i thread "websiteChecker" per ogni sito web da controllare. Ognuno di questi thread "websiteChecker" genera un nuovo thread "isServerUp", che controlla se il sito web è attivo.
Tuttavia, tale architettura funzionerebbe a malapena, in quanto l'enorme numero di thread "websiteChecker" causerebbe un elevato consumo di memoria e un conflitto estremamente elevato di risorse.
Come posso progettare un'architettura che funzioni bene in questo scenario e sia anche scalabile?