Non dovresti usare un contenitore, ma usa invece un framework senza contenitore come Play . Per quanto riguarda i tuoi punti:
Punto singolo di errore: questo è indipendente dalla distribuzione in a
contenitore o no. Dispongo solo un'istanza della tua app e questa
si blocca, è giù. Per la disponibilità elevata utilizzeresti più corse
istanze e bilanciamento del carico tra di loro, con contenitore o senza.
Numero elevato di connessioni simultanee: l'API servlet si basa su a
modello thread-per-request, ad esempio ogni richiesta occuperà un intero
filo. Questo può essere uno appena generato, o più probabilmente uno preso
da un pool di thread. Quindi il numero massimo di richieste simultanee è
determinato dalla dimensione del pool di thread del contenitore o dal numero di thread JVM
il tuo hardware può gestire bene. Quel numero probabilmente non è alto come
ti piacerebbe, dato che ogni thread del contenitore servlet occupa molto
memoria e il passaggio da un thread all'altro è relativamente costoso
operazione. Farai un uso migliore del tuo hardware con un asincrono
approccio, in cui ogni thread gestisce più richieste contemporaneamente, vale a dire
con un framework che non si basa sull'API Java Servlet EE.
Per ulteriori dettagli sull'approccio asincrono di Play ti consiglio: link
Forse prova l'app " Reactive Scales " per ottenere un'indicazione quante richieste / secondi gestisci su la tua macchina.
Un'elaborata vista del motivo per cui "Java Application Servers Are Dead" è fornita nel link