mva
mva
Snusmumriken
А, меня может глюкнуть, в мою версию встроен пых-cgi.
mva
встроен туда только перл
RapidCodeLab
mva
ну и недавно njs (NginX JS) подвезли
mva
c php оно работает через fastgi
RapidCodeLab
я вот точно не помню, но вроде content_bu_lua в nginx, оно вообще рулит
mva
поэтому для NgX и написали mod_lua ;)
Snusmumriken
только знают его только старпёры или гики типа меня
Да не, довольно много народа. На перле можно писать в питоноподобном стиле и на него легко переучиваться. Конечно это не будет "ультра мега профессиональное использование всех фич" ))))))))))).
mva
mva
прямо в блоке писать на Lua, не в "многстрочной строке" :)
RapidCodeLab
mva
это уже директивы *_by_lua_file
RapidCodeLab
о, точно
RapidCodeLab
я к тому, что для веба, тот же пых заменить на стеке нгинх, че бы нет
RapidCodeLab
+ нгинкхсковые кеши
Snusmumriken
Разницы никакой. Только при изменения block'а надо перезагружать конфиг, а если убрать кеширование (lua_code_cache off;) то файл будет перезагружаться на каждом запросе что удобнее при разработке.
RapidCodeLab
ну вот, че такому не учат) все пых да пых)
Snusmumriken
А нет разницы.
RapidCodeLab
опять же, нсколько я понимаю и помню, это в контексте нгинх все происходит
RapidCodeLab
со всемми вытекающими
Snusmumriken
Ну да, нгинкс запускает луёвую машинку, а ещё там для каждой блокирующей операции (кроме базовых луа) идёт перенаправление в следующую луёвую ВМку со своим контекстом, чтобы не ждать пока одна разрулится. Совершенно незаметная асинхронщина.
RapidCodeLab
а че бы нгинх блокировать?
Snusmumriken
Ммм. Лезешь ты такой в базу. Опа, пока запрос в базу не разрулится, всё типа блокируется. А разруливаться он может минуту-другую и парализовать тред (которых в нгинксе штуки четыре обычно).
RapidCodeLab
а контекста нет? я просто не особо
RapidCodeLab
RapidCodeLab
нгинх он же вроде нитки запускает на каждый реквест
Snusmumriken
Контекст нгинкса.
content_by_lua_block{
local conn = mydb.connect('127.0.0.1:256')
local data = conn.request"select ALL from SHEET_BASE"
for i, v in ipairs(data) do .... end
}
А теперь представь, что сюда пришла тысяча запросов. А потоков в нгинксе допустим 4. А то и 1 как у меня ))
Snusmumriken
нгинх он же вроде нитки запускает на каждый реквест
Что конкретно делает нгинкс. Ты делаешь запрос в базу, нгинкс его перехватывает и останавливает твою вм пока ответ не придёт, переходя к следующей вм.
В контексте луа всё ровно идёт.
В контексте нгинкса тот постоянно переключает ВМки когда те начинают заниматься чем-то блокирующим, и идёт разруливать следующий запрос пока этот на паузе.
RapidCodeLab
Snusmumriken
Отмена и освобождение чего?
Snusmumriken
Запроса в базу?
RapidCodeLab
ну вот я в го например отдаю контекст с отменой, по таймауту, здесь нет такого?
RapidCodeLab
Snusmumriken
это кстати интересно, а у нгинх же вроде есть инструменты для этих случаев?
Ммм, делаешь асинхронный запрос типа
content_by_lua_block{
local conn = mydb.connect('127.0.0.1:256')
local handler = conn.request{
req = "select ALL from SHEET_BASE",
async = true
}
while not handler.isDone or timer < timeout do
ngx.sleep(0.1)
end
for i, v in ipairs(handler.data) do .... end
}
Вот тут уже ты управляешь когда тред с твоей фигнёй будет просыпаться, а нгинкс будет переключаться на другие задачи пока гоняется sleep.
RapidCodeLab
это круто) спасибо
RapidCodeLab
но у меня в основном никогда в базу не ломится на хттп запросах, только в мемори сторы
Snusmumriken
Драйверы должны быть с возможностью асинхронщины офк. Я обычно такие и делаю, потому что позволяет впилить асинхронщину даже при отсутствии её поддержки, даже в чистой луа вм без вумных нгинксов/рестей.
Snusmumriken
Например совершенно шикарный ffi-биндинг к курлу. Имеет как флаг async, так и флаг специально для корутин "routine", чтобы автоматически отпускать запрос если он гоняется в корутине.
https://pastebin.com/YMKrADBT
RapidCodeLab
tarantool crud operations is async...
Snusmumriken
Знаешь почему все вокруг так фапают на асинхронность?
RapidCodeLab
RapidCodeLab
этот круг я вижу
Snusmumriken
Потому что они позволяют разруливать миллионы входящих соединений одновременно, наплевав на всё блокирующее, не дожидаясь пока несколько (десятков?) тредов пыхтя будут перемалывать по 4-10 запросов за раз и простаивая по полтора часа какой-нибудь бесполезной фигни для одного говнозапроса.
RapidCodeLab
я даже модель nodejs знаю)
RapidCodeLab
у нас в го, это просто горутины
Snusmumriken
У нас в луях это просто корутины. За пятнадцать лет до горутин.
RapidCodeLab
уже в курсе
RapidCodeLab
RapidCodeLab
пох, дело в том, что луа это неотъемлемый инструмент даже для гошников в итоге
Snusmumriken
Чегойта? Полно гошников которые слыхом не слыхивали.
RapidCodeLab
лично мне это только в прикол
RapidCodeLab
Snusmumriken
А гошники тут при чём? )
RapidCodeLab
ну епт, гошники они же не в вакууме живут
Snusmumriken
Они могут сидеть себе в своих микросервисах и изредка делать запросы в тарантул/принимать перенаправления с нгинкса.
RapidCodeLab
Snusmumriken
Нет, они могут быть крайне функциональными ребятами и высокими профессионалами своего дела. Просто не лезут куда-то ещё.
Или просто пользоваться другим стеком, тот же апач + мариядб.
RapidCodeLab
я не согласен, вакуум в технологиях, это плохой спец
Snusmumriken
Стеков много. Это просто ещё один.
Нгинкс редко используют как сервер приложений, куда чаще просто балансер/защита от ддоса, и про луа с рестей мало кто знает.
Тарантул в принципе не самая популярная фигня. Редиска — более популярная, и там даже есть луа для удалённых процедур, но редко используется, в 99% случаев прост HSET HGET для кеша и всё.
RapidCodeLab
не буду спорить) я против того, чтоб человек знал только что-то одно,.. с моей точки зрения, это человек , который не интересуется технологиями
Snusmumriken
Скажем так. Луа принципиально не нужна гошнику чтобы вариться в любом другом более популярном/необходимом стеке.
RapidCodeLab
ну мне нужна , так что...
Snusmumriken
Ну вот. На себя примеряй что угодно, но не распространяй свой опыт на всю индустрию. Он НЕ релевантен всему.
mva
+ нгинкхсковые кеши
слышал про CloudFlare?
угадаешь на чём работают?
А про Aliexpress?
А ты в курсе, что mod_lua пошёл как раз из разработок последних? :)
А потом первые к нему кучу рук приложили :)
Melonges
Небольшой оффтоп, не могу понять. В pawn есть сборщик мусора? И он полностью компилируемый?
Snusmumriken
Денис
Там это тоже очень активно используется, знаешь ли.
В сишке условно ты один раз разметил буфер под сжимаемые данные, и заполняешь его по письке, смещая курсор и впаивая в уже размеченную ерунду допустим заголовки/словарики для разжатия.
А тут ты клеишь и клеишь, клеишь и клеишь строчки, и каждая строчка создаёт гору мусора которая нужна только до следующей склейки. Частично с этим помогает table.concat, но не совсем.
И это очевидно фиксится сишными либами или ffi.
А если string.format юзать? Ну, например:
a = "123"
a = string.format("%s%s", a, "456)
a = string.format("%s%s", a, "789")
mva
Денис
Во-первых, выглядит как совсем уж извращене
Во-вторых, НЯП, он дороже table.concat
Ну, извращение/не извращение - фиг знает, но тогда, получается, нужно колхозить внешнюю конкатенацию? В мануале у Lua указано, что, мол, при использовании assert/error не конкатенируйте, а передавайте инфинитом, дескать, конкатенация затратна...
Денис
Т.е., сами девелоперы в курсе за затратность конкатенации, и ничего с ней не делают... Что им мешает деаллоцировать память после конкатенации, а в переменную вписывать новый адрес. Или же действительно писать по указателю с отсечением терминальных нулей...
Денис
Мы все конечно понимаем, что есть GC, и вообще, GC спасет мир, но тем не менее? За цикл может собраться такая куча неиспользуемой памяти...
mva
Ну чтобы она собралась за цикл это надо быть чемпионом говнокодинга, не?
Денис
Я как-то на Alien писал враппер к одной либе и сперва откровенно охренел от перманентной утечки памяти, а GC запускается на Standalone весьма долго.
Денис
Тоесть, за циклы запусков GC у меня там натекало порядка 50 мегабайт. Откуда оно такое бралось - не спрашивайте, в душе не знаю. Там по сути, строки гонялись через WideCharToMultiByte и MultiByteToWideChar
Денис
Кстати, господа, а есть какой-то способ определить что у нас за строка холдится? UTF8/не UTF8?