Snusmumriken
Snusmumriken
Saphire
Хотя "у нас не прода" надо сжечь для разрабов AndroidStudio. Эта фигня жрёт слишком много :с
Maxim
Snusmumriken
А, ну нормась. А если надо изменить луа-часть, то что? : )
Snusmumriken
Или там параметры по типу кусков кода, который потом loadstring'ается?
Maxim
А, ну нормась. А если надо изменить луа-часть, то что? : )
такое было два раза за год, стараемся делать так что бы не было лишних причин перезагружать сервисы, лучше когда lua получает данные извне. Это типа API которое можно настроить натыкав галочки в админке что написана на php или Java, это удобней чем постоянно передергивать сервис
Maxim
Snusmumriken
Maxim
Maxim
он не виноват что мы придумали что то новое
Snusmumriken
Или луа типа запихивает запрос и данные с новой командой в redis, приложение на php или java — читает её из редиса, делает бизнес-логику, записывает ответ обратно в redis, и луа-часть ждёт пока в редисе не появится ответ и выдаёт результат?
Maxim
Snusmumriken
Ну в общем понятно, у вас луа исполняет фронт-часть, типа чисто набор маленьких скриптиков которые делают предельно тупую работу ввода/вывода контента, а основная логика в жава-приложениях.
Я-то уж подумал что вы делали бизнес-логику на самой луа, и каким-то образом не перезагружали конфиг.
Если что, на луа действительно можно делать бизнес-логику. И даже не перезагружать : )
Maxim
lua ничего не ждет, lua спросил redis "есть чё?" получив ответ принимает решение
Maxim
Maxim
вся бизнес логика разбита на скрипты
Snusmumriken
Хмм, а как выглядит запрос-ответ?
Нгинксу пришёл запрос, надо что-то посчитать/вычислить.
Он передал его луа. Луа записала в бд: "появился запрос такой-то с такими-то данными". Его обрабатывают и что-то возвращают в редис.
Что в это время делает луа? Запрос-то как бы ещё не прерван.
Snusmumriken
В цикле такая: "Есть чо? А сейчас есть чо? Мы уже приехали?"? Надо же что-то ответить.
Maxim
Maxim
lua решает конкретные задачи, бизнесс процессы - это маленький участок кода не больше 20-30 строк каждый
Maxim
если один скрипт lua будет решать две задачи - туши свет
Snusmumriken
Нене, я спрашиваю про простую штуку: процесс запроса.
Нгинкс не будет дёргать луа по причине появления новой записи в бд, но он принимает запросы и должен что-то возвращать. Это база протокола HTTP: принял запрос, выдал ответ.
Snusmumriken
То есть, процесс запроса выглядит вот так?
Snusmumriken
Хмм, а как выглядит запрос-ответ?
Нгинксу пришёл запрос, надо что-то посчитать/вычислить.
Он передал его луа. Луа записала в бд: "появился запрос такой-то с такими-то данными". Его обрабатывают и что-то возвращают в редис.
Что в это время делает луа? Запрос-то как бы ещё не прерван.
Maxim
lua не ходит у нас в БД, обращение к диску занимает много времени, lua ходит в ОЗУ
Snusmumriken
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 строк расстрел солеными огурцами с занесением в личное дело
Snusmumriken
за 40 строк расстрел солеными огурцами с занесением в личное дело
Запись запроса в In-memory-DB Redis и ожидание ответа из неё можно уложить в десять строк. Это предельно простая задача без всякой логики.
Пофигу кто решит этот запрос, в каком контейнере или без него, на каком языке и так далее, если ответ появился в In-memory-DB Redis — его можно вернуть.
Луа стороне надо по HTTP вернуть ответ. Откуда она его берёт?
Maxim
Snusmumriken
Snusmumriken
Artem
я так понял, что там луа используется как мидлварка для изменения/насыщения запроса/ответа, сам запрос летит дальше куда-то и от туда берется ответ
Artem
+ некоторые луа скрипты сами в себе, типа обрезки картинок
Snusmumriken
Maxim
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)
}
}
Она читает из редиски ответ, который там появится когда какой-нибудь сервис решит этот запрос?
Ждёт пока ответ не вернётся или выдаёт заглушку: "обратитесь позже, когда ответ будет готов", заставляя жаваскрипт бомбардировать сервер запросами "мы уже приехали?" или ещё как?
Maxim
Snusmumriken
Я час спрашиваю, как это у вас работает.
ЧАС ))
С примерчиками, с уточнениями, с миллиардом всякой фигни. Очень конкретно.
Saphire
А в чём вопрос собственно?
Snusmumriken
Хмм, а как выглядит запрос-ответ?
Нгинксу пришёл запрос, надо что-то посчитать/вычислить.
Он передал его луа. Луа записала в бд: "появился запрос такой-то с такими-то данными". Его обрабатывают и что-то возвращают в редис.
Что в это время делает луа? Запрос-то как бы ещё не прерван.
Snusmumriken
В цикле такая: "Есть чо? А сейчас есть чо? Мы уже приехали?"? Надо же что-то ответить.
Maxim
Snusmumriken
Почему? Нгинкс способен обрабатывать миллионы одновременных запросов. Если боишься перегрузить In-memory DB Redis — добавь sleep в цикле.
Maxim
Snusmumriken
Хмм, ты знаешь что делает нгинкс, пока redis:set ждёт ответа редиса? Он переключается к следующему запросу.
Snusmumriken
Sleep из нгинкса заставляет нгинкс делать то же самое. Переключаться к другому запросу, делать другие дела.
Maxim
Snusmumriken
nginx ничего не делает сам, делают всю грязную работу его рабочие worker process
Ох. Когда ты пишешь ngx.sleep(0.2), воркер-процесс начинает делать другой запрос.
Но это не важно. Важно "Начинает Делать Другой Запрос" Другой запрос. Запрос, другой. Он не простаивает, он занимается полезным делом, выполняет другой запрос. Потом возвращается обратно к этому, когда время истечёт. Но пока не истекло, делает другой запрос.
Snusmumriken
Другой.
Snusmumriken
И так — со всеми блокирующими операциями.
Maxim
Snusmumriken
Как в вашем случае?
Snusmumriken
Ладно, мне лень ещё час допытываться, буду считать что вы делаете это не лонг-поллингом (длительные запросы) а простым поллингом (частые запросы).
Если что, лонг-поллинг быстрее: не надо постоянно открывать/закрывать соединения, это медленный процесс. И нагрузка на сервер меньше (хоть и памяти обычно нужно чуть больше). Sleep хорош даже в гнинксе (местная вариация слипа).
Snusmumriken
Если у тебя секретность, и нельзя говорить другим о "методике ваших запрос-ответов" — так и скажи, меньше будешь мучать людей.
Если сам не в курсе о том как происходят дела — лучше тоже скажи что секретность, самолюбие на месте, и от тебя отстали.
Snusmumriken
Ладно, мне лень ещё час допытываться, буду считать что вы делаете это не лонг-поллингом (длительные запросы) а простым поллингом (частые запросы).
Если что, лонг-поллинг быстрее: не надо постоянно открывать/закрывать соединения, это медленный процесс. И нагрузка на сервер меньше (хоть и памяти обычно нужно чуть больше). Sleep хорош даже в гнинксе (местная вариация слипа).
Вон, leafo делает то же самое : )
http://leafo.net/posts/itchio-and-coroutines.html#coroutines-in-practice/the-coroutine-approach
У него совершенно прямой код. Там просто нгинксовые слипы, пока не придёт ответ от базы.
Оно может одновременно обрабатывать миллионы запросов, с минимальными накладными расходами на организацию новых соединений, разметку памяти, запросы у ОС за новым соком, инициализацию энвайрнмента и т.п.
Snusmumriken
Snusmumriken
(кстати, если уж так нужна скорость — никто не мешает писать сам бекенд на луа-рести, это ещё быстрее чем системы сообщений через бд, минус две прослойки, но надо перезагружать при каждой накатке, плюс одна машина занимается всем подряд, а на несколько — надо балансировать, база перестаёт работать балансировкой)
Maxim
Snusmumriken
Ну map reduce, да, как раз за счёт того что есть запись в бд, куда можно дописать частичный ответ. База работает балансировщиком и распределителем. Это правда всё ещё не тот ответ ))
Snusmumriken
Карочи, у вас браузер регулярно опрашивает сервер, и типа если ответ сформирован — он возвращается на клиент, да?
Maxim
как пример, в админке на php админ добавляет запись в табличке в бд о том что с такого url нужно делать редирект вот на такой url и после сохранения записи в БД при нажатии кнопки сохранит админом в админке - nginx моментально должен отрабатывать этот редирект без перезагрузки конфигурации
Snusmumriken
Всё, всё, отстаю, высыпайся
Maxim
Лайфхак