Веб-приложения в режиме реального времени с 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

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

  • EventEmitters

  • Streams

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

Вы можете использовать socket.io для подключения этих событий к вашему клиентскому приложению.

Ответ 3

Я бы пошел с вариантом 1 и 3, но с небольшими различиями. 1. Первый вариант для хвоста mongoDB opLog - хороший, но накладные расходы становятся очень большими в БД, где ваше приложение будет делать миллионы транзакций. Библиотека meteorJS уже делает это, и вы можете исследовать их, поскольку они зрелые и стабильные в использовании, чем написание собственных сервисов.

  1. Вариант 3 для использования socket.io. Фактически вы можете использовать socket.io для публикации изменений, а также для записи в базу данных, если вы используете rethinkDB, который поддерживает собственные изменения. Значение Native changefeeds означает, что каждый раз, когда есть запись в таблицу/коллекцию, которую вы хотите просмотреть в реальном времени, она дает обратный вызов со старыми и новыми данными, где вы можете использовать socket.io для публикации всем клиентам.
  2. Другой способ сделать это, который является более надежным решением, заключается в использовании 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 ! чтобы узнать, как автоматически синхронизировать данные с регионом.