
Vladimir
19.06.2018
10:30:18

Alexey
19.06.2018
10:31:04

Тимур
19.06.2018
10:37:58

1337
19.06.2018
10:42:12
реактор тоже?

Google

Mikhail
19.06.2018
11:24:32

Тимур
19.06.2018
11:30:11

Mikhail
19.06.2018
11:30:45
асинхронный я и так могу сделать на колбеках
мне нужно свой кастомный инпутстрим прокинуть в библиотеку, которая будет его юзать как обычный блокирующий

Тимур
19.06.2018
11:31:48

Mikhail
19.06.2018
11:32:53
меня сейчас больше интересует производительность, чем красота

Vladimir
19.06.2018
11:33:08

Quantum Harmonizer
19.06.2018
11:35:21

Mikhail
19.06.2018
11:36:12
файберы кажется могут такое устроить

Quantum Harmonizer
19.06.2018
11:36:18
Нет адекватного способа вызвать suspend-функцию из не-suspend-функции, потому что последняя не умеет ни возвращать флаг суспенда, ни продолжать выполнение с произвольного места.

Vladimir
19.06.2018
11:37:16

Mikhail
19.06.2018
11:39:53
короче проще бросить всю затею с магией зеленых потоков

Тимур
19.06.2018
11:47:08

Google

Aleksandr
19.06.2018
12:01:25

Quantum Harmonizer
19.06.2018
12:03:03
может, форкнуть библиотеку и убрать из неё всю некрофилию с InputStream?
https://github.com/andrewoma/coroutine-jdbc

Mikhail
19.06.2018
12:10:03
xnio?
там есть что-то похожее?

Quantum Harmonizer
19.06.2018
12:11:19

Alexey
19.06.2018
12:12:03
И сожрёт 100500 * Xss оффхипа

Mikhail
19.06.2018
12:12:53

Quantum Harmonizer
19.06.2018
12:13:08
мб форкнуть JDBC?

Alexey
19.06.2018
12:20:56
Там же всё грозятся сделать асинхронный api в jdbc

Mikhail
19.06.2018
12:21:43
postgres

Alexey
19.06.2018
12:21:57
Для постгри и мускуля вроде написаны асинхронные драва на nio

Mikhail
19.06.2018
12:22:27

Alexey
19.06.2018
12:22:49
Вот что то есть на джавке https://github.com/alaisi/postgres-async-driver

Mikhail
19.06.2018
12:23:17
у вертекса есть шустренький драйвер постгреса
вот если там нетворк подменить на свой, то все будет зашибись
я не вижу особого смысла в асинхронности, если она выполняется в другом потоке

Google

Mikhail
19.06.2018
12:25:06
так же можно просто отдельный тред создать и юзать блокирующие вызовы

Alexey
19.06.2018
12:26:24
Ну по ресурсам это совсем не одно и тоже
Как ты собираешься в асинхронщины без смены потоков?

Mikhail
19.06.2018
12:28:40

Alexey
19.06.2018
12:29:04

Mikhail
19.06.2018
12:29:20
не обязательно

Наиль
19.06.2018
12:34:12
вот этот клиент немного щупал.
корни уходят в vertx , nio
https://github.com/reactiverse/reactive-pg-client
Сама обертка вроде не создает потоки

Mikhail
19.06.2018
12:34:49
А это не смена потока?
у меня есть nio, которое кидает эвенты на возможность чтения/записи в сокет, пришел реквест, я это прочитал, понял, что нужно сходить в базу, создал коннект в том же nio, кинул туда sql запрос, повесил колбек на ответ, ушел ждать эвентов в nio, получил эвент на чтение из базы, прочитал ответ, выполнил колбек и срендерил ответ, записал его в сокет изначального реквеста. Все в одном потоке
проблема только в блокирующем io на jdbc

Наиль
19.06.2018
12:35:47
а что с ней не так?

Mikhail
19.06.2018
12:36:38
ну если юзать ее без вертекса, то получается смена потока и никакого выйгрыша по производительности нет
у меня даже апдейты не работали, только чтение

Наиль
19.06.2018
12:37:37
там nio, поддерживает unix domain sockets если postgres и app на одной машине

Mikhail
19.06.2018
12:40:40
Это хорошо, но это довольно редкая ситуация, обычно база отдельно от приложения

Наиль
19.06.2018
12:41:25
даже если отдельно то там nio как ни крути

Quantum Harmonizer
19.06.2018
12:41:42
не излишне ли вообще поднимать СУБД в отдельном процессе, если всё на одной машине?

Mikhail
19.06.2018
12:43:21

Наиль
19.06.2018
12:45:02
либа не создает потоки. Правда со всеми этими асинхронными драйверами (эта либа не единственная) я только не понимаю как в конечном итоге идет взаимодействие с postgres.
postgres построен на процессах и shared memory, каждое соединение - это процесс. если вы создаете пул соединений к бд - то это пул процессов. в каждом процессе своя нить.
Даже если в нашем приложении 1 поток, то в итоге все равно же будет переключение контекста

Google

Vladimir
19.06.2018
12:46:35
А большой ли вообще смысл в асинхронном IO с СУБД, если сама СУБД может выполнять параллельно весьма ограниченное количество запросов?

Mikhail
19.06.2018
12:47:14

Наиль
19.06.2018
12:47:59

Vladimir
19.06.2018
12:49:33

dimiii
19.06.2018
12:52:15


Наиль
19.06.2018
13:06:38
поправьте, если ошибаюсь, это то как я понимаю:
В чем отличие jdbc от асинхронных драйверов в разрезе обсуждаемой темы.
Если у вас app написан в блокирующем стиле, блокирующее io, например спринг и другие,
то у вас поток на коннекшен есть, потом таска шедулится в поток пула, потом шедулится в процесс постгры. и обратно ответ идет также.
Если у вас app написан в асинхронном стиле, технологии базирующиеся на nio - netty / jetty и прочие, соответственно тот же spring 5 webflux или KTOR, то минус поток на обработку коннекшена.
Если и пул потоков будет асинхронным как в этой библиотеке, то еще минус 1 переключение контекста.
Вот есть ли выигрыш в переключениях контекста, я не уверен. Так как синхронное io все равно производительней.
Поэтому мне кажется, что решение использовать jdbc в пуле потоков или использовать асинхронные драйвера не будет базироваться на производительности из-за отсутствия переключения контекстов - скорее всего это не играет роли. Но например при использовании ktor c корутинами очень удобно было асинхронное API завернуть в suspend функцию. Это можно сделать и с синхронным jdbc + пул потоков.


Quantum Harmonizer
19.06.2018
13:07:59
поправьте, если ошибаюсь, это то как я понимаю:
В чем отличие jdbc от асинхронных драйверов в разрезе обсуждаемой темы.
Если у вас app написан в блокирующем стиле, блокирующее io, например спринг и другие,
то у вас поток на коннекшен есть, потом таска шедулится в поток пула, потом шедулится в процесс постгры. и обратно ответ идет также.
Если у вас app написан в асинхронном стиле, технологии базирующиеся на nio - netty / jetty и прочие, соответственно тот же spring 5 webflux или KTOR, то минус поток на обработку коннекшена.
Если и пул потоков будет асинхронным как в этой библиотеке, то еще минус 1 переключение контекста.
Вот есть ли выигрыш в переключениях контекста, я не уверен. Так как синхронное io все равно производительней.
Поэтому мне кажется, что решение использовать jdbc в пуле потоков или использовать асинхронные драйвера не будет базироваться на производительности из-за отсутствия переключения контекстов - скорее всего это не играет роли. Но например при использовании ktor c корутинами очень удобно было асинхронное API завернуть в suspend функцию. Это можно сделать и с синхронным jdbc + пул потоков.
> синхронное io все равно производительней
эмм, это где так и почему?


Наиль
19.06.2018
13:13:34
статьи были где сравнивалось nio и io.
суть была в том, что io проценотов на 15 - 20 производительней. Сейчас поищу

Quantum Harmonizer
19.06.2018
13:15:46
nio 1 из 1.4 или 2 из 1.7?

Наиль
19.06.2018
13:19:05
вроде сравнивали последние версии.
и к слову, речь шла именно не о кейсе, когда
сотни тысяч клиентов маленькие реквесты шлют и ждут - это как раз кейс для nio
а пересылка больших обьемов данных была.
Вообще, эта тема вроде как холиварная) из-за непонимания акцента, на котором делают бенчмарк те или иные тестеры. Ведь как это свеженький nio может быть медленней древнего io? )) (ссылку все еще ищу)

1337
19.06.2018
13:22:18
в io без бутылки не разобраться
так сходу и не напишешь банальное считывание строк с файла

Vladimir
19.06.2018
13:23:03


Наиль
19.06.2018
13:23:03
поправьте, если ошибаюсь, это то как я понимаю:
В чем отличие jdbc от асинхронных драйверов в разрезе обсуждаемой темы.
Если у вас app написан в блокирующем стиле, блокирующее io, например спринг и другие,
то у вас поток на коннекшен есть, потом таска шедулится в поток пула, потом шедулится в процесс постгры. и обратно ответ идет также.
Если у вас app написан в асинхронном стиле, технологии базирующиеся на nio - netty / jetty и прочие, соответственно тот же spring 5 webflux или KTOR, то минус поток на обработку коннекшена.
Если и пул потоков будет асинхронным как в этой библиотеке, то еще минус 1 переключение контекста.
Вот есть ли выигрыш в переключениях контекста, я не уверен. Так как синхронное io все равно производительней.
Поэтому мне кажется, что решение использовать jdbc в пуле потоков или использовать асинхронные драйвера не будет базироваться на производительности из-за отсутствия переключения контекстов - скорее всего это не играет роли. Но например при использовании ktor c корутинами очень удобно было асинхронное API завернуть в suspend функцию. Это можно сделать и с синхронным jdbc + пул потоков.
кроме nio vs io других отклонений от общего понимания как все работает нет?


Mikhail
19.06.2018
13:31:27

Наиль
19.06.2018
13:41:11
не нашел ссылку что-то. Но суть была в том, что сложность nio, которая открывает новые возможности, оборачивается ей шудшей производительностью, в отличие от кондового и простого механизма блокирующего io.
Но ладно, эта тема не точная, какие-то отголоски этих мыслей только глубоко на форумах можно найти.
Для кейса когда вебсервер обслуживает много клиентов nio - это лучшее решение.

Alexey
19.06.2018
13:43:14
Это было конкретно про потоковое чтение
Что если у тебя есть готовый стрим, то его быстрее вычитать через io чем через колбеки с nio

Google

Mikhail
19.06.2018
13:53:46

Alexey
19.06.2018
13:54:33
Быстрее в плане по времени исполнения

Mikhail
19.06.2018
13:57:08
реквестирую бенчмарки

Vhäldemar
19.06.2018
13:58:43
https://github.com/romromov/java-io-benchmark

Mikhail
19.06.2018
14:16:39
ну и, nio быстрее на буфере в 8кб, но медленнее на буфере в 1кб
серьезно, 1кб буфера? я меньше 16 нигде не юзаю

Vhäldemar
19.06.2018
14:18:20
без "ну и"
просто результат

Alexander
19.06.2018
15:43:58
Там вся разница в буферизации и в том, сколько раз память дергается. nio тратить больше времени на один дерг, но при этом меньше на выкачивание большого буфера, так как он в общем случае аллоцируется вне кучи. Поэтому nio выигрывает на больших блоках данных, а io показывает лучшие результаты на коротких сообщениях.