Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Асинхронное выполнение запросов / 25 сообщений из 39, страница 1 из 2
12.11.2021, 17:04
    #40111429
Щиче
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Добрый день.

Конструкция: Spring Java-backend + React Front. Фронт трогать нельзя.

Фронт постоянно долбит бэк REST (JAX-RS) запросом. По заданию, которое изменять нельзя, бэк немедленно отдает данные, если они есть. Если нет, то надо 20 секунд держать запрос в подвешенном состоянии.

При стандартном подходе, нить сервера висит 20 секунд ничего полезного не делая. Про производительность в сотни пользователей можно забыть.

Вопрос. Как все-таки возможно подержать запрос в 20 секунд, но при этом не блокировать нить бессмысленной работой? Это вообще возможно?
...
Рейтинг: 0 / 0
12.11.2021, 17:43
    #40111456
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче,
Дикость какая то. У бэка нет данных но я все равно стою за дверью 20 сек?
...
Рейтинг: 0 / 0
12.11.2021, 18:18
    #40111468
Щиче
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
PetroNotC Sharp, это кровавый энтерпрайз. Когда одна команда осчастливила нас этим неработающим решением и устранилась, другая команда пилит фронт и сообщает, что нельзя поменять не поменяв его целиком, а третья сидит и думает как ей дорабатывать напильником вещь.

Если б это было не дикостью, все можно было нагуглить в учебниках.
...
Рейтинг: 0 / 0
12.11.2021, 18:25
    #40111473
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче,
Причем команда?
Я логику и код не понял.
Если бд тормозит 20 сек, то так и надо писать.
А не как аы написали.
Что значит "постоянно долбит запросами"?
Так инженеры не говорят.
...
Рейтинг: 0 / 0
12.11.2021, 18:33
    #40111477
Щиче
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
PetroNotC Sharp
Щиче,
Я логику и код не понял.
Если бд тормозит 20 сек, то так и надо писать.


БД не тормозит! Ответ, если есть данные - выстреливает мгновенно. А если их нет (это тоже определяется мгновенно) - надо двадцать секунд намеренно растягивать обработку запроса.

PetroNotC Sharp

Что значит "постоянно долбит запросами"?
Так инженеры не говорят.


Так и понимать. Запрос отработан - БЕЗ ПАУЗЫ идет другой, аналогичный. Фронт будет спамить сервер запросами насколько хватит ему производительности сети. Именно поэтому сервер растягивает время ответа. Фронт трогать нельзя, WebSocket применить нельзя.

Инженеры говорят и матом, если ситуация такая.
...
Рейтинг: 0 / 0
12.11.2021, 18:35
    #40111478
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче
надо двадцать секунд намеренно растягивать обработку запроса.
зачем? Или что будет если я сразу отдал http 200? 404?
...
Рейтинг: 0 / 0
12.11.2021, 18:37
    #40111479
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче
Именно поэтому сервер растягивает время ответа.
нет.
Есои ответ равен 0,1 сек, то серверу легче сразу отвечать на любой запрос.
...
Рейтинг: 0 / 0
12.11.2021, 18:38
    #40111480
Щиче
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
PetroNotC Sharp
Щиче
надо двадцать секунд намеренно растягивать обработку запроса.
зачем? Или что будет если я сразу отдал http 200? 404?


Неважно что вы отдадите. Фронт ещё раз попытается выполнить запрос снова. 404 вызовет вывод пользователю ошибки, как любой ответ не 200. Будет 1000 ошибок в секунду. С кодом 200 ошибок не будет, а будет тихое заспамливание бэка.
...
Рейтинг: 0 / 0
12.11.2021, 18:39
    #40111481
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче,
Давай юз кейс на три ОСМЫСЛЕННЫХ запроса
...
Рейтинг: 0 / 0
12.11.2021, 18:40
    #40111484
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче
будет тихое заспамливание бэка.
при какой нагрузке ЭТО проявляется и как КОНКРЕТНО?
...
Рейтинг: 0 / 0
12.11.2021, 18:42
    #40111485
Щиче
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
PetroNotC Sharp
Щиче,
Давай юз кейс на три ОСМЫСЛЕННЫХ запроса


POST запрос с параметром HTTP.

1) Запрос с данными. JSON со списком событий. События представляют собой сериализованные JAVA объекты. Их там максимум штук 5.
2) Запрос без данных - JSON с пустым списком.

Случаев только два. Ошибки не предусмотрены.
...
Рейтинг: 0 / 0
12.11.2021, 18:48
    #40111487
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче,

Запрос без данных не нужен.
Юзкейс это действия какие то. А не то что вы написали.
Зачем клиенту 100 запросов в сек с событиями? Что за события?
...
Рейтинг: 0 / 0
12.11.2021, 18:53
    #40111493
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче,
Заспамить сервер очень трудно. Вы не доказали что это произошло.
Если заспамили, то сервер начнет тормозить (термин ддосить). Но вы выше говорите что "сервер не тормозит!".
Пока ниче не понятно.
Может цифры будут?
...
Рейтинг: 0 / 0
12.11.2021, 18:56
    #40111495
Щиче
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
PetroNotC Sharp
Щиче,

Запрос без данных не нужен.
Юзкейс это действия какие то. А не то что вы написали.
Зачем клиенту 100 запросов в сек с событиями? Что за события?


А вам зачем конкретные данные? Вопрос был не об этом. Вопрос был о том, как не занимать серверную нить работой, которой все равно нет и при этом заставить фронт ждать ответ определенное время.

Это чат. Серверу по Кафке приходит сообщение: сотруднику call-центра пришло сообщение от клиента. Сервер кладет его в очередь и отдает сразу как фронт попросил. Очередь очищается. Пустая очередь - пустой список в ответе. Нормальный чат делается на WebSocket, но нам что дали.
...
Рейтинг: 0 / 0
12.11.2021, 19:08
    #40111500
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче
Как все-таки возможно подержать запрос в 20 секунд, но при этом не блокировать нить бессмысленной работой?
java.lang.Thread ?
Код: sql
1.
2.
3.
4.
try {
  java.lang.Thread.currentThread().join(20*1000);
}
finaly {};

Компилируемость не проверял.
P.S.
Что за странная проблема в "придержать поток на 20 секунд при сотнях пользователей"?
А если у вас будут реальные вычисления на двадцать секунд и для сотен пользователей? Вешаться?
...
Рейтинг: 0 / 0
12.11.2021, 19:15
    #40111502
Щиче
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Basil A. Sidorov
Щиче
Как все-таки возможно подержать запрос в 20 секунд, но при этом не блокировать нить бессмысленной работой?
java.lang.Thread ?
Код: sql
1.
2.
3.
4.
try {
  java.lang.Thread.currentThread().join(20*1000);
}
finaly {};

Компилируемость не проверял.
P.S.
Что за странная проблема в "придержать поток на 20 секунд при сотнях пользователей"?
А если у вас будут реальные вычисления на двадцать секунд и для сотен пользователей? Вешаться?


Вот я и не хочу держать поток, но ответ фронту дать через 20 секунд спустя реальной отработки запроса.
...
Рейтинг: 0 / 0
12.11.2021, 19:16
    #40111503
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче
Это чат.
))))))
Ну наконец то. Раскололся.
))))
...
Рейтинг: 0 / 0
12.11.2021, 19:18
    #40111504
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче
Нормальный чат делается на WebSocket, но нам что дали.
дальше вы с вадей))
...
Рейтинг: 0 / 0
12.11.2021, 19:18
    #40111505
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче
Серверу по Кафке приходит сообщение: сотруднику call-центра пришло сообщение от клиента. Сервер кладет его в очередь и отдает сразу как фронт попросил. Очередь очищается. Пустая очередь - пустой список в ответе.
Можно сделать асинхронный сервлет, где в отдельную очередь будут помещаться HTTP-отклики принятых HTTP-запросов.
Тогда можно будет или отдавать список или возвращать отклик-неудачник обратно в очередь и "мариновать" его там нужное время.
...
Рейтинг: 0 / 0
12.11.2021, 19:21
    #40111507
Щиче
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Basil A. Sidorov
Щиче
Серверу по Кафке приходит сообщение: сотруднику call-центра пришло сообщение от клиента. Сервер кладет его в очередь и отдает сразу как фронт попросил. Очередь очищается. Пустая очередь - пустой список в ответе.
Можно сделать асинхронный сервлет, где в отдельную очередь будут помещаться HTTP-отклики принятых HTTP-запросов.
Тогда можно будет или отдавать список или возвращать отклик-неудачник обратно в очередь и "мариновать" его там нужное время.


Можно подробнее, как его там "мариновать нужное время" не останавливая поток?
...
Рейтинг: 0 / 0
12.11.2021, 19:21
    #40111508
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче

Конструкция: Spring Java-backend + React Front. Фронт трогать нельзя.

Фронт постоянно долбит бэк REST (JAX-RS) запросом. По заданию, которое изменять нельзя, бэк немедленно отдает данные, если они есть. Если нет, то надо 20 секунд держать запрос в подвешенном состоянии.

При стандартном подходе, нить сервера висит 20 секунд ничего полезного не делая. Про производительность в сотни пользователей можно забыть.

Вопрос. Как все-таки возможно подержать запрос в 20 секунд, но при этом не блокировать нить бессмысленной работой? Это вообще возможно?

Напоминает троттлинг. Тут по смыслу долбящего фронта надо уведомлять статусом типа
https://developer.mozilla.org/ru/docs/Web/HTTP/Status/429

Ну и фронт, как хороший лапочка-зайчик должен подождать нужное время Retry-After : x seconds.
Это-ж правильный http-клиент? Не?

И на бэке не надо делать пауз а наоборот как можно быстрее "отпустить" управление.
...
Рейтинг: 0 / 0
12.11.2021, 19:21
    #40111509
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче
как не занимать серверную нить работой
в последней версии бут пилят webFlux.
Но для чата... Не знаю...
...
Рейтинг: 0 / 0
12.11.2021, 19:27
    #40111511
Щиче
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
mayton

Напоминает троттлинг. Тут по смыслу долбящего фронта надо уведомлять статусом типа
https://developer.mozilla.org/ru/docs/Web/HTTP/Status/429

Ну и фронт, как хороший лапочка-зайчик должен подождать нужное время Retry-After : x seconds.
Это-ж правильный http-клиент? Не?

И на бэке не надо делать пауз а наоборот как можно быстрее "отпустить" управление.


Не знаю насчет правильности. У нас иной раз такая прям высокотехнологичная компания, а иной раз настолько вопиющие ошибки.

Надо попробовать. Спасибо.
...
Рейтинг: 0 / 0
12.11.2021, 19:46
    #40111513
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче
Можно подробнее, как его там "мариновать нужное время" не останавливая поток?
Есть FIFO-очередь, в которой находятся объекты, содержащие данные о времени поступления запроса, об инициаторе запроса и ServletResponce, в который надо записать ответ. Эти объекты формирует и помещает в очередь (ваш) обработчик POST-запроса в (вашем) сервлете.
Эту очередь разгребают "совсем отдельные" потоки.
Если для конкретного запроса есть данные - возвращаем их клиенту.
Если данных нет - возвращаем объект обратно в очередь. Для FIFO-очереди это будет "в конец очереди".
Если на очередной итерации обнаруживается, что с момента поступления запроса прошло больше заданного интервала ожидания, а данных всё ещё нет - возвращаем пустой список в качестве ответа.
...
Рейтинг: 0 / 0
12.11.2021, 19:51
    #40111517
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронное выполнение запросов
Щиче

При стандартном подходе, нить сервера висит 20 секунд ничего полезного не делая.

Нитей жалко? Добавте.

Щиче

в сотни пользователей

сотня потоков на современной сервере - ни о чем

вот уже сотни и тысячи (или десяток докеров по сотне потоков на каждом) - уже кранты хостовой (в случае докера) ОС с переключением потоков. Можно смотреть в сторону NIO.

Правда NIO на 10-20% МЕДЛЕННЕЕ (и это правда!) классических сокетов. Но позволяет уменьшить количество потоков, снять нагрузку с диспетчера потоков ОС. Возможно, в качестве алтернативы NIO, при возможности "порезать" задачу, можно использовать нормальный софт для виртуализации и вместо тысячь потоков иметь десяток VM по сотне-тысячи потоков в отдельной VM. Но это теоретически ))). Практически, все вместо нормальных решений используют новомодные из гуана и палок (типа докера) и дохера потоков грузят диспетчер хостовой OS. В этом случае AFAIK без NIO уже сложно. Но повторюсь, это в случае тысячь потоков (в реальном проекте стали мигрировать на NIO при более 6-8 тысячь потоков на хостовой машине) и скорости это НЕ добавляет. Даже, повторюсь, NIO медленнее на 10-20%.

AFAIK
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Асинхронное выполнение запросов / 25 сообщений из 39, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]