Как веб-приложения 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-данных (или, в противном случае, добавления данных) в качестве Сервера.

Это идет как:

  1. Новые данные отправляются на сервер,
  2. Сервер помещает данные в Хранилище,
  3. Сервер добавляет ObjectID данных в Очередь,
  4. Очередь отправит вновь поступивший ObjectID в открытый курсор Tailable на рабочем месте,
  5. Работник идет и получает фактические данные в ObjectID из хранилища,
  6. Рабочий выдает данные через сокет,
  7. Клиент получает данные из сокета.

Это "толчок" от первоначального добавления данных до момента получения на клиенте - никакого опроса, так что в режиме реального времени вы можете получить время обработки на каждом шаге.

Вы обнаружили 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 браузер просто откажется от механизма опроса.

Я не вижу другого способа сделать это (вероятно, уже есть "крутые" рамки, которые делают это)

Другие вопросы по тегам