Lieroes, а в те периоды времени, когда общей цели нет, прав становится ваш коллега. Методология нужна чтобы облегчить и ускорить процесс, а не для неуклонного соблюдения ритуалов. Ну, я так думаю.
Lieroes, в основе хорошей архитектуры лежат слабосвязанные компоненты, гибко реализующие абстракцию с единственной предельно узкой функцией. Если программист говорит "У нас есть подсистема, которую можно изменять только одним куском, а потому нельзя разбить на более мелкие части, чтобы уместить в спринт", то архитектура плохая.
Я вчера буквально приехал с CSM сертификации
Тогда вам стоит писать ответы, а не задавать вопросы.
Xaip, поздравляю, вы столкнулись с тем, что не все ответы одинаково полезны. Стоит pip периодически обновлять, но делается это под Windows выполнением команды python -mpip install -U pip, что описано в официальной документации.
Насколько мне известно, абсолютно все дистрибутивы Python под Windows имеют предустановленный pip. Зачем вы пытались выполнить easy_install install pip?
ericcartman, нет, я имел ввиду, что пример "Hello Websockets" на Netty - это три сотни строк java-кода с ручным управлением памятью и ручной установкой http-заголовков в ответе. Забыл освободить буфер - приложение завалится. Неправильно оформил библиотечный вызов - приложение повесится. Неправильно подсчитал размер буфера - приложение или повесится, или завалится, или разбудит Древних, в зависимости от положения звёзд и фазы луны.
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-файл архиватором и проверил, что манифест на месте и это именно тот манифест.