Pull to refresh
202
0
Олег Черний @apelsyn

AI&ML Teach Lead

Send message
mysql_pconnect убыстряет установку соединения, но корень проблемы не в этом, а в том, что на каждое обращение к скрипту нужен отдельный конекшн. И когда соединений с сервером много база начинает «тупить», что еще провоцирует открытие еще большего числа одновременных соединений с базой.
Суммарное время будет равняться… суммарному последовательному времени. Он же однопоточный. Разве нет?

Конечно же нет. Инициировать запросы нода, в так называемом event loop будет последовательно, но далее будет ждать события «пришел ответ» и запускать обработчик на это событие.
Redis тоже однопоточный, как вы считаете с редисом можно работать паралельно?

А вообще интересно было бы привести реальную задачу, которую вы решили таким способом. Вот правда, ни разу еще не видел, чтобы в ветке про Ноду кто-то сказал: Асинхронность ноды помогла мне решить вот-эту-вот-ресурсоемкую-мега-задачу, и это не чатик.

Я вам привел конкретный пример, где очевидно преимущество ассинхронного программирования.

У нас, в компании, используется микросервисная архитектура, большинство микросервисов на nodejs.

На основном нашем проекте полмиллиона уникальных посетителей в день auto.ria.com. И вначале мы программировали на PHP, и это было нелекгое время.
вы искренне уверены, что асинхронность это какой-то эксклюзив для js?

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

Например у вас 10 сервисов и одна база, в ноде можно обратиться одновременно ко всем и к базе и обработать ответы или ошибки от сервисов ПАРАЛЕЛЬНО, одновременно. Суммарное время выполнения будет ровняться самому тормознутому сервису или долгому ответу от базы а не сумме обращений ко всем сервисам. Разницу чувствуете?
да, если nodejs-приложение умеет обрабатывать больше одного соединения. ибо пхп приложение скорее всего будет обрабатывать одно соединение (если там не reactphp)

nodejs однопоточный. нода будет обрабатывать абсолютно все соединения в одном потоке, при этом все обработчики могут взаимодействовать между собой. Это делает элементармым такю задачу как написание чата, например.
Все разруливается не на уровне соединений а на уровне запросов. Приложению нужно выполнить запрос он обращается к модулю mysql, тот свою очередь смотрит есть ли у него свободный конекшн. Если есть по нему проходит запрос, если нет, запрос ожидает освобождения конекшна. Для приложения эта все выглядит как обычный запрос к базе (неважно побывал он в очереди или нет).

Кроме того, ресурсы приложения, которое делает запрос используются намного оптимальнее чем при роботе с php, т.к. все запросы проходят ассинхронно, другими словами пока не возникнет событие «пришел ответ на запрос», ресурсы не заблокированы, как в случае с mysql. Для php же ожидание губительно, так как и процессорные и память, выделенная на исполнения кода, заблокированы до ответа MySQL. Поэтому nodejs-приложение, как правило, может обрабатывать намного больше одновременных соединений чем аналогичное php-приложение.
В статье не написано о том что nodejs в отличие от php не запускается при каждом запросе, от стартует и обрабатывает события. Это существенно меняет разсклад как по производительности так и по архитектуре приложений.
Многим известна ситуация «Too many connections» при работе с MySQL. Корень проблемы в том что на каждый запуск PHP скрипта устанавливается новый connection (по-другому никак). Если запросов привалило много, база уходит «в задумчивость» и это заканчивается ошибкой «Too many connections». Нода же позволяет выделить небольшой пул соединений, например, 10. И драйвер MySQL на своем уровне будет обеспечивать работу с базой приложения используя эти 10 конекшнов. При большой нагрузке, запросы будут становиться в очередь и разгребаться медленее, но приложение будет остатваться рабочим и «живым».

Ноду через модуль cluster балансировать не оптимально, для этого есть специально написанные инструменты nginx или haProxy. Поэтому по ноде тесты сомнительные.


Попробуйте так, ставим ноду 8.5
создаем index.js


var http = require("http");
var server;

server = http.createServer();

server.on('listening', function() {
    console.log(`Listening ${server._connectionKey}`);
});

var greetingRe = new RegExp("^\/greeting\/([a-z]+)$", "i");
server.on('request', function(req, res) {
    var match;

    switch (req.url) {
        case "/": {
            res.statusCode = 200;
            res.statusMessage = 'OK';
            res.write("Hello World!");
            break;
        }

        default: {
            match = greetingRe.exec(req.url);
            res.statusCode = 200;
            res.statusMessage = 'OK';
            res.write("Hello, " + match[1]);
        }
    }

    res.end();
});

server.listen(8080, "127.0.0.1");

Убираем балансировку и получаем тот же результат

Купил у них уже около 5 книг. Мне все ссылки на почту приходили, возможно у них проблема с отправкой почты на Ваш ящик. У меня ящик на gmail, с ним проблем нету.


Тут не "лохотрон" а идеализированное представление о доставке контента через электронную почту. :)

Согласно данным СБУ по вирусу Petya.A (состоянием на 21.00 по Киеву), вирус эксплуатирует уязвимость MS17-010
Там есть рекомендации и ссылки на апдейты для всех версий Windows (на украинском)

Очень впечатляет, продолжайте!

Мне понравилось, очень познавательно. Кто, хоть раз верстал рекламу или дизайнил баннер, знает, как не просто сделать обрезку волос на портрете или вырезать из фона зверюшку.

Мне стало интересно заглянуть в ядро koa и узнать, как реализована работа с Promise. Но я был удивлен, т.к. ядро осталось практически таким же, как в предыдущей версии. Авторы обеих библиотек express и koa одни и те же, неудивительно, что и подход остался таким же. Я имею ввиду структуру промежуточного ПО (middleware).

koa принципиально отличается от express и подход там совершенно другой. Работа с промисами там сводится к тому что в обработчике запроса ассинхронные функции вызываются через async/await синтакс со всеми вытекающими плюшками.


По поводу yeps-benchmark, там koa2 запускаеться через node-cluster, что на мой взгляд, не лучшее решение. И что пытаемся доказать, что роуты обрабатываються меделенее? Не спорю, но роуты это не часть koa, koa-router это сторонний middleware, роутинг не входит в базовую функциональность koa.


Про простоту и элегантность я б еще поспорил. А ошибки как ловить?

Никогда не интресовался Blockchain просто потому что для работы не нужно а для личного развития не хотел тратить на это время. Купил PDF-ку. Ликбез прошел успешно :) Интересна сама философия децетрализованых сетей.


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


Эта глубоководная рыба распространена в Атлантическом и в западной части Индийского океанов. Обитает на глубинах от 100 до 1175 метров. Розовый пилобрюх достигает в длину 42 сантиметров, имеет продолго-
ватую форму тела, большие глаза и раздвоенный хвост.
image

Еще про генераторы забыли. Они поддерживаться уже давно.

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


Недавно обновились натренированные модели для многих языков

:)
Да, действительно, почему бы не использовать бесплатный Tesseract, установить нужные языки. Для многих документов этого было бы достаточно.

Я недавно писал статью про машинное обучение на JS, там как раз очень нехватало такой теоретической части как у Вас. Я добавил линк на вашу статью. Очень хорошо и доступно получилось.

Можете посмотреть еще мою статью:
Нейронные сети на Javascript

User.findById синхронный?

В том то и дело что async/await выглядит как синхронный код а выполняется асинхронно.


Другими словами когда вы ждете ответа с базы вы не блокируете поток. В этот момент ваше приложение может обрабатвать другие запросы от пользователей.

А если вам нужно проверить не случилось ли ошибки при получении данных из базы
try {
user = await getUser();
} catch (err) {
// Error handling
}
Вы представляете во что превратиться Ваш код?


async/wait это отличная конструкция для написания человек-читаемого и легко понимаемого кода. Потому что код выглядит как синхронный а виполняется асинхронно.


Ваше заявление "С Promise получается короче" работает только для примитивных конструкций, для более сложных это не всегда справедливо

Information

Rating
Does not participate
Location
Винница, Винницкая обл., Украина
Date of birth
Registered
Activity