Подтвердить что ты не робот

Как Node.js + Socket.io + MongoDB webapps действительно асинхронный?

У меня есть хороший старинный LAMP webapp. Неделю назад мне нужно было добавить механизм уведомления push. Таким образом, я сделал, чтобы добавить node.js + socket.io на сервер и опросить базу данных MySQL каждые 10 секунд, используя node.js, чтобы проверить, были ли новые элементы: если да, я бы отправил их клиенту (-ам) с socket.io.
Я был доволен результатом, даже если это не правильное уведомление в реальном времени (так как есть отставание до 10 секунд).

Теперь я собираюсь создать новый webapp, которому также понадобятся push-уведомления. Мне интересно, идти ли с тем же подходом, что и первый (который, я считаю, более стабильным и зрелым) или полностью node.js, без PHP и Apache. Что касается базы данных, я уже решил пойти на MongoDB.

Наконец, мой вопрос: если я перейду к node.js + Socket.io + MongoDB, я получу действительно почти реальный, время webapp? Я имею в виду, как только новая запись будет вставлена ​​в MongoDB, произойдет ли какое-то событие, которое я могу поймать через node.js, выполнить некоторую проверку на нем и, если необходимо, отправить уведомление клиенту? Или все равно будет какой-то опрос на стороне сервера и отставании, как и в моем первом LAMP webapp?

Связанный вопрос: можете ли вы создать веб-приложение в реальном времени в MySQL без каких-либо опросов, как это было в моем первом приложении. Или вам нужен MongoDB (или Redis)?

Надеюсь, этот вопрос не слишком глупый - извините, я только начинаю с node.js и co.

Спасибо.

4b9b3361

Ответ 1

Я понимаю вашу проблему, потому что я переключился на node.js из php/apache/mysql.

  • Обычно node.js является стабильным, модули и ваши сценарии являются основными причинами ошибок

  • В реальном времени не имеет ничего общего с базой данных, все о клиенте и сервере, вы можете запросить столько запросов, сколько хотите в своих запросах, и направить их другому клиенту.

  • Выбор node.js очень мудрый, но его сложнее реализовать.

  • Когда вы вставляете новую запись в свой db, это сам запрос, вы будете делать 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);
    

Ответ 2

Использование:

  • Обычная коллекция MongoDB как Сохранить,
  • Коллекция MongoDB Capped с доступными курсорами как Очередь,
  • A Node рабочий с Socket.IO наблюдает за очередью как Рабочий,
  • Сервер Node для обслуживания страницы с клиентом Socket.IO и для получения данных POSTed (или, тем не менее, добавление данных) в качестве Сервер

Это выглядит так:

  • Новые данные отправляются на сервер,
  • Сервер помещает данные в хранилище,
  • Сервер добавляет объект ObjectID в очередь,
  • Очередь отправит вновь полученный идентификатор объекта в открытый курсор на рабочем столе,
  • Рабочий переходит и получает фактические данные в ObjectID из хранилища,
  • Рабочий выдает данные через сокет,
  • Клиент получает данные из сокета.

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

Ответ 3

Re: триггеры в MongoDB - см. этот ответ: fooobar.com/questions/236746/...

В MySQL гораздо более удобные триггеры, но для вызова Node.js из них потребуется небольшая работа с MySQL UDF (user- определенные функции), например, нажатие данных через сокет Unix. Обратите внимание, что это необходимо, только если другие приложения (помимо вашего процесса Node.js) обновляют базу данных и в этом случае обязательно выбирают InnoDB в качестве хранилища (блокировка строк и таблиц).

Не вижу большой проблемы с выбором технологии sockets.io, даже если клиентские веб-сокеты не поддерживаются, вы отступите (изящно, Я надеюсь) на опрос.

Наконец, ваш вопрос не является глупым, так как технология push определенно превосходит поток запросов на опрос - она ​​масштабируется лучше. EDIT: Однако не будет описывать ни одну из технологий как в режиме реального времени.

Еще один EDIT: для достаточно известной и успешной установки такого рода, пожалуйста, прочтите следующее: http://blog.fogcreek.com/the-trello-tech-stack/

Ответ 4

Вы обнаружили Chole? Он работает отдельно от вашего веб-сервера и взаимодействует с ним, используя HTTP POST. Таким образом, вы можете запрограммировать свое веб-приложение так, как хотите.

Ответ 5

На самом деле, используя технологию Push, например Socket.IO, вы можете использовать

ресурс сервера эффективно, а также помогает использовать старые браузеры для современных браузеров, создавая веб-соединение или соединение с веб-сайтами.

10 секунд опрос - это HTTP-запрос, который дорогой, особенно когда много пользователей присутствует.

В отличие от технологий опроса, технология push отличается относительно низкой. Клиент пользователя открывает выделенный сокет (т.е. websocket) для прослушивания уведомления на сервере.

И обычно ваш клиентский JavaScript выполняет некоторые действия при получении push-уведомления.

Использование стека LAMP и Socket.IO с другим портом (кроме 80) будет достаточно хорошим, чтобы реализовать то, что вам нужно.

Но использование Node.js + MongoDB + Socket.IO на самом деле помогает вам эффективно управлять вашим серверным ресурсом.

Потому что эти три имеют неблокирующий характер.

Если вы правильно понимаете неблокирующую концепцию и правильно выполняете свое приложение,

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


enter image description here

Выше изображение - это знаменитая диаграмма сравнения метода Non-blocking vs Thread для обработки concurrency

Apache (Thread) vs Nginx (неблокирующий)


MySQL - отличная база данных. Я считаю, что вам не нужны join и transactions для уведомления в реальном времени.

MongoDB не имеет этих двух функций, если вы не реализуете подобные функции самостоятельно.

Из-за отсутствия этих двух и некоторых собственных характеристик MongoDB может хранить и извлекать данные намного быстрее, чем традиционные базы данных SQL.

Переключение с MySQL на MongoDB уменьшит время, затрачиваемое на вставку и выборку данных.

Ответ 6

с JS вы можете открыть сокет на своем сервере (а не в старом браузере), у сервера будет ах-hoc-программа (на специальном порту, поэтому вам нужно разрешение на открытие двери и запуск программы на вашем сервере), который будет отправлять данные (почти) в реальном времени от и к клиенту, и без HTTP-протокола overhead.old браузер просто откажется от механизма опроса.

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