Maxim
На линуксе перезагрузка не занимает больше пары секунд..
в наших конфигурациях вообще нет необходимости перезагружать сервис при изменениях, спасибо lua за эту возможность.
Snusmumriken
в наших конфигурациях вообще нет необходимости перезагружать сервис при изменениях, спасибо lua за эту возможность.
У вас отключено кеширование луа? Это замедляет исполнение луа-скриптов примерно в ~1000 раз.
Saphire
Хотя "у нас не прода" надо сжечь для разрабов AndroidStudio. Эта фигня жрёт слишком много :с
Snusmumriken
у нас включено кэширование lua скриптов
Тогда как вы не перезагружаете конфиг, но изменяете луа часть? Очищаете package.loaded по внешнему сигналу, и либы типа перезагружены?
Maxim
Тогда как вы не перезагружаете конфиг, но изменяете луа часть? Очищаете package.loaded по внешнему сигналу, и либы типа перезагружены?
мы не изменяем lua часть, мы сделали так что lua берет параметры из redis и на их основании решает что делать. в Redis параметры попадают из внешнего источника типа java или php или иного приложения
Snusmumriken
А, ну нормась. А если надо изменить луа-часть, то что? : )
Snusmumriken
Или там параметры по типу кусков кода, который потом loadstring'ается?
Maxim
А, ну нормась. А если надо изменить луа-часть, то что? : )
такое было два раза за год, стараемся делать так что бы не было лишних причин перезагружать сервисы, лучше когда lua получает данные извне. Это типа API которое можно настроить натыкав галочки в админке что написана на php или Java, это удобней чем постоянно передергивать сервис
Maxim
Или там параметры по типу кусков кода, который потом loadstring'ается?
не, за это можно поехать на рыбалку нифига не в качестве рыбака
Maxim
он не виноват что мы придумали что то новое
Snusmumriken
Или луа типа запихивает запрос и данные с новой командой в redis, приложение на php или java — читает её из редиса, делает бизнес-логику, записывает ответ обратно в redis, и луа-часть ждёт пока в редисе не появится ответ и выдаёт результат?
Snusmumriken
Ну в общем понятно, у вас луа исполняет фронт-часть, типа чисто набор маленьких скриптиков которые делают предельно тупую работу ввода/вывода контента, а основная логика в жава-приложениях. Я-то уж подумал что вы делали бизнес-логику на самой луа, и каким-то образом не перезагружали конфиг. Если что, на луа действительно можно делать бизнес-логику. И даже не перезагружать : )
Maxim
lua ничего не ждет, lua спросил redis "есть чё?" получив ответ принимает решение
Maxim
вся бизнес логика разбита на скрипты
Snusmumriken
Хмм, а как выглядит запрос-ответ? Нгинксу пришёл запрос, надо что-то посчитать/вычислить. Он передал его луа. Луа записала в бд: "появился запрос такой-то с такими-то данными". Его обрабатывают и что-то возвращают в редис. Что в это время делает луа? Запрос-то как бы ещё не прерван.
Snusmumriken
В цикле такая: "Есть чо? А сейчас есть чо? Мы уже приехали?"? Надо же что-то ответить.
Maxim
lua решает конкретные задачи, бизнесс процессы - это маленький участок кода не больше 20-30 строк каждый
Maxim
если один скрипт lua будет решать две задачи - туши свет
Snusmumriken
Нене, я спрашиваю про простую штуку: процесс запроса. Нгинкс не будет дёргать луа по причине появления новой записи в бд, но он принимает запросы и должен что-то возвращать. Это база протокола HTTP: принял запрос, выдал ответ.
Maxim
Нене, я спрашиваю про простую штуку: процесс запроса. Нгинкс не будет дёргать луа по причине появления новой записи в бд, но он принимает запросы и должен что-то возвращать. Это база протокола HTTP: принял запрос, выдал ответ.
если запрос косается кейса что решает луа через redis то nginx отдаст его lua, если запрос нацелен порешать что то серьезное с кучей рассчетов и данными из БД то пусть этим занимается специальный сервис где есть все что нужно для обработки запроса
Snusmumriken
То есть, процесс запроса выглядит вот так?
Snusmumriken
Хмм, а как выглядит запрос-ответ? Нгинксу пришёл запрос, надо что-то посчитать/вычислить. Он передал его луа. Луа записала в бд: "появился запрос такой-то с такими-то данными". Его обрабатывают и что-то возвращают в редис. Что в это время делает луа? Запрос-то как бы ещё не прерван.
Maxim
lua не ходит у нас в БД, обращение к диску занимает много времени, lua ходит в ОЗУ
Maxim
Redis это БД. In-memory DB.
да, redis это табличка в ОЗУ, если грубо сравнить
Snusmumriken
Ладно, сформулируем чуть иначе: Нгинксу приходит запрос. Он передаёт его в луа, луа передаёт его в In-memory-DB Redis. Сервисы которые снуют вокруг смотрят: опа, в In-memory-DB Redis появился новый запрос. Считают-вычисляют всякую фигню, в это время Lua-машина ждёт пока что-то не придёт обратно в In-memory-DB Redis, считывает оттуда и возвращает клиентской стороне то что считала, так?
Maxim
Ладно, сформулируем чуть иначе: Нгинксу приходит запрос. Он передаёт его в луа, луа передаёт его в In-memory-DB Redis. Сервисы которые снуют вокруг смотрят: опа, в In-memory-DB Redis появился новый запрос. Считают-вычисляют всякую фигню, в это время Lua-машина ждёт пока что-то не придёт обратно в In-memory-DB Redis, считывает оттуда и возвращает клиентской стороне то что считала, так?
конечно же нет, если бы это было так то это никогда бы не взлетело. Lua скрипты решают конкретные кейсы которые не требуют такой сложной логики - туда положи, здесь подожди, там постой, туда посмотри, вот тут улыбайся. один lua скрипт решает одну конкретную задачу. например - проверь есть ли доступ, обреж картинку, отправь вот эти данные вон туда, запроси вот по этим двадцати ссылкам ответы и отправь вон туда.
Maxim
одна задача - один скрипт - один контейнер
Maxim
все обязано быть просто
Maxim
сервис состоит из одного файла не больше чем 30 строк
Maxim
за 40 строк расстрел солеными огурцами с занесением в личное дело
Saphire
за 40 строк расстрел солеными огурцами с занесением в личное дело
А хлеб дают с огурцами? А так вполне хорошо звучит. Как насчёт сервисов с авторизацией?
Snusmumriken
за 40 строк расстрел солеными огурцами с занесением в личное дело
Запись запроса в In-memory-DB Redis и ожидание ответа из неё можно уложить в десять строк. Это предельно простая задача без всякой логики. Пофигу кто решит этот запрос, в каком контейнере или без него, на каком языке и так далее, если ответ появился в In-memory-DB Redis — его можно вернуть. Луа стороне надо по HTTP вернуть ответ. Откуда она его берёт?
Maxim
А хлеб дают с огурцами? А так вполне хорошо звучит. Как насчёт сервисов с авторизацией?
один lua скрипт который подключается в нужный конфиг nginx или openresty в access_by_lua_file в тех сервисах где вам необходимо. один файл lua - одна задача
Artem
за 40 строк расстрел солеными огурцами с занесением в личное дело
по мне так это глупости мерить что-то кол-вом строк и делать на основе этого оценку
Maxim
по мне так это глупости мерить что-то кол-вом строк и делать на основе этого оценку
Это была шутка, не воспринимайте серьезно, но вам лично назначим не только расстрел солеными огурцами но и добьем солеными помидорами если будете еще живы после огурцов
Artem
я так понял, что там луа используется как мидлварка для изменения/насыщения запроса/ответа, сам запрос летит дальше куда-то и от туда берется ответ
Artem
+ некоторые луа скрипты сами в себе, типа обрезки картинок
Maxim
"Луа стороне надо по HTTP вернуть ответ. Откуда она его берёт?"
lua не только надо вернуть ответ в браузер но и еще добавить заголовков, в body добавить данных при определенных условиях, и в куках еще для некоторых наследить, lua контролирует все фазы жизни запроса в nginx
Snusmumriken
lua не только надо вернуть ответ в браузер но и еще добавить заголовков, в body добавить данных при определенных условиях, и в куках еще для некоторых наследить, lua контролирует все фазы жизни запроса в nginx
Вопрос не о том "что она ещё делает", а о конкретной вещи, откуда она берёт посчитанный ответ. И ждёт ли она пока этот ответ не появится (потому что что-то надо вернуть).
Snusmumriken
Допустим, код location'а: (это типа псевдокод, но суть должна быть понятна) location /api/.* { content_by_lua_block { -- записали запрос redis:set("request_12345", ngx.req.body) -- если мы читаем ответ из redis'а же -- нам надо подождать пока не появится ответ, -- он хз когда прилетит local response = redis:get("response_12345") while not response do response = redis:get("response_12345") end ngx.say(response) } } Она читает из редиски ответ, который там появится когда какой-нибудь сервис решит этот запрос? Ждёт пока ответ не вернётся или выдаёт заглушку: "обратитесь позже, когда ответ будет готов", заставляя жаваскрипт бомбардировать сервер запросами "мы уже приехали?" или ещё как?
Snusmumriken
Я час спрашиваю, как это у вас работает. ЧАС )) С примерчиками, с уточнениями, с миллиардом всякой фигни. Очень конкретно.
Saphire
А в чём вопрос собственно?
Snusmumriken
Хмм, а как выглядит запрос-ответ? Нгинксу пришёл запрос, надо что-то посчитать/вычислить. Он передал его луа. Луа записала в бд: "появился запрос такой-то с такими-то данными". Его обрабатывают и что-то возвращают в редис. Что в это время делает луа? Запрос-то как бы ещё не прерван.
Snusmumriken
В цикле такая: "Есть чо? А сейчас есть чо? Мы уже приехали?"? Надо же что-то ответить.
Snusmumriken
Почему? Нгинкс способен обрабатывать миллионы одновременных запросов. Если боишься перегрузить In-memory DB Redis — добавь sleep в цикле.
Maxim
Почему? Нгинкс способен обрабатывать миллионы одновременных запросов. Если боишься перегрузить In-memory DB Redis — добавь sleep в цикле.
так точно, но если каждый запрос будет "ждать" или не приведи господи "спать" то это - беда
Snusmumriken
Хмм, ты знаешь что делает нгинкс, пока redis:set ждёт ответа редиса? Он переключается к следующему запросу.
Snusmumriken
Sleep из нгинкса заставляет нгинкс делать то же самое. Переключаться к другому запросу, делать другие дела.
Maxim
Sleep из нгинкса заставляет нгинкс делать то же самое. Переключаться к другому запросу, делать другие дела.
nginx ничего не делает сам, делают всю грязную работу его рабочие worker process
Snusmumriken
nginx ничего не делает сам, делают всю грязную работу его рабочие worker process
Ох. Когда ты пишешь ngx.sleep(0.2), воркер-процесс начинает делать другой запрос. Но это не важно. Важно "Начинает Делать Другой Запрос" Другой запрос. Запрос, другой. Он не простаивает, он занимается полезным делом, выполняет другой запрос. Потом возвращается обратно к этому, когда время истечёт. Но пока не истекло, делает другой запрос.
Snusmumriken
Другой.
Snusmumriken
И так — со всеми блокирующими операциями.
Snusmumriken
Как в вашем случае?
Snusmumriken
Ладно, мне лень ещё час допытываться, буду считать что вы делаете это не лонг-поллингом (длительные запросы) а простым поллингом (частые запросы). Если что, лонг-поллинг быстрее: не надо постоянно открывать/закрывать соединения, это медленный процесс. И нагрузка на сервер меньше (хоть и памяти обычно нужно чуть больше). Sleep хорош даже в гнинксе (местная вариация слипа).
Snusmumriken
Если у тебя секретность, и нельзя говорить другим о "методике ваших запрос-ответов" — так и скажи, меньше будешь мучать людей. Если сам не в курсе о том как происходят дела — лучше тоже скажи что секретность, самолюбие на месте, и от тебя отстали.
Snusmumriken
Ладно, мне лень ещё час допытываться, буду считать что вы делаете это не лонг-поллингом (длительные запросы) а простым поллингом (частые запросы). Если что, лонг-поллинг быстрее: не надо постоянно открывать/закрывать соединения, это медленный процесс. И нагрузка на сервер меньше (хоть и памяти обычно нужно чуть больше). Sleep хорош даже в гнинксе (местная вариация слипа).
Вон, leafo делает то же самое : ) http://leafo.net/posts/itchio-and-coroutines.html#coroutines-in-practice/the-coroutine-approach У него совершенно прямой код. Там просто нгинксовые слипы, пока не придёт ответ от базы. Оно может одновременно обрабатывать миллионы запросов, с минимальными накладными расходами на организацию новых соединений, разметку памяти, запросы у ОС за новым соком, инициализацию энвайрнмента и т.п.
Maxim
Если у тебя секретность, и нельзя говорить другим о "методике ваших запрос-ответов" — так и скажи, меньше будешь мучать людей. Если сам не в курсе о том как происходят дела — лучше тоже скажи что секретность, самолюбие на месте, и от тебя отстали.
бро, нет никакой секретности, меня просто выключает уже, завтра очнусь и расскажу подробно схему, если в двух словах чтоб не терзать то у нас приложения и сервисы устроены таким образом что запросы к бэкэнду получают ответ максимально быстро, стараемся избегать таких кейсов когда нужно прибегать к использованию sleep или ожиданиям
Snusmumriken
(кстати, если уж так нужна скорость — никто не мешает писать сам бекенд на луа-рести, это ещё быстрее чем системы сообщений через бд, минус две прослойки, но надо перезагружать при каждой накатке, плюс одна машина занимается всем подряд, а на несколько — надо балансировать, база перестаёт работать балансировкой)
Snusmumriken
Ну map reduce, да, как раз за счёт того что есть запись в бд, куда можно дописать частичный ответ. База работает балансировщиком и распределителем. Это правда всё ещё не тот ответ ))
Snusmumriken
Карочи, у вас браузер регулярно опрашивает сервер, и типа если ответ сформирован — он возвращается на клиент, да?
Maxim
как пример, в админке на php админ добавляет запись в табличке в бд о том что с такого url нужно делать редирект вот на такой url и после сохранения записи в БД при нажатии кнопки сохранит админом в админке - nginx моментально должен отрабатывать этот редирект без перезагрузки конфигурации
Snusmumriken
Всё, всё, отстаю, высыпайся
Maxim
Лайфхак