Как устроен Meteor изнутри

Original author: Jon James, Aloka Gunasekara
  • Translation
От переводчика: MeteorJS — открытый (MIT) фулстек JavaScript фреймворк (и клиент и сервер). Текущая версия 0.6.6.3 — в начале 2014 планируется выход версии 1.0. Публикации на хабре: 1, 2, 3.

В статье обзор сетевой архитектуры Метеор-приложения.

Метеор как сервер, Метеор как клиент


Приложение Метеор, с точки зрения браузеров, прокси-серверов, маршрутизаторов и других сетевых компонентов, является, по сути, обычным веб-приложением. Хотя, на самом деле, Метеор-приложение состоит из двух главных частей: часть, которая работает внутри браузера и часть, которая работает как сервер. Эти две части настроены таким образом, чтобы взаимодействовать друг с другом способом, характерным для многих современных веб-приложений (таких, как Gmail или Trello)

image
Метеор позволяет разработчикам создавать приложения не заботясь о сложностях клиент-серверного взаимодействия.

Метеор обрабатывает три типа запросов


Если копнуть поглубже, Метеор обрабатывает три типа запросов. Вот они:

  • статические файлы
  • сообщения по протоколу DDP
  • HTTP запросы

Статические файлы

Статические файлы — это картинки и другие подобные ресурсы из папочки /public. Метеор обрабатывает эти файлы автоматически при запуске.

Дополнительно, Метеор минифицирует и склеивает все JavaScript (включая шаблоны, которые предварительно компилируются в JavaScript) и CSS файлы, отдавая их как статические.

DDP сообщения

DDP — это протокол, который Метеор использует для взаимодействия клиентской и серверной части. Все клиентские подписки на данные, удаленный вызов процедур и операции MongoDB — все это происходит с использованием протокола DDP. При этом — это достаточно легковесный протокол. Сообщения можно просматривать при помощи удобного инструмента — ddp-analyzer.

HTTP запросы

Не смотря на то, что в официальной документации пока еще нет информации об этом, Метеор может обрабатывать HTTP-запросы, подобно другим обычным приложениям. Например, загрузка файлов обрабатывается Метеором, как HTTP-запросы. Прочтите вопрос на StackOverflow, чтобы узнать подробности.

Внутри у Метеора два сервера


Хотя Метеора прослушивает только один порт, внутри он работает, как два отдельных сервера:
  • HTTP сервер
  • DDP сервер
image
HTTP сервер

HTTP сервер используется для передачи статических файлов и обработки HTTP запросов. Для этих целей в Метеор используется connect Node.js модуль.

DDP сервер

DDP сервер обрабатывает все публикации данных, MongoDB операции и Метеор методы. Метеор использует SockJS, в качестве транспорта. По существу, DDP — это SockJS сервер, доработанный Метеор.

MongoDB и Метеор


Можно масштабировать Метеор HTTP и DDP серверы, запустив несколько экземпляров Метеор, подключенных к одной и той же MongoDB базе, но результат не будет идеальным. Это из-за того, каким образом Метеор опрашивает MongoDB на изменения — если один экземпляр Метеора обновил данные в MongoDB, может пройти несколько секунд прежде, чем остальные экземпляры увидят это обновление и распространят его подключенным пользователям.

Чтобы проиллюстрировать это, представьте, что два экземпляра Метеор (А и Б, с соответствующими HTTP и DDP серверами в каждом) обслуживают один и тот-же чат. Перед ними находится прокси-сервер, случайным образом подключающий пользователей к одному из этих экземпляров. Если кто-нибудь, подключенный к экземпляру A, напишет сообщение в чат, пользователи подключенные к экземпляру Б не увидят его в реальном времени, им придется ждать несколько секунд, пока сервер Б не осознает изменение и не распространит его в их браузеры.

В следующих статьях, я покажу, как настроить Метеор и MongoDB, чтобы избавиться от этого эффекта.
Такая логика опросов очень дорого обходится, чтобы ее можно было использовать на рабочем сервере, лучшим решением было бы задействовать MongoDB Oplog. В Метеор 1.0 так и будет, пока же можно использовать Smart Collections.


От переводчика: если кому-то интересно, на мой взгляд лучшими ресурсами по Метеор на данный момент являются:
  1. Evented Mind — обучающие скринкасты;
  2. MeteorHacks — статьи и новости о Метеор;


П.С. На хабре появился новый хаб: Meteor.JS — подписывайтесь.
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 16

    +6
    Да, кстати, напомню — завтра (суббота, 14 декабря 2013) на сутки будет открыта для изучения книга Discover Meteor. Подробнее здесь.
      +1
      Спасибо за статью! Ждем продолжения, фреймворк очень интересный!
      Попробовал сделать небольшое приложение на метеор, все оказалось более чем просто, но возник вопрос — какой модуль лучше использовать для работы с изображениями, например, создание миниатюр (thumbnails) и водяных знаков?
        +1
        Выбирайте любой npm-модуль. Метеор с ними отлично ладит.
          +1
          Супер, спасибо! Он нравится мне все больше и больше :)
            0
            Для тех, кто не понял, почему по ссылке выше мы только пишем зависимости в packages.json, и не устанавливаем их затем по старинке через npm install — надо идти дальше по шагам и подправить код, вызвав зависимость через Meteor.require('пакет');, после чего запустить meteor как обычно. Во время запуска он и установит указанные пакеты. Делал это при выключенном метеоре и сначала не понял, почему нет пункта про установку. Очевидно, это сделано для живой перезагрузки. Т.е. не выключая сервер, можно даже установить пакет. Очень удобно для обновления сайта.
          +1
          > Ждем продолжения, фреймворк очень интересный!

          Сам фреймворк жутко интересный, но, как выясняется, неблагодарное это дело. Как ни напишу статью о Метеор на хабре — сливается карма.
            0
            Вы, главное, пишите, а карму мы выровняем.
          0
          Вопрос от тех, кто на бронепоезде: Meteor научился изолировать сессии? Насколько помню — с клиента можно было запросто удалить любую коллекцию.
            +1
            Научился, начиная с 0.5 версии.
            Для каждой коллекции можно написать специальные конструкции (в серверной части), которые ограничивают доступ.
            +2
            Почему MongoDB?
              +1
              Наверное, потому что JavaScript-у он роднее. MySql собираются пришивать в 1.1+ версии. То есть уже после выхода стабильного релиза на монге.
              +1
              Давно использую идею централизованного хранилища данных на клиенте в виде самописной библиотеки.
              Но сейчас, под новые задачи, пишу реализацию этой идеи под особенным соусом.

              Краткое резюме:
              • Схемы из mongoose.js для работы с документами (создание, валидация);
              • Подписка на изменение документов (используем наблюдателей knockout.js и геттеры/сеттеры)
              • Привычные методы из mongoose.js (findById, findByIdAndRemove и тд.) для выборки документов и возможно будет доступна мощь mongodb подобных запросов (буду смотреть на реализацию minimongo для метеора)
              • Отдельным пунктом идёт работа с сервером (тут я еще не определился, у меня уже есть зачаток библиотеки для удобной работы с api сервера, наверное её и буду дорабатывать). Эта часть будет идти дополнительной надстройкой над хранилищем, потому что она не всем нужна из коробки.

              В итоге получается похожее на mongodb хранилище документов на клиенте с валидацией данных и поддержкой серверного api для проектов, использующих knockout.js
                +1
                Согласен тема интересная. Идея так и витает в вохдухе.
                  +1
                  Я уже реализовывал подобную идею, только там не было схем данных и валидации, да и упор там был на использование этого добра через api, а сейчас хочу сместить фокус на сторону данных, как это сделано в метеор и mongoose.js. Должно получится очень хорошо, хотя бы потому что делается это для решения реальных задач. Как будет что показать, выложу на гитхаб и, наверное, напишу статью на хабре, ведь качественных реализаций не так много, да и вдруг кому полезным будет.
                    +1
                    Ок. Держи в курсе
                      0
                      Хорошо.

              Only users with full accounts can post comments. Log in, please.