Anonymous
Каждый раз дёргается staticServer, файла нет - идём в БД. Так что ли? Кстати, зачем там каждый раз connect и disconnect? Что за хранилище, пула нет?
нет миддварка статиксервера видит что роут относится к файлам и отадет его и не вызывает next() и дальше коннекта к дб и дальнешая обработка запроса не происходит.
Vint
А я про такой код говорил: const express = require('express') const app = express() app.use((req, res, next) => { next() req.pr.then(x => console.log(x)) }) app.get('/', (req, res) => { req.pr = Promise.resolve(1) res.send('Hello World!') }) app.listen(3000)
req.pr.then(x => console.log(x)) В это строчке начинается "толстота". Есдиный output для всех роутов. Это клёво, если всегда json, например. Но надо ещё и про catch не забыть и прочее.
hamper 𓅝
Ну да, возможно я изначальную задачу не так понял, в общем спать пора.
Vint
нет миддварка статиксервера видит что роут относится к файлам и отадет его и не вызывает next() и дальше коннекта к дб и дальнешая обработка запроса не происходит.
Я про обратный пример спрашивал - на каждый запрос к БД идёт обработка через static-server. И это был риторический вопрос) В том плане, что плохо так делать. Имхо, конечно же)
Anonymous
Я про обратный пример спрашивал - на каждый запрос к БД идёт обработка через static-server. И это был риторический вопрос) В том плане, что плохо так делать. Имхо, конечно же)
ну фильтр запросов в любом случае нужно сделать, вот этим и занимается миддварка, и если видит что запрос отнсится к ней то обрабатывает отдельно
Vint
ну фильтр запросов в любом случае нужно сделать, вот этим и занимается миддварка, и если видит что запрос отнсится к ней то обрабатывает отдельно
Что подразумевается под фильтром запросов? По мне так это роутингом решается. /api/ - динамика, /public/ - статика, и т.д.
Anonymous
Сам профит от такого конвеерного подхода заключаетя в наглядности схемы обаботки любого запроса. Не нужна куча роутов (кроме некоторых исключений) не нужно на каждую таблицу делать отдельные контроллеры, если придерживаемся стандартной rest-схемы - GET | POST | PUT | DELETE /api/{table}/{id} то достаточно всего одной миддлварки чтобы обработать абсолютно все crud запросы в базе данных (правда не нужно забывать про валидацию в миддлварке перед ней) без создания кучи болерплейта
Vint
А, ну я так и написал. crud можно описать одним контроллером по /api/*, если так хочется. Остальное - отдельные хендлеры со своими мидлварами.
Vint
Т.е. показанная в примере вертикаль - в целом клёво, но не для сетапа всего express-приложения.
Таймураз
У коа нагляднее код
Anonymous
Что подразумевается под фильтром запросов? По мне так это роутингом решается. /api/ - динамика, /public/ - статика, и т.д.
зависит от приложения, у меня например еще происходит фильтрация для spa через переопределения роутов на index.html но в целом миддлварка примерно такая async function staticServer(req, res, next){ if (req.url.slice(1, 4) !== 'api' && (req.method == 'HEAD' || req.method == 'GET')) { if(req.headers && typeof req.headers.accept === 'string' && req.headers.accept.indexOf('application/json') !== 0 && (req.headers.accept.indexOf('text/html') !== -1 || req.headers.accept.indexOf('*!/!*') !== -1) && urlUtil.parse(req.url).pathname.indexOf('.') === -1)){ console.log('override path to'); req.url = '/'; } // отдача файла .... } else { await next() } }
Anonymous
Ну да, есть такая штука. У меня чуть иначе написано. Но только для dev подключается такой middleware. В production этим nginx занимается.
я от nginx отказался) Производительность ноды в отдаче статических файлов не сильно уступает nginx-у чтобы из-за этого внедрять отдельный слой на отдельной технологии с источником возможных проблем или недостатке конфигурации с необходимостью учить целую кучу документации с этой конфигурацией. Тем более что написать статический сервер на ноде (со стримами и всеми проверками) это дело ста строк кода.
hamper 𓅝
А нода http2 уже нормально поддерживает?
hamper 𓅝
Для снижения нагрузки например, коннект то один на сессию
hamper 𓅝
А ну да, nginx то к ноде все равно будет несколько коннектов делать...
hamper 𓅝
Ну и nginx удобно использовать если у тебя десяток серверов кластер и надо запросы раскидать
hamper 𓅝
Нет, зачем http2?
Например гуглобот вроде как предпочитает http2 обычному в раздаче рейтингов.
hamper 𓅝
Лучше балансер поставить нормальный
Возможно, но nginx как балансер с возможностью логгирования всех запросов неплохо работает
hamper 𓅝
И статистику удобно в stub выдает
hamper 𓅝
На проде никто не включает аксесс логи
У нас включены, по ним метрики в графите строятся через collectd tail
Roman
Оох
hamper 𓅝
Нужно знать скольлко было 200 ответов, сколько 499, сколько 5xx
hamper 𓅝
После этого логи можно удалять.
hamper 𓅝
Хотя часто приходится в них лезть и искать конкретный запрос в пределах пары часов.
hamper 𓅝
В целях каких нибудь проверок логики.
hamper 𓅝
Собственно логи хранятся только за 6 часов вроде, это как раз около 100Гб.
hamper 𓅝
А или не, это сутки 100Гб были, потом укоротили.
Denis
https://github.com/dominictarr/JSONStream крутая штука)
hamper 𓅝
А в одном проекте логи из nginx вообще клиентам выгружались.
hamper 𓅝
Там надо было соответствие значения куки и ip всего лишь, для этого nginx хватало вполне.
hamper 𓅝
А ну и параметр из запроса
Roman
Зачем nginx? Он хреновый балансер
hamper 𓅝
А кто хороший?
hamper 𓅝
Только что бы умел подробные логи писать, роутить на несколько разных бекэндов, статистику по нагрузкам отдавать, иногда обрабатывать параметры из запросов и из кук
hamper 𓅝
Иногда клиенты хотят странного )
hamper 𓅝
До бекэндов запрос может и не дойти, nginx хотя бы 499 ошибку или 5хх в лог напишет
hamper 𓅝
Клиенты например специфичные, ждут ответа в течение 100мс и отваливаются если не получают ответа.
Roman
До бекэндов запрос может и не дойти, nginx хотя бы 499 ошибку или 5хх в лог напишет
Ну вот льется тебе 300к запросов в секунду. Чем балансить?
hamper 𓅝
300к я не балансил еще )) так что не знаю, у нас небольшие нагрузки совсем, не больше 30к, с ними nginx на хиленьком сервере легко справляется.
Roman
Ну и трафика на исход 20-30гбит/с
hamper 𓅝
Такого у меня еще тоже не было ни разу, так что не знаю, у меня каждый респонс это килобайт максимум.
hamper 𓅝
Если будет что-то на столько нагруженное там и будем думать.
hamper 𓅝
А вообще да, надо бы как нибудь попробовать всякие эти haproxy и прочие, может понравятся...
hamper 𓅝
Вот сейчас по быстрому загуглил, везде почти по бенчмаркам nginx и haproxy на равне и иногда nginx выигрывает, да и настраивается nginx не сильно сложно.
Roman
nginx на проксировании нескольких гигабит начинает подтормаживать
hamper 𓅝
Ну таких нагрузок у меня не бывало еще, если вдруг будут тогда да... А так у меня даже вроде ни на одном из проектов больше 1gbit даже в локалке между сервисами не было.
hamper 𓅝
В общем на будущее запомню, может применю где нибудь.
hamper 𓅝
Неплохо, и с latency я смотрю у нее получше чем у nginx вроде, для меня это несколько важнее показатель.
hamper 𓅝
В общем конструктивненько вышло, но пора спать ))
Denis
А что насчёт haproxy vs ipvs ?
kalloc
а разве ipvs умеет OSI 7 ?
kalloc
L4 же только
kalloc
superserver.ru клевый домен?
Denis
а haproxy может?
Дмитрий
Dmytro Bondarenko: Ребята, такая проблема(я ее обошел, но чет не вьеду чё оно не работало): есть массив из объектов пр. var obj = [{a:1}, {b:2},{c:3},{a:1}, {b:2},{c:3}]. Как видно, есть дубликаты и их надо удалить. Как я сделал(когда не работало) запустил в функции форыч по объекту, и вначале функции создал список пустой. Написал еще одну функцию, которая возвращает тру или фалс в зависимости от того, есть ли объект в новом списке, и если фалс, то я пушу в новый список. В 2й функции я сразу делал проверку на длину массива, если 0, то фалс. Проблема была в том что 1я функция возвращала массив только с 1м элементом, после первого фалс, 2я функция возвращала только андефайнды, такое чувство, что они не ждали друг друга, а просто работали. Не подскажите в чем проблема? Если надо будет уод, я могу примерно его восстановить
Oleg
А при чем тут асинк? мы же про экспресс говорим или там асинки поддерживать стали?
Async языковая конструкция. Express с async отлично живет. Koa не нужен
hamper 𓅝
Async языковая конструкция. Express с async отлично живет. Koa не нужен
Ну по нагугленным бенчмаркам коа таки быстрее экспресса.
hamper 𓅝
Rtb?)
Да.
Oleg
Ну по нагугленным бенчмаркам коа таки быстрее экспресса.
Это все слёзы. Это уже вопрос масштабируемости и это задача для оркестратора и твоего кластера
Oleg
Ты ничего не сэкономишь. У тебя веб занимается тем что ждёт базу
Ilia
В rtb же другие требования и правила базы используются типо монги без сесурити мода.
Sergey
опять войс-мессаги
hamper 𓅝
В rtb же другие требования и правила базы используются типо монги без сесурити мода.
Нет никаких монг, монга тормозная как непонятно что, аэроспайк норм
Ilia
Нет никаких монг, монга тормозная как непонятно что, аэроспайк норм
Ну где как. Многие отказываются от аероспайка из-за не идеальност, хотя да монга медленнее.