async turtles all the way

Palych
Уже с Приветом
Posts: 13987
Joined: 16 Jan 2001 10:01

async turtles all the way

Post by Palych »

Что-то пробивает меня на вопросы космического масштаба...
На этот раз - в какой-то степени противоположность предыдущему вопросу

А есть ли в природе такие фреймвёрки класса Java Servlets, которые позволяют обрабатывать запросы исключительно асинхронно?
Чтобы вместо

Code: Select all

doThat(request, response);
было бы что-то типа:

Code: Select all

acceptRequest(request);
processResponse(response);
Т.е. чтобы код написанный на этой штуке вызывался отдельно для запроса и ответа, освобождая ресурсы (thread) на время ожидания ответа от следующего сервера в цепочке.
Но протоколы чтоб были синхронными, типа http (или "в основном синхронные")....
User avatar
geek7
Уже с Приветом
Posts: 20318
Joined: 01 Dec 2003 23:16
Location: Russia->USA

Re: async turtles all the way

Post by geek7 »

Дофига. популярный, на данный момент, async фреймворк - akka.
Что поверх - зависит от типа аппа. например для REST сервиса рекомендуют Spray (еще scalatra, unfiltered, да дофига их). для UI Play итд.

А вообще те-же Java Servlets которые 3.0 asynchronous. Гляньте

http://www.javaworld.com/article/207799 ... t-3-0.html
Говори что думаешь, думай что говоришь!
Маразм крепчал и скрепы гнулись
User avatar
crypto5
Уже с Приветом
Posts: 4637
Joined: 24 Oct 2009 01:38
Location: Chicago ;-) -> SFBA!

Re: async turtles all the way

Post by crypto5 »

У акка понятно нет servlet api, хороший вариант - https://grizzly.java.net/ или netty
In vino Veritas!
Palych
Уже с Приветом
Posts: 13987
Joined: 16 Jan 2001 10:01

Re: async turtles all the way

Post by Palych »

Спасибо, отцы!
Многое стало понятно: работа в этом направлении идёт.
С сайта гризли накопал ссылку на async-io
Получается что игроков довольно много пока, явного победителя и единого стандарта нету.
Но главное - в принципе это возможно.
Надо будет посмотреть что над этим нагородили...
User avatar
Интеррапт
Уже с Приветом
Posts: 17281
Joined: 07 Sep 2011 10:05
Location: Seattle, WA

Re: async turtles all the way

Post by Интеррапт »

Еще есть хороший и простой в использовании асинхронный фреймворк (не только для Джава, там много языков поддерживается) - http://vertx.io/
Работает поверх netty.
Palych
Уже с Приветом
Posts: 13987
Joined: 16 Jan 2001 10:01

Re: async turtles all the way

Post by Palych »

Хорошо, допустим сделали мы асинхронный сервер приложений.
А как там дела с асинхронными клиентами к базам данных?
Поддерживают ли сами базы асинхронное общение с клиентами?
(имеется в виду обычные запросы, не такие вещи как отслеживание изменений таблиц и проч.)
User avatar
crypto5
Уже с Приветом
Posts: 4637
Joined: 24 Oct 2009 01:38
Location: Chicago ;-) -> SFBA!

Re: async turtles all the way

Post by crypto5 »

Palych wrote:Хорошо, допустим сделали мы асинхронный сервер приложений.
А как там дела с асинхронными клиентами к базам данных?
Поддерживают ли сами базы асинхронное общение с клиентами?
(имеется в виду обычные запросы, не такие вещи как отслеживание изменений таблиц и проч.)
Какие как, некоторые поддерживают ))
In vino Veritas!
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: async turtles all the way

Post by helg »

В Spring есть Reactor - совершенно стандартный метод сделать что угодно асинхронным образом. В нём что http, что база, что сервер следующего уровня - всё исполняется без проблем.
User avatar
Интеррапт
Уже с Приветом
Posts: 17281
Joined: 07 Sep 2011 10:05
Location: Seattle, WA

Re: async turtles all the way

Post by Интеррапт »

helg wrote:В Spring есть Reactor - совершенно стандартный метод сделать что угодно асинхронным образом. В нём что http, что база, что сервер следующего уровня - всё исполняется без проблем.
Только при этом, если база данных не поддерживает асинхронные операции (всякие async commit и т.п.) с соответствующим асинхронным коннектором (драйвером), то все это просто будет исполнятся в отдельном потоке. Чудес не бывает.
Palych
Уже с Приветом
Posts: 13987
Joined: 16 Jan 2001 10:01

Re: async turtles all the way

Post by Palych »

Интеррапт wrote:
helg wrote:В Spring есть Reactor - совершенно стандартный метод сделать что угодно асинхронным образом. В нём что http, что база, что сервер следующего уровня - всё исполняется без проблем.
Только при этом, если база данных не поддерживает асинхронные операции (всякие async commit и т.п.) с соответствующим асинхронным коннектором (драйвером), то все это просто будет исполнятся в отдельном потоке. Чудес не бывает.
Это верно: тут как говорится: "одно неосторожное движение - и ты отец".
И ведь не просто поток выделится. Практически все удалённые сервисы будут иметь такой параметр как timeout. А это - ещё один поток...
Поэтому я и говорил о "чистоте расы"...
User avatar
Интеррапт
Уже с Приветом
Posts: 17281
Joined: 07 Sep 2011 10:05
Location: Seattle, WA

Re: async turtles all the way

Post by Интеррапт »

Palych wrote:Это верно: тут как говорится: "одно неосторожное движение - и ты отец".
И ведь не просто поток выделится. Практически все удалённые сервисы будут иметь такой параметр как timeout. А это - ещё один поток...
Поэтому я и говорил о "чистоте расы"...
Ну так многие базы данных таки поддерживают асинхронные операции. Тот-же PostgreSQL. Ну или MongoDB. Да много кто. Могут быть свои минусы, например для PostgreSQL в случае сбоя при async commit может произойти потеря данных (но не порча данных, т.е. база восстановится в работоспособном состоянии), но в большинстве случаев это не является проблемой. Еще ес-но нужно, чтобы драйвер / коннектор был под нужную платформу.
Palych
Уже с Приветом
Posts: 13987
Joined: 16 Jan 2001 10:01

Re: async turtles all the way

Post by Palych »

Интеррапт wrote: Могут быть свои минусы, например для PostgreSQL в случае сбоя при async commit может произойти потеря данных (но не порча данных, т.е. база восстановится в работоспособном состоянии).
Это особенность реализации асинхронных операций конкретно в PostgreSQL или вообще?
Насколько я разумею - в случае сбоя любого commit данные потеряются по определению...
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: async turtles all the way

Post by АццкоМото »

Palych wrote:Спасибо, отцы!
Palych wrote:тут как говорится: "одно неосторожное движение - и ты отец".
:oops:
Мат на форуме запрещен, блдж!
Palych
Уже с Приветом
Posts: 13987
Joined: 16 Jan 2001 10:01

Re: async turtles all the way

Post by Palych »

АццкоМото wrote:
Palych wrote:Спасибо, отцы!
Palych wrote:тут как говорится: "одно неосторожное движение - и ты отец".
:oops:
:ROFL: :good: :oops:
Palych
Уже с Приветом
Posts: 13987
Joined: 16 Jan 2001 10:01

Re: async turtles all the way

Post by Palych »

(Поднимаю старый топик)
В копилку асинхронных инструментов: Reactive Extensions
Сам не использовал, но прослушал лекцию на ACM - впечатлился. "Это такая брат лекция! Один раз послушаешь - и на всю жизнь!" (c)
К сожалению запись лекции еще не выложили, а главная мысль - Observables as Iterators и применение множественных операций к ним в описании отражена слабо...
User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Re: async turtles all the way

Post by Сабина »

Palych wrote:(Поднимаю старый топик)
В копилку асинхронных инструментов: Reactive Extensions
Сам не использовал, но прослушал лекцию на ACM - впечатлился. "Это такая брат лекция! Один раз послушаешь - и на всю жизнь!" (c)
К сожалению запись лекции еще не выложили, а главная мысль - Observables as Iterators и применение множественных операций к ним в описании отражена слабо...
Если там вам везде нужна аснихронность, то чего вы queue каких нибудь не насуете :) ?
https://www.youtube.com/watch?v=wOwblaKmyVw
Palych
Уже с Приветом
Posts: 13987
Joined: 16 Jan 2001 10:01

Re: async turtles all the way

Post by Palych »

Нарисовать очереди можно, но хотелось бы иметь абстракцию для асинхронных вычислений приближенную к традиционным вычислениям:

Code: Select all

try {
  doThis();
  if (itIs()) {
    doThat();
  } else {
    doSomethingElse();
  }
} catch(error) {
  handleError(error);
} finally {
  finishThat();
}
Чтобы не пришлось рисовать кучу переменных и хитрым образом изменять их значение только для того чтобы обеспечить выполнение алгоритма...
User avatar
Medium-rare
Уже с Приветом
Posts: 9239
Joined: 04 Mar 2011 03:04
Location: SFBA

Re: async turtles all the way

Post by Medium-rare »

Palych wrote:Нарисовать очереди можно, но хотелось бы иметь абстракцию для асинхронных вычислений приближенную к традиционным вычислениям:

Code: Select all

try {
  doThis();
  if (itIs()) {
    doThat();
  } else {
    doSomethingElse();
  }
} catch(error) {
  handleError(error);
} finally {
  finishThat();
}
Чтобы не пришлось рисовать кучу переменных и хитрым образом изменять их значение только для того чтобы обеспечить выполнение алгоритма...
Палыч, я подобное нарисовал на коленке для Qt-шного C++ проекта. Довольно просто, а адаптировать на разные платформы штуки вроде MS Parallel Patterns Library желания не было.

В вашем фрейморвке есть система обмена async-сообщениями? Если есть, половина дела сделана. Если нет, то очередь, блокировки, распознование, какому объекту предназначено сообщение, как подписчику, довольно банально. Паттерн (слово матершинное) publisher-subscriber, можно хоть центральный объект-диспатчер прикрутить.

doThat, doSomethingElse. No... make it AsyncDoThatTask->Perform() и AsyncDoSomethingElse->Perform(). You need to encapsulate the task and its continuation. Для прикладных целей вполне подойдёт завести некоторый класс AsyncTask, а в нём static Map<Signal, AsyncTask>. Ессно, в программе есть получатель async сообщений о завершении предыдущих действий, хоть один поток занят ловлей сообщений, или ещё как. Signal направляет на следующее действие. Абстрактный метод AsyncTask->Perform(p) может иметь параметр data нравящегося вам типа.

Finally() может быть абстрактным методом AsyncTask, обязательным для имплементации у каждого потомка класса?
HandleError() может быть абстрактным методом AsyncTask, с дефолтной имплементацией/обязательным для имплементации у каждого потомка класса?

Ну, и деталь имплементации, явно даём поток для AsyncTask или у нас есть в фреймворке поддержка task-based concurrency?
... and even then it's rare that you'll be going there...
Palych
Уже с Приветом
Posts: 13987
Joined: 16 Jan 2001 10:01

Re: async turtles all the way

Post by Palych »

Я тоже рисовал на коленке на Javascript.
В основе были задачи, которые зависят друг от друга: не выполнится пока не выполнятся все dependencies. Типа как в ant/make или (отдаленно) в prolog и проч.
Ошибки в зависимых задачах передаются тем кто их вызывает и останавливают выполнение на манер exceptions.
В целом оно работает, хотя в некоторых случаях стройность и однообразность нарушается. Ну и громоздко немного получилось...
А главное - Кумары творят с этим фреймворком чудеса. Чаще всего - начиная обходить те самые исключительные ситуации.
А тут послушал как оно сделано в Netflix: одна абстракция на клиенте (Javascript) и на сервере (Java).
Причем как раз покрывает такие вещи как "прерывание зависимостей", пропуск некоторых зависимостей при определенных условиях и проч.
Надо будет поковырять RXJS, хотя пока мне кажется что у нетфликса не совсем так...
reality
Уже с Приветом
Posts: 256
Joined: 14 Jul 2011 09:07
Location: SaintP -> NYC

Re: async turtles all the way

Post by reality »

Palych wrote:Нарисовать очереди можно, но хотелось бы иметь абстракцию для асинхронных вычислений приближенную к традиционным вычислениям:

Code: Select all

try {
  doThis();
  if (itIs()) {
    doThat();
  } else {
    doSomethingElse();
  }
} catch(error) {
  handleError(error);
} finally {
  finishThat();
}
Чтобы не пришлось рисовать кучу переменных и хитрым образом изменять их значение только для того чтобы обеспечить выполнение алгоритма...
Примерно для этого и есть монада. Например в скале с монадой Future это бы выглядело примерно так

Code: Select all

for {
    doneThis <- doThis()
    doneThat <- if itIs() doThat() else doSomehtingElse()
  } yield finishThat() onError {
    case error: Thowable => handleError()
  }
То есть даже и изобретать ничего не надо, все уже изобретено до нас :D
Palych
Уже с Приветом
Posts: 13987
Joined: 16 Jan 2001 10:01

Re: async turtles all the way

Post by Palych »

Круто! Монады рулят (хотя я их не люблю со времен попытки прочитать "Розу мира")
Куда мне изобретать - мне учиться надо...
Palych
Уже с Приветом
Posts: 13987
Joined: 16 Jan 2001 10:01

Re: async turtles all the way

Post by Palych »

Вот что нашел пока:
phpBB [video]
reality
Уже с Приветом
Posts: 256
Joined: 14 Jul 2011 09:07
Location: SaintP -> NYC

Re: async turtles all the way

Post by reality »

Для скалы есть еще клевый async который позволяет в императивном стиле писать non-blocking код: https://github.com/scala/async

В JS для этого promises, и насколько я понимаю видео то что надо
User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Re: async turtles all the way

Post by Сабина »

reality wrote:Для скалы есть еще клевый async который позволяет в императивном стиле писать non-blocking код: https://github.com/scala/async

В JS для этого promises, и насколько я понимаю видео то что надо
Вы даже не представляете как и нам это надо :love:
Нет ну надо же бывает такое! Как раз думаю что бы найти на скале для async play controller - и на тебе :)
https://www.youtube.com/watch?v=wOwblaKmyVw
Palych
Уже с Приветом
Posts: 13987
Joined: 16 Jan 2001 10:01

Re: async turtles all the way

Post by Palych »

Palych wrote:(Поднимаю старый топик)
В копилку асинхронных инструментов: Reactive Extensions
Сам не использовал, но прослушал лекцию на ACM - впечатлился. "Это такая брат лекция! Один раз послушаешь - и на всю жизнь!" (c)
К сожалению запись лекции еще не выложили, а главная мысль - Observables as Iterators и применение множественных операций к ним в описании отражена слабо...
Кстати, вот та лекция, правда в другом варианте: http://youtu.be/XE692Clb5LU

Return to “Вопросы и новости IT”