- PVSM.RU - https://www.pvsm.ru -

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

От переводчика: MeteorJS [1]— открытый (MIT) фулстек JavaScript фреймворк (и клиент и сервер). Текущая версия 0.6.6.3 — в начале 2014 планируется выход версии 1.0. Публикации на хабре: 1 [2], 2 [3], 3 [4].

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

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

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

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

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

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

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

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

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

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

DDP сообщения

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

HTTP запросы

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

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

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

  • HTTP сервер
  • DDP сервер

image

HTTP сервер

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

DDP сервер

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

MongoDB и Метеор

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

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

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

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

От переводчика: если кому-то интересно, на мой взгляд лучшими ресурсами по Метеор на данный момент являются:

  1. Evented Mind [14] — обучающие скринкасты;
  2. MeteorHacks [15] — статьи и новости о Метеор;

Автор: zag2art

Источник [16]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/50665

Ссылки в тексте:

[1] MeteorJS : https://www.meteor.com/

[2] 1: http://habrahabr.ru/post/166885/

[3] 2: http://habrahabr.ru/post/204262/

[4] 3: http://habrahabr.ru/post/148648/

[5] Gmail: https://gmail.com/

[6] Trello: https://trello.com/

[7] DDP: https://github.com/meteor/meteor/blob/devel/packages/livedata/DDP.md

[8] ddp-analyzer: http://meteorhacks.com/discover-meteor-ddp-in-realtime.html

[9] вопрос: http://stackoverflow.com/questions/15059125/how-to-serve-http-requests-over-meteor

[10] connect: https://github.com/senchalabs/connect

[11] SockJS: https://github.com/sockjs/sockjs-node

[12] очень дорого обходится: http://meteorhacks.com/introducing-smart-collections.html#poll_operation_is_very_expensive_lets_discuss_why

[13] Smart Collections: http://meteorhacks.com/introducing-smart-collections.html

[14] Evented Mind: https://www.eventedmind.com/feed

[15] MeteorHacks: http://meteorhacks.com/

[16] Источник: http://habrahabr.ru/post/205878/