Oczywiście każdy z tych problemów da się rozwiązać ale to jest cały czas łatanie dziur w systemie. Czy znacie może jakieś rozwiązania, inne jezyki/platformy które potrafiły by określić np:
- Maksymalna ilość pamięci dla żądania, po przekroczeniu np 20MB rzucany jest wyjątek ze więcej nie da się zaalokować rollback, cleanup itp.
na JVM?
To w zasadzie nie do wykonania. Samą zajętość pamięci możesz ale w przybliżeniu możesz skorzystać z ThreadMXBean.getThreadAllocatedBytes(long id).
Potem to podpiąć na jakimś filtrze (jeśli korzystasz z java servlet) i sprawdzać jakiś "watchdogiem"...
Ale nie zablokujesz allokacji ani nie przerwiesz wątku.
- Timeout dla żądania, to samo, jeżeli operacja zaczyna przekraczać timeout to leci wyjątek
http://stackoverflow.com/questions/7145131/tomcat-request-timeout
I pies jest pogrzebany w:
" there is no reliable way of stopping a thread in Java without the cooperation of that thread..."
Te parametry urchroniły by przed wszystkimi powyższymi problemami
Jak widać niestety nie.
To co można to ubijanie całych procesów/ serwerów i tu
rozwiązaniem w ogołnosci jest np. odpowiedni cluster. Startujesz sobie instancje na żadanie, zakleszczone ubijasz, masz pingi itp. Tu jest pytanie na ile twoja aplikacja da się pod coś takiego podpiąć. (Czy tez wszystko czy trzeba przepisac od nowa).
Możesz zobaczyć jak działa akka-cluster: https://vimeo.com/185781733