Poiché la CPU è limitata, è necessario mettere le mani su 150 core CPU, uno per ogni thread. Questo esclude un singolo server, dal momento che un server di tali proporzioni sarebbe eccessivamente costoso - e non ne hai davvero bisogno.
La tua architettura generale con un frontend comune che distribuisce il lavoro a più lavoratori e combina i loro risultati sembra essere ragionevole. Dovrai fare alcuni calcoli per trovare la soluzione più economica per ottenere molte CPU. Ciò tende a puntare su AWS Lambda in quanto richiede solo calcoli a raffica, ma potrebbe venire con restrizioni. Quanti Lambdas possono eseguire contemporaneamente? 150 allo stesso tempo è molto. Quali lingue puoi usare; puoi ridurre i costi utilizzando il codice nativo ottimizzato? Soprattutto, non penso che Amazon crei garanzie specifiche sulle prestazioni per quel prodotto, mentre tu hai più controllo sulla CPU fisica con tipi di istanze più tradizionali.
E le prestazioni effettive della CPU sono importanti per te. Mentre sei disposto a uccidere il calcolo dopo 5 secondi, la quantità di calcolo eseguita fino a quel momento potrebbe variare in modo selvaggio. Probabilmente riuscirai a ottenere 150 core in modo piuttosto economico eseguendo un cluster Beowulf di schede Raspberry Pi nella tua cantina, ma ciò non è da remoto paragonabile alla potenza di calcolo di cinque server Intel Xeon di fascia alta.
È quindi importante definire chiaramente gli obiettivi di rendimento e uno SLA e quindi testare una soluzione proposta. Dovrai anche pensare a richieste simultanee. Data l'elevata quantità di calcoli per richiesta del cliente, potrebbe essere meglio elaborare le richieste client in modo sequenziale se ciò è accettabile per i client. Ma questo mette anche un limite superiore ai client che puoi supportare, poiché la probabilità che un client debba attendere prima che la richiesta possa essere elaborata cresce piuttosto rapidamente (in relazione al paradosso del compleanno).
Questo è un problema di scalabilità. È possibile ritardare la pianificazione pianificando le richieste del client per evitare richieste simultanee o ottenere la capacità di gestire più richieste in parallelo. Questo a sua volta può essere gestito lanciando più denaro / server al problema, o tramite l'ottimizzazione delle prestazioni dell'algoritmo. Per esempio. Ho visto un caso in cui un programma Python potrebbe essere reso 3 × più veloce da ottimizzazioni guidate da profili come l'estrazione di un accesso di attributo di istanza da un ciclo molto stretto. Le maggiori vincite derivano sempre dalla riduzione della complessità algoritmica, se possibile.