Веб-приложения в режиме реального времени с mongodb и nodejs
Я думал о том, как сделать веб-приложение в режиме реального времени, используя nodejs/socket.io/mongodb. Идея довольно похожа на документы google, где объекты, отредактированные на странице, издаются и перезаписываются во всех клиентских браузерах.
Каков наилучший способ сделать это? Из того, что я прочитал, я могу думать о трех способах:
1) Использование mogodb oplogs
Добавить "прослушиватель" в коллекцию mongodb, переименовать части страницы всякий раз, когда происходят изменения в коллекции (минусы: медленные?)
2) Использование локального json
Извлеките данные mongodb в json файл, используйте fs для редактирования, сохраните mongodb и удалите json, когда закончите (минусы: громоздкий, чтобы иметь дополнительный слой между базой данных и фактическим приложением)
3) Использование pure socket.io
Rerender без сохранения сохраняется только после внесения всех изменений (минусы: файлы, вероятно, не отображаются корректно во всех браузерах)
Есть ли лучший способ достичь этого? (Как работают документы Google в любом случае?) Поистине оцените любую помощь, которую любой может предложить!
Ответы
Ответ 1
В прошлом году мы создали приложение в реальном времени, в основном это инструмент для авторов, который работал на той же странице, где они могли добавлять/удалять/редактировать элементы (текст, изображения, видео и т.д.).
Мы использовали:
- Node.js, с фреймворком Hapi.js (на основе выражения)
- Socket.io
- Нет MongoDB, но это отличный RethinkDB, который по умолчанию используется в режиме реального времени и в основном использует слушателей, чтобы сообщать вам всякий раз, когда что-то изменилось. (mongoDB отстой, по нашему мнению, мы использовали его в прошлом, и он чувствует себя "никогда больше", но это наше мнение)
- React/Redux, чтобы обновить DOM только для элементов, которые изменились, Угловая с двумя способами, по нашему мнению, не сработала бы хорошо, так как несколько пользователей могут одновременно изменять одну и ту же страницу и, следовательно, повторно отображать все элементы могут потерять фокус.
И, честно говоря, это довольно удивительно, как быстро.
Ответ 2
Это легко решить без значительных осложнений и сохранения документов в базах данных. Вы должны сохранять только местоположения документа. У узла есть некоторые очень удивительные функции, созданные для такого рода приложений. Я рекомендую вам изучить следующие темы:
У файловой системы узла есть классы, которые можно использовать для создания этого для документов:
Вы можете использовать socket.io для подключения этих событий к вашему клиентскому приложению.
Ответ 3
Я бы пошел с вариантом 1 и 3, но с небольшими различиями. 1. Первый вариант для хвоста mongoDB opLog - хороший, но накладные расходы становятся очень большими в БД, где ваше приложение будет делать миллионы транзакций. Библиотека meteorJS уже делает это, и вы можете исследовать их, поскольку они зрелые и стабильные в использовании, чем написание собственных сервисов.
- Вариант 3 для использования socket.io. Фактически вы можете использовать socket.io для публикации изменений, а также для записи в базу данных, если вы используете rethinkDB, который поддерживает собственные изменения. Значение Native changefeeds означает, что каждый раз, когда есть запись в таблицу/коллекцию, которую вы хотите просмотреть в реальном времени, она дает обратный вызов со старыми и новыми данными, где вы можете использовать socket.io для публикации всем клиентам.
- Другой способ сделать это, который является более надежным решением, заключается в использовании rabbitMQ, как, например, Павел.
Ответ 4
Если бы я это сделал, я бы, наверное, использовал смесь. Redis или rabbitmq, чтобы управлять списком соединений socket.io, чтобы как можно быстрее выполнить поведение публикации и подписки с заданием таймера, которое периодически сбрасывает записи документа в mongodb для обеспечения более долговременной настойчивости, хотя, возможно, вы можете оставить все документы в Редисе, если хотите.
Ответ 5
"Создание совместного приложения для редактирования документов" на самом деле является главой в книге "Освоение Node.js". Они используют:
Кроме того, MongoDB недавно опубликовал технический документ о потоке данных с Apache Kafka для обеспечения возможности в реальном времени: https://webassets.mongodb.com/kafka_and_mongodb.pdf
Ответ 6
Я думаю, синхронизация данных с помощью socketIO - лучший способ... Отправлять данные в mongo с помощью emit. Прослушайте изменения в базе данных, используя сокет, и перепишите свою страницу с этими изменениями.
Вы также можете посетить nodejs realtime mongodb ! чтобы узнать, как автоматически синхронизировать данные с регионом.