vitus_wagner: My photo 2005 (Default)
[personal profile] vitus_wagner
Народ, а кто может подсказать фреймворки для построения веб-страниц, в которых порядок генерации отдельных фрагментов не принципиален?

Вернее, требуется фреймворк, который выдает запрос в БД, а потом не дожидаясь его результата выдает следующий и т.д., а по мере получения результатов эти результаты обрабатывает. Причем с более-менее приличным синтаксическим сахаром.

Ну то есть что-то подобное есть в питоновских вариантах на базе Twisted и Tornado, но у twisted просто ужасный синтаксис в этом месте. Опять же Twisted и Tornado не самые популярные инструменты у веб-разработчков.

Дело в том, что выяснилось, что если не соблюдать четкую последовательность запрос-ответ-запрос-ответ, а вывалить в бэкенд сразу сотню запросов, а потом читать ответы, у постгреса даже на той же машине, получается ускорение примерно вдвое (на простых запросах, сводящихся к одному index range scan или index lookup).

Соответственно, хочется попытаться оторвать от libpq существующую там проверку на "если результат предыдущего запроса не прочитан, со следующим посылаем", и попытаться это применить на каких-то реальных задачах.

Подобные паттерны с сотнями легких запросов в рамках одного коннекта характерны как раз для динамических веб-фреймворков.

У меня возникло подозрение, что подобный стиль работы естественным образом вписывается во всякие решения на базе haskell или ocaml. Но я web-фреймворков на базе этих языков (да и самих-то языков) толком не знаю.

Go подойдёт

Date: 2015-10-28 06:27 pm (UTC)
From: [identity profile] 8df887a0-b2d1-4ca4-8758-9799a5a7bad1 [openid.stackexchange.com]
Go со своим CSP на эту роль подходит прекрасно.

Вот простецкий код с демонстрацией: numWorkers "запросов" осуществляются параллельно, их "результаты" по мере поступления рендерятся в HTML.
После того, как все отработали, рендерер, который тоже работал параллельно, отдаёт результат в основной код.

Вот код на плэйграунде (http://play.golang.org/p/GxwDWPnFFb)

Как можно заметить, в коде нет ни одного события и ни одного колбэка.

В реальном коде были бы изменения:
* Горутины, которые делают запросы, получали бы инстанс sql.DB (который на самом деле инкапсулирует пул запросов) и выполняли запросы.
* Рендерер мог бы рендерить не в буфер, а напрямую в тело HTTP-ответа клиенту.

Если требуется упорядочить обработку запросов, то каждой горутине, которая делает запрос, нужно передать её номер, и она должна отдать его вместе с результатом. Дальше рендерер пытается частично упорядочить результаты, буферизуя их и отрисовывая то, что уже подобралось с подходящими номерами по возрастанию.

Нативный драйвер (чистый Go) хорошего качества под Постгрес есть (https://github.com/lib/pq).

К сожалению, локального инстанса Постгреса у меня нет, и в плейграунде с ним, понятно, тоже не поиграться.

Если что, готов ответить на вопросы (XMPP, e-mail kostix at 007spb.ru).

Date: 2015-10-28 08:42 am (UTC)
From: [identity profile] tiendil.livejournal.com
На всякий случай уточню, что на Twisted можно писать в стиле Tornado. Даже есть портированная торнадовская веб часть, Cyclone называется.

Популярные асинхронные фремворки врядли существуют, асинхронность не самая простая для восприятия штука.

Date: 2015-10-28 09:54 am (UTC)
From: [identity profile] grey-kristy.livejournal.com
Дело в том, что никто уже давно не собирает веб страницы на строне сервера. Страница рисуется JS на стророне клиента, а информацию JS получает от сервера по кусочкам, асинхронно, обычно через web socket'ы

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

(no subject)

From: [identity profile] grey-kristy.livejournal.com - Date: 2015-10-28 10:24 am (UTC) - Expand

(no subject)

From: [identity profile] tiendil.livejournal.com - Date: 2015-10-28 02:12 pm (UTC) - Expand

Date: 2015-10-28 09:20 am (UTC)
From: [identity profile] freedom_of_sea.livejournal.com
так ведь рисует его джаваскрипт, который как раз простой и асинхронный

Date: 2015-10-28 09:24 am (UTC)
From: [identity profile] tiendil.livejournal.com
Вот я бы не назвал асинхронный код на JS простым. Конечно, если код заключается в том чтобы колбэк на ajax повесить, то это просто. А что-то сложнее там тоже не легко делается.

Хотя я уже не в курсе какие сейчас там новые фреймворки понаписали, может что прорывное и появилось.

Date: 2015-10-28 08:56 am (UTC)
From: [identity profile] anonim-legion.livejournal.com
ЖЖ-юзер jakobz что-то подобное делал. Также, C#-tasks как раз примерно таким и могут заниматься, то есть запустить кучу запросов, а потом собирать из них большое дерево-результат.

Date: 2015-10-28 09:03 am (UTC)
From: [identity profile] aduchi.livejournal.com
на томже питоне есть aiohttp и falcon

Date: 2015-10-28 09:36 am (UTC)
andrzejn: (Default)
From: [personal profile] andrzejn
ASP.Net MVC примерно с версии .Net Framework 4.0 весь асинхронный. А активно пишущаяся версия .Net 5.0, которую обещают зарелизить в 2016 году, будет изначально совместима с линуксами и MacOS.

Date: 2015-10-28 09:42 am (UTC)
From: [identity profile] angry-elf.livejournal.com
В Django весь ORM сделан ленивым, т.е. лезет в базу при попытке вывода данных, а не при формировании запроса. Соответственно, теоретически, можно с ним наколдовать асинхронность.

(no subject)

From: [identity profile] avnik.livejournal.com - Date: 2015-10-28 10:01 am (UTC) - Expand

(no subject)

From: [identity profile] aywen.livejournal.com - Date: 2015-10-28 11:42 am (UTC) - Expand

(no subject)

From: [identity profile] tiendil.livejournal.com - Date: 2015-10-28 02:08 pm (UTC) - Expand

Date: 2015-10-28 11:40 am (UTC)
From: [identity profile] tanner-of-kha.livejournal.com
Весь гешефт ленивости в том, что все функции в цепочке, возващающие QuerySet, объединяются в один SQL-запрос. Если попытаться извлекать QuerySet’ы из БД асинхронно, всё это развалится.

Да и как это реализовать? Я могу представить асинхронный database backend для Django только так, что функции ORM работают c нативными SQL views вместо отложенных результатов. Но боюсь, тогда испортятся и переносимость, и производительность в тех случаях, когда это вообще будет возможно. Создание SQL view − довольно ресурсоёмкая штука afaik.

(no subject)

From: [identity profile] tanner-of-kha.livejournal.com - Date: 2015-10-28 12:20 pm (UTC) - Expand

Date: 2015-10-28 11:14 am (UTC)
allter: (me)
From: [personal profile] allter
Мне кажется, асинхронка запросов к БД именно на одном коннекте в фреймворке общего назначения - очень редкий сценарий использования.

Сохранять в шаблоне для вывода жёсткую привязку к БД для того, что бы шаблонизатор мог асинхронно разбить множество N полей шаблона на количество M (M<=N) запросов к БД и потом собрать полученные данные в страницу; либо в контролере по хитрой логике делать тоже самое - очень неслабое нарушение идеалогии MVC, с соотвествующими накладными расходами на написание/поддержание этого не-MVC`шного кода.

А так - в большинстве крупных проектов, по-моему, так или иначе используются мультиплексоры обращений к RDBMS (где K коннектов к RDBMS используются всеми частями системы через синхронные tcp запросы к серверу-мультиплексору либо через какой-то сервер очередей/протокол сообщений). Учитывая большое количество одновременно выполняющихся программ, получается почти такая же "упаковка" запросов, только без применения, собственно, асинхронных техник.

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

(no subject)

From: [personal profile] allter - Date: 2015-10-28 01:53 pm (UTC) - Expand

(no subject)

From: [personal profile] allter - Date: 2015-10-28 02:19 pm (UTC) - Expand

(no subject)

From: [personal profile] allter - Date: 2015-10-29 07:41 am (UTC) - Expand

Date: 2015-10-28 11:19 am (UTC)
From: [identity profile] tanner-of-kha.livejournal.com
Распараллеливание запросов − это может быть интересно, но с учётом того, как в современном вебе используется кэширование, параллельные запросы к СУБД ускорят выдачу одной страницы из нескольких тысяч, наверное. Джанго, если что.

Date: 2015-10-28 11:29 am (UTC)
From: [identity profile] http://users.livejournal.com/_arty/
насколько я представляю, самый популярный фреймворк express для node.js изначально асинхронный, и все его «дети» тоже

Date: 2015-10-28 12:07 pm (UTC)
From: [identity profile] cross-join.livejournal.com
Тут порочен изначальный принцип "много мелких запросов на чтение".
Попытайтесь собрать их в несколько более крупных запросов, производительносить вырастет не в 2 раза, а на порядки.

(no subject)

From: [identity profile] cross-join.livejournal.com - Date: 2015-10-28 12:31 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2015-10-28 05:19 pm (UTC) - Expand

(no subject)

From: [identity profile] os80.livejournal.com - Date: 2015-10-28 06:11 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2015-10-28 06:28 pm (UTC) - Expand

(no subject)

From: [identity profile] os80.livejournal.com - Date: 2015-10-28 07:04 pm (UTC) - Expand

(no subject)

From: [identity profile] os80.livejournal.com - Date: 2015-10-28 07:00 pm (UTC) - Expand

ZeroMQ from Python?

Date: 2015-10-28 04:29 pm (UTC)
From: [identity profile] anonym-mouse.livejournal.com
ZeroMQ from Python.

Вам придется разобраться, какую из patterns
использовать (например, Publish-Subscribe etc)

Тогда программки на обоих концах соединения
смогут издавать асинхронные запросы или публиковать
результаты - и их собирать в осмысленное.

В целом вы как бы хотите что-то вроде парадигмы
Эрланга, воплощенной в каком-то из Web Frameworks?

Присобачьте ZeroMQ (или её потомков по нисходящей),
и пользуйтесь существующим framework'ом.

.. если я понял вашу задачу правильно..

Date: 2015-10-28 05:15 pm (UTC)
From: [identity profile] metaclass.livejournal.com
nginx и постгрес-модуль для него?
node.js, которая вдоль и поперек должна быть асинхронной, по идее (надеюсь клиенты к СУБД для нее тоже асинхронные и используют тот же libuv для сокетов).

(no subject)

From: [identity profile] awind.livejournal.com - Date: 2015-10-29 12:55 pm (UTC) - Expand

(no subject)

From: [identity profile] awind.livejournal.com - Date: 2015-10-29 01:35 pm (UTC) - Expand

Date: 2015-10-29 07:03 am (UTC)
From: [identity profile] kremator666.livejournal.com
Очевидный нодюжс или ангулар.жс очевиден

Date: 2015-10-29 07:32 am (UTC)
allter: (me)
From: [personal profile] allter
И что, там есть шаблонизатор с асинхронным сборщиком страниц? Если да, то можно какой-то пример асинхронной сборки?

Асинхронные-то циклы обработки событий есть сейчас на всех платформах, как и сопрограммы (yield), синтаксические сахары вроде Promise и т.п. Т.е. при желании везде можно в две строчки навертеть, была бы только необходимость...

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

August 2025

S M T W T F S
     1 2
3456789
10111213141516
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 3rd, 2025 08:08 pm
Powered by Dreamwidth Studios