ericcartman, реактивное программирование - это парадигма, то как ты пишешь код, а не как устроены фреймворки. Можно и сервлеты писать в реактивном стиле.
Netty и Vert.x - асинхронные фреймворки, в них вместо пула потоков, выполняющих блокирующиеся операции, используется один поток, который постоянно крутит цикл событий, в котором выполняются неблокирующиеся операции.
Обычно, весь серверный код пишется или синхронным на сервлетах или асинхронным на Netty, без дружбы. Изредка основная логика пишется на сервлетах, а Netty обрабатывает только websocket-соединения. У меня в таком случае синхронный и асинхронный код обменивались данными через очередь.
У Spring'а есть MVC, который работает поверх сервлетов, и есть WebFlux, который работает поверх Netty. Два отдельных мира.
ericcartman, асинхронные сервлеты - это просто способ переложить нагрузку с одного пула потоков на другой. Может быть решением в случаях когда долгоживущих соединений 100, но принципиально ничего не меняет и завалит сервер на 1000 соединений.
Jetty и Undertow - такие же web-контейнеры, как Tomcat. А вот Netty и Vert.x работают на других принципах и способны обрабатывать 10 000 и более одновременных соединений, но за счёт увеличения сложности.
ericcartman, и тут мы переходим от обсуждения сервлетов к обсуждению протокола http. Этот протокол проектировался под взаимодействие в режиме вопрос-ответ без сохранения состояния. Так его желательно и использовать. Клиент отправил запрос с тяжёлой задачей, получит ответ о том, что задача принята, а при следующем запросе может получить состояние выполнения или результат выполнения, но ожидать ответа без разрыва соединение не должен. Если же всё-таки необходимо взаимодействие с клиентом режиме реального времени, то можно использовать websocket'ы, но для них лучше подойдёт какой-нибудь асинхронный фреймворк, типа Netty или Vert.x.
Богдан, кодов http хватает для описания любой ситуации. Документ/пользователь не найден - это 404. Ошибка валидации - это 400 или 422. Что касается мультиязычности, во-первых, никто не мешает передавать в json-ответе дополнительный код ошибки, конкретный для данного приложения, во-вторых, бэкенду желательно тоже быть мультиязычным, учитывать заголовок Accept-Language и отдавать текст ошибки на соответствующем языке.
Да, но значение в поле должно быть потокобезопасным или последствия будут ужасными.
Надо очень постараться, чтобы написать запрос, который может привести к истощению пула, но такое возможно. Обычно такую проблему решают отправкой тяжёлых заданий в очередь, из которой другой процесс (возможно даже на другом сервере) выбирает задания и выполняет.
artshelom, если Main-Class в манифесте прописан, но java выдаёт ошибку "Could not find or load main class", то я бы открыл jar-файл архиватором и проверил, что манифест на месте и это именно тот манифест.
DmitryPros, была когда-то библиотека Hibernate Shards, но она давно заброшена и не работает с современными версиями Hibernate. Зачем вам это? Вы уверены, что нельзя задачу решить каким-то другим способом, кроме дополнительных таблиц?
Netty и Vert.x - асинхронные фреймворки, в них вместо пула потоков, выполняющих блокирующиеся операции, используется один поток, который постоянно крутит цикл событий, в котором выполняются неблокирующиеся операции.
Обычно, весь серверный код пишется или синхронным на сервлетах или асинхронным на Netty, без дружбы. Изредка основная логика пишется на сервлетах, а Netty обрабатывает только websocket-соединения. У меня в таком случае синхронный и асинхронный код обменивались данными через очередь.
У Spring'а есть MVC, который работает поверх сервлетов, и есть WebFlux, который работает поверх Netty. Два отдельных мира.