Как веб-приложения Node.js+Socket.io+MongoDB действительно являются асинхронными?
У меня есть хорошее веб-приложение LAMP в старом стиле. Неделю назад мне нужно было добавить механизм push-уведомлений.
Поэтому я добавил на сервер node.js+socket.io и каждые 10 секунд опрашивал базу данных MySQL, используя node.js, чтобы проверить, есть ли новые элементы: если так, я бы отправил их клиенту (s) с помощью socket.io.
Я был очень доволен результатом, даже если это не было надлежащим уведомлением в реальном времени (поскольку задержка составляет до 10 секунд).
Сейчас я собираюсь создать новое веб-приложение, которое также будет нуждаться в push-уведомлениях. Мне интересно, использовать ли тот же подход, что и первый (который я считаю более стабильным и зрелым), или использовать полностью Node.js без PHP и Apache. Что касается базы данных, я уже решил пойти на MongoDB.
Наконец, мой вопрос: если я выберу Node.js+Socket.io+MongoDB, получу ли я действительно веб -приложение практически в реальном времени? Я имею в виду, как только новая запись будет вставлена в MongoDB, произойдет ли какое-то событие, которое я смогу перехватить через node.js, проверим ли это и отправим ли клиенту уведомление, если это уместно? Или в любом случае произойдет какой-то опрос на стороне сервера базы данных и отставание, как с моим первым веб-приложением LAMP?
Смежный вопрос: можете ли вы создать в реальном времени веб-приложение на MySQL без опроса, как я делал с моим первым приложением. Или вам нужен MongoDB (или Redis)?
Я надеюсь, что этот вопрос не слишком глуп - извините, я только начинаю с Node.js и co.
Благодарю.
6 ответов
Я понимаю вашу проблему, потому что я перешел на node.js из php/apache/mysql.
Как правило, node.js стабильный, модули и ваши скрипты являются основными причинами ошибок
В режиме реального времени не имеет ничего общего с базой данных, это все о клиенте и сервере, вы можете запросить столько данных, сколько вы хотите в ваших запросах и передать их другому клиенту.
Выбирать node.js очень разумно, но его сложнее реализовать.
Когда вы вставляете новую запись в вашу базу данных, событие является самим запросом, вы сделаете push-событие вместе с запросом к базе данных, например:
// Please note this is not real code, just an example of the idea app.get('/query', function(request, response){ // Query your database db.query('SELECT * FROM users', function(rows){ // Push notification to dan socket.emit('database_query_executed', 'to_dan', rows); // End request response.end('success'); }) })
Конечно, вы можете использовать MySQL! И любая база данных, которую вы хотите, как я сказал, в режиме реального времени не имеет ничего общего с базами данных, потому что база данных находится в середине процесса, и это совершенно необязательно.
Если вы хотите использовать node.js для push-уведомлений и php / apache для mysql, вам нужно будет создать 2 запроса для каждого сервера, например:
// this is javascript ajax('http://node.yoursite.com/push', node_options) ajax('http://php.yoursite.com/mysql_query', php_options)
или если вам нужен только один запрос, или вы хотите использовать форму, вы можете позвонить своему php, а внутри php вы можете создать http или сетевой запрос к node.js из php, что-то вроде:
// this is php new HttpRequest('http://node.youtsite.com/push', HttpRequest::METH_GET);
С помощью:
- Обычная коллекция MongoDB в качестве магазина,
- MongoDB ограниченная коллекция с настраиваемыми курсорами в качестве очереди,
- Рабочий Node с Socket.IO наблюдает за Очередью как Рабочий,
- Узловой сервер для обслуживания страницы с клиентом Socket.IO и для получения POST-данных (или, в противном случае, добавления данных) в качестве Сервера.
Это идет как:
- Новые данные отправляются на сервер,
- Сервер помещает данные в Хранилище,
- Сервер добавляет ObjectID данных в Очередь,
- Очередь отправит вновь поступивший ObjectID в открытый курсор Tailable на рабочем месте,
- Работник идет и получает фактические данные в ObjectID из хранилища,
- Рабочий выдает данные через сокет,
- Клиент получает данные из сокета.
Это "толчок" от первоначального добавления данных до момента получения на клиенте - никакого опроса, так что в режиме реального времени вы можете получить время обработки на каждом шаге.
Вы обнаружили Chole? Он работает отдельно от вашего веб-сервера и взаимодействует с ним с помощью HTTP POST. Таким образом, вы можете кодировать свое веб-приложение любым удобным для вас способом.
Re: триггеры в MongoDB - пожалуйста, смотрите этот ответ: /questions/11069980/nodejs-mongodb-triggeryi/11070003#11070003
В MySQL есть гораздо более удобные триггеры, но для вызова Node.js из них потребуется немного поработать с пользовательскими функциями MySQL ( пользовательскими функциями), например, для передачи данных через сокет Unix. Обратите внимание, что это необходимо только тогда, когда другие приложения (помимо вашего процесса Node.js) обновляют базу данных, и в этом случае обязательно выберите InnoDB в качестве хранилища (блокировка на уровне строки или таблицы).
Не вижу большой проблемы с выбором технологии sockets.io
, даже если клиентские веб-сокеты не поддерживаются, вы будете возвращаться (изящно, я надеюсь) к опросу.
Наконец, ваш вопрос вовсе не глупый, так как push-технология определенно превосходит поток запросов на опрос - она лучше масштабируется. РЕДАКТИРОВАТЬ: Однако, не будет описывать ни одну технологию в режиме реального времени.
Другое РЕДАКТИРОВАНИЕ: для довольно известной и успешной установки такого рода, пожалуйста, прочитайте это: http://blog.fogcreek.com/the-trello-tech-stack/
На самом деле использование технологии Push, такой как Socket.IO, помогает вам использовать
Ресурс сервера эффективно, а также помогает вам использовать старые браузеры для современных браузеров, создающих веб-сокет или подобное веб-сокету соединение.
Опрос в 10 секунд - это HTTP-запрос, который стоит дорого, особенно, когда присутствует много пользователей.
В отличие от технологии опроса, технология push является относительно дешевой. Пользовательский клиент открывает специальный сокет (например, websocket) для прослушивания push-уведомлений сервера.
И обычно ваш клиентский JavaScript выполняет некоторые действия при получении push-уведомления.
Использование стека LAMP и Socket.IO с другим портом (отличным от 80) будет достаточно для реализации того, что вам нужно.
Но использование Node.js + MongoDB + Socket.IO на самом деле помогает вам эффективно управлять ресурсами вашего сервера.
Потому что эти три имеют неблокирующую природу.
Если вы правильно понимаете концепцию неблокирования и правильно реализуете свое приложение,
Ваше идентичное приложение, приложение с той же функцией, но с другим языком и другой базой данных, сможет обрабатывать намного больше запросов, чем обычный стек LAMP.
На картинке выше представлена известная схема сравнения неблокирующего и потокового способа обработки параллелизма.
Apache(Thread) против Nginx(неблокирующий)
MySQL - отличная база данных. Я верю что тебе не понадобится join
а также transactions
для уведомления в реальном времени.
MongoDB не имеет этих двух функций, если вы сами не реализуете подобные функции.
Из-за отсутствия этих двух и некоторых собственных характеристик MongoDB может хранить и извлекать данные намного быстрее, чем традиционные базы данных SQL.
Переключение с MySQL на MongoDB уменьшит время, необходимое для вставки и извлечения данных.
С помощью JS вы можете открыть сокет для вашего сервера (не старого браузера), на сервере будет установлена специальная программа (на специальном порту, поэтому вам нужно разрешение открыть дверь и запустить программу на вашем сервере), которая будет отправлять данные (почти) в реальном времени от и к клиенту, и без протокола HTTP-протокола overhead.old браузер просто откажется от механизма опроса.
Я не вижу другого способа сделать это (вероятно, уже есть "крутые" рамки, которые делают это)