Meteor 0.7.0: масштабируемые запросы к базе данных с использованием oplog MongoDB вместо опроса и сравнения

Сегодня мы выпускаем Meteor 0.7.0 с новым драйвером активной базы данных, который использует журнал репликации базы данных MongoDB для более эффективного отслеживания запросов без повторного запроса базы данных при каждом обновлении. Эта новая реализация, известная как oplog tailing, знаменует собой начало перехода от нашей исходной архитектуры опроса к схеме, которая будет линейно масштабировать нагрузку запросов в реальном времени между несколькими серверными процессами Meteor и MongoDB.

Замена нашего оригинального драйвера опроса была в нашей дорожной карте с самого начала проекта. Текущий подход — написанный как доказательство концепции для поддержки нашей работы с остальной частью нашего реактивного стека — не мог масштабироваться при определенных рабочих нагрузках и никогда не предназначался для использования в больших производственных приложениях. Во всяком случае, мы удивлены, как далеко это нас завело!

Чтобы обновить приложение до версии 0.7.0, просто запустите meteor update в каталоге вашего проекта. Вы также можете попробовать приложение на 0.7.0 перед его обновлением, запустив meteor --release 0.7.0. Если вы новичок в Meteor, вы можете сразу приступить к работе с OS X или Linux, запустив

$ curl https://install.meteor.com | /bin/sh

в окне вашего терминала.

Драйвер базы данных Oplog

Запросы в реальном времени, которые выполняются непрерывно и наблюдают за изменениями исходного результата в базе данных, являются важным элементом Meteor. Функции публикации на сервере обычно используют оперативные запросы для передачи обновлений базы данных подписанным клиентам в режиме реального времени. В браузере оперативные запросы в minimongo вызывают перерисовку реактивных шаблонов Meteor.

Предыдущие версии сервера Meteor поддерживали оперативные запросы с использованием стратегии «опрос-и-дифф»: когда сервер считает, что запрос к базе данных мог измениться, он запрашивает сервер MongoDB, а затем вычисляет разницу между текущим и предыдущим результатом запроса. Некоторые запросы, особенно с большими наборами результатов или с частыми обновлениями, вызывали повторный запрос, были особенно дорогими и сложными для масштабирования.

Новый драйвер активной базы данных, который поставляется в версии 0.7.0, может вычислять результаты некоторых запросов вообще без повторного запроса к серверу MongoDB, а в других случаях может вычислять обновления, выполняя более целенаправленный запрос к базе данных. Кроме того, запросы, поддерживаемые динамическим драйвером, теперь мгновенно обнаруживаются и отражаются в Meteor, независимо от того, исходят ли они от одного и того же процесса сервера Meteor, отдельного процесса сервера Meteor или любого другого модуля записи базы данных.

Чтобы сделать все это возможным, Meteor теперь использует весь «журнал операций» MongoDB, скользящую запись каждой модификации, сделанной сервером MongoDB. Драйвер использует расширение minimongo, нашу нативную JavaScript-реализацию языка селекторов MongoDB и первый в своем роде механизм запросов в реальном времени, который извлекает события added, changed и removed из сообщений oplog и любую необходимую дополнительную информацию, запрашиваемую у сервер MongoDB.

Meteor 0.7.0 использует драйвер oplog для запросов, селекторы которых используют проверку на равенство со скалярами (строками, числами, логическими значениями, ObjectID или null). Это первый набор запросов, в которых мы проверили исходный код minimongo, чтобы убедиться, что его поведение точно соответствует собственной реализации MongoDB. Другие запросы, включая те, которые используют $-операторы, проверки на равенство объектов или массивов, геопространственные операторы, а также параметры ограничения и пропуска, по-прежнему обслуживаются существующим драйвером опроса и сравнения. Мы переместим многие из этих операторов в драйвер oplog перед Meteor 1.0.

Отслеживание Oplog автоматически включается в режиме разработки. Чтобы использовать его в производственной среде, вам понадобится сервер MongoDB, настроенный как набор реплик, и доступ к его оплогу. Включите работающий драйвер в рабочей среде, установив переменную среды MONGO_OPLOG_URL.

Чтобы узнать больше об этой работе, см. заметки в вики и посмотрите Devshop talk Дэвида Глассера.

Дополнительные изменения в 0.7.0

Meteor 0.7.0 содержит исправление для ошибки в Node 0.10, которая чаще всего влияет на WebSockets. Патч против Node версии 0.10.22 и 0.10.23. Мы настоятельно рекомендуем использовать одну из этих точных версий Node в производственной среде, чтобы применить исправление. Если вы используете будущую версию Node, Meteor не применит патч и вместо этого отключит WebSockets.

На сервере мы добавили новый Meteor.onConnection API, который можно использовать для хранения данных, связанных с отдельными клиентами, между подписками и вызовами методов. Подробности смотрите в документации.

Новый пакет autoupdate улучшает отправку горячего кода за счет использования стандартных сообщений DDP вместо жестко заданного сообщения при запуске DDP. Изменения кода только для сервера больше не обновляют клиент.

Meteor 0.7.0 включает множество других изменений, не упомянутых здесь. Подробности смотрите в полных примечаниях к выпуску. Патчи предоставлены пользователями GitHub AlexeyMK, awwx, dandv, DenisGorbachev, emgee3, FooBarWidget, mitar, mcbain, rzymek и sdarnell.

Наслаждайтесь курортным сезоном. Увидимся в 2014 году.