LINUX.ORG.RU

Простой неблокирующий HTTP-стек для Java

 , , ,


0

2

Есть ли такой в природе? В первую очередь интересен Android. Вроде nio есть, то бишь неблокирующий код можно писать, но популярная библиотека Volley держит пул потоков (ещё и довольно маленький) для каждого запроса. В том числе DNS, я так понимаю, он по дефолту в жаве блокирует поток, поэтому нужна альтернативная реализация. Какая-то странная ситуация выходит. Ладно серверы, там гонять потоки не проблема, а в мобильном приложении во-первых неблокирующий АПИ позволит убрать всю синхронизацию, т.к. всё будет в одном потоке, во-вторых там же вроде как в принципе должны все экономить циклы, а тут пускаем кучу потоков, жрём память, не нужно ведь всё это. Интересует и сервер и клиент (HTTP везде примерно одинаковый, поэтому по идее разницы большой не должно быть).

★★★★★

Последнее исправление: Legioner (всего исправлений: 1)

а тут пускаем кучу потоков, жрём память
Интересует и сервер

Представляем сервер работающий с реляционной базой, использован connection pool который держит 20 соединений с DB на готове для параллельного исполнения запросов. В случае синхронного сервер 1000 запросов породят 1000 потоков, 20 из них захватят по коннекшену и будут ожидать I/O, оставшиеся 980 будут ожидать разделяемого ресурса т.е. коннекшена с базой данных.

Асинхронный подход: 1 поток обрабатывает входящие соединения, 20 потоков весят с I/O wating. Итого 21 поток на обработку 1000 запросов.

Aber ★★★★★
()
Последнее исправление: Aber (всего исправлений: 1)

Странно слышать от тебя такой вопрос. Чем не устраивает 5-й реактивный спринг на nio контейнерах?

bytecode ★★
()
Ответ на: комментарий от bytecode

В первую очередь интересен Android.

Чем не устраивает 5-й реактивный спринг на nio контейнерах?

/0

Спринг на андроиде? Серьезно?

Deleted
()
Ответ на: комментарий от Deleted

Spring webflux использует Reactor, Reactor похож на RxJava, только последний не умеет ламбды т.к. заточен под андроид, где лямб на старые дроиды не завезли. Это мое поверхностное понимание.

Aber ★★★★★
()
Ответ на: комментарий от Aber

Асинхронный подход: 1 поток обрабатывает всё, никто не висит с I/O waiting :) Правда если перестанет хватать одного потока, то станет сложней, но популярность ноды говорит, что это не такая уж серьёзная проблема.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от bytecode

Расскажи, где в спринге реализован асинхронный DNS? Как мне узнать IP-адрес linux.org.ru не блокируя поток и не запуская дополнительных потоков.

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 1)

там же вроде как в принципе должны все экономить циклы

Экономить циклы нужно разве что на микроконтроллерах. Или в сильно вложенных циклах (pun unintended).

anonymous
()

Ты определись, тебе нужен именно http под андроид или весь сетевой стек. Потому что классический dns как бы не поверх http работает, вот dns-over-http да, работает поверх http.

А так разве retrofit2 и okhttp недостаточно?

ma1uta ★★★
()
Ответ на: комментарий от Legioner

Так я вроде сказал пример как использовать асинхронность если стыковаться с блокирующими api типа jdbc в которую асинхронность не завезли.

Aber ★★★★★
()

Почему бы для этой задачи не взять Go?

nikolnik ★★★
()
Ответ на: комментарий от ma1uta

Ты определись, тебе нужен именно http под андроид или весь сетевой стек. Потому что классический dns как бы не поверх http работает, вот dns-over-http да, работает поверх http.

Мне нужно делать HTTP-запросы без блокировки. В реальном мире HTTP-запрос подразумевает DNS-разрешение, поэтому DNS это часть любого HTTP-стека, что ты прекрасно увидишь в любом адекватном API: ты туда можешь передавать имя сервера, а не только IP-адрес (честно говоря я даже уверен, что в подавляющем большинстве API ты IP и не сможешь передать отдельно от Host).

А так разве retrofit2 и okhttp недостаточно?

Так - мне и HttpUrlConnection или обёртки над ним в виде Volley достаточно. Но удивляет сам факт. Ладно бы в андроиде API было неполноценное, так нет, поддерживается там nio которое через select или poll будет работать, который в линуксе с бородатых годов прекрасно поддерживается. Зачем на крошечном телефончике пускать кучу потоков и городить кучу синхронизаций и межпоточных взаимодейтсвий, если можно было бы обойтись без этого.

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Shevchik

Netty это Фреймворк для протоколов. Рабочий вариант, но хочется попроще чего-то, без абстракций над абстракциями. Просто реализующий HTTP/1.0 без лишних свистелок. Мегабайты жарок у нетти это многовато для такого простого протокола.

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Deleted

А, нет. Извиняюсь, «тред не читай @ сразу отвечай».

bytecode ★★
()
Ответ на: комментарий от Legioner

не блокируя поток и не запуская дополнительных потоков

Перекидывая исполнение на другой поток, запустивший его поток всё-равно остается заблокированным в большинстве реализаций. Но да, ты это знаешь, а я зачем-то к словам придираюсь.
Действительно, про асинхронный DNS мне сказать нечего. Я в принципе с трудом представляю, как это может работать. Если только твой http клиент не будет нести свою реализацию для резолвинга доменов.
Без троллинга, мне правда интересно, ты же не just for fun интересуешься? Занимаешься микрооптимизациями, или что ты такое интересное пилишь?

bytecode ★★
()
Ответ на: комментарий от Legioner

Напишите сами, сколько там того http протокола, день два за кодингом
Вместо словоблудия на лоре

anonymous
()
Ответ на: комментарий от bytecode

А что тут представлять? Обычный юдп запрос ответ через неблокирующие вызовы. Днс это же обычный протокол. Хз как вытащить серверы, которых спрашивать, видимо тут будет платформозависимый код, но это мелочи. Интересуюсь, потому что искренне не понимаю, почему так сделали (точней не сделали). Причём в новой платформе, которая вроде как могла выкинуть старый мусор.

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

На гитхабе смотрел https://github.com/search?q=asyn http ? Вот, мне сразу выдало https://github.com/loopj/android-async-http Вроде даже HTTP запросы асинхронные, про DNS не знаю.

Ой, это HTTP клиент... Но вот дальше https://github.com/koush/AndroidAsync вроде оно.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 2)
Ответ на: комментарий от ma1uta

Вместо netty можно взять undertow, у которого есть http/1.1, http/2 и вебсокеты.

Для андроида думаю оверхед (а он там работает?), хотя я его в Pine64 с 1ГБ памяти планирую внедрять для петпроекта. А самсунг смарты с 12 ГБ рам поставляет и ядренный наверное на все 100500... Но это не нормально.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от foror

Первая ссылка - совсем не то.

An asynchronous, callback-based Http client for Android built on top of Apache's HttpClient libraries.
HTTP requests happen outside the UI thread
Requests use a threadpool to cap concurrent resource usage

Тот же Volley, только ещё хуже. А вот AndroidAsync надо посмотреть, спасибо.

Legioner ★★★★★
() автор топика

А апачевскую MINA смотрел? Там вроде есть http-кодек из коробки.
Правда я им не пользовался.

WatchCat ★★★★★
()
Ответ на: комментарий от WatchCat

Вот MINA не советую, у них большая проблема с разработчиками (считай их там нет), поэтому развитие там практически некакого. И она более высокоуровневая, чем тот же netty.

ma1uta ★★★
()
Ответ на: комментарий от ma1uta

поэтому развитие там практически некакого

Ну судя по мейл-листу жизнь теплится.

И она более высокоуровневая, чем тот же netty.

Так это как я понял и надо. Человек не хочет самостоятельно реализовывать http поверх netty.

WatchCat ★★★★★
()
Ответ на: комментарий от foror

https://github.com/koush/AndroidAsync вроде оно.

В общем хорошо подумав я пришёл к выводу, что прям как я хочу, без поддержки разработчиков андроида видимо не сделать. Потому что мне надо вмешиваться в главный цикл и в нём постоянно проверять состояние сокетов. Если я просто буду это крутить нон-стопом, то это просто будет глупая нагрузка на CPU. Если я буду это постить с таймером (если вообще такое есть в андроиде), то соединения будут подлагивать как раз на задержку этого таймера, что не есть идеально. Единственный адекватный вариант это таки пускать второй поток и в нём уже крутить свой цикл по Selector-у. Собственно так этот AndroidAsync и работает. Пожалуй единственная существенная претензия к нему - он заточен под андроид. Если я захочу использовать общий код на сервере и на телефоне, это может быть затруднительно. Но это мелочи.

PS а где можно посмотреть реализацию этого самого главного цикла андроида? Может туда таки можно влезть как-нибудь?

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 1)

можешь мой jweblib допилить

InterVi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.