Как 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.
Спасибо.
Ответы
Ответ 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 браузер просто откажется от механизма опроса.
Я не вижу другого способа сделать это (возможно, есть уже "мокрые" рамки, которые это делают)