Статьи

Учебное пособие: Масштабирование Метеора с помощью MongoDB Oplog Tailing

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

Метеоритный Оплог Хвост Обзор

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

«Локальная» база данных содержит оплог MongoDB

Журнал операций MongoDB хранит текущие записи всех вставок, обновлений и удалений. Этот журнал хранится в специальной базе данных, называемой «локальной», которая существует на каждом члене набора реплик и не реплицируется.

Из документации MongoDB к оплогу : «MongoDB применяет операции базы данных к первичному серверу, а затем записывает операции в оплог первичного сервера. Затем вторичные члены копируют и применяют эти операции в асинхронном процессе. Все члены набора реплик содержат копию оплога ».

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

Метеор Оплог Учебник по хвостохранилищу

Мы взломали наш собственный пример, используя хвост оплога Meteor с базой данных, размещенной на MongoLab ( не волнуйтесь, вы все равно можете использовать это руководство, даже если вы не используете MongoLab) . Вот ссылка на репозиторий этого примера проекта на GitHub .

Чтобы дать вам представление о том, чего мы пытаемся достичь, мы настроим простое приложение Meteor, которое отображает список игроков и их результаты. Приложение также будет иметь форму ввода для вставки новых игроков и оценки, чтобы показать обновления в реальном времени в представлении клиента.

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

Метеоритный сервер. Вывод фактов. Вывод хвостов оплогов включен слева, хвостов справа нет.

Предпосылки

В этом уроке мы предполагаем, что у вас есть:

  • база данных MongoDB (с доступом к «локальной» базе данных)

    • ваше собственное развертывание MongoDB ИЛИ
    • любая платная подписка с MongoLab (от 15 долларов в месяц)
  • Node.js установлен
  • Метеор установлен

Настройте проект

Сначала создайте проект Meteor.

> meteor create app

Затем перейдите в свое приложение, чтобы начать изменение файлов проекта.

> cd app

Теперь мы удалим пакет «autopublish», который не рекомендуется для производственного использования.

> meteor remove autopublish

Мы также хотим запустить пакет «факты», который содержит информацию в реальном времени о нашем сервере Meteor. Это поможет нам определить, работает ли oplog-tailing.

> meteor add facts

Настроить вид

Сначала мы определим представление для отображения релевантного контента для клиента. Мы отредактируем наш файл app.html, чтобы он выглядел следующим образом:

<head>
  <title>app</title>
</head>

<body>
  <div>
    <!-- Players template to display all players in database -->
    {{> players}}
  </div>
  <div>
    <!-- User input form to add players -->
    {{> form}}
  </div>
  <div>
    <!-- Real-time metrics to confirm oplog tailing -->
    {{> serverFacts}}
  </div>
</body>

<template name="players">
  <h1>List of players</h1>
    <ul>
      {{#each scorers}}
        <li>
          <div>
            Name: {{ this.name }}
          <div>
          <div>
            Score: {{ this.score }}
          </div>
        </li>
      {{/each}}
    </ul>
</template>

<template name ="form">
  <form id="myform">                       
    Name: <input type="text" name="name"/>
    Score: <input type="number" name="score"/>
    <input type="submit" id="submit"/>
  </form>
</template>

Вы заметите, что файл содержит обычный HTML-код и язык шаблонов Meteor, Пробелы (по мотивам Handlebars). В теле мы выложим то, что мы хотим, чтобы пользователь видел: список игроков с их счетами, форму для добавления новых игроков и метрики «serverFacts».

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

Теперь, когда у нас есть шаблоны, нам нужно их настроить. Мы настроим шаблон «игроки», чтобы перебрать всех игроков и перечислить их имена и оценки. Шаблон «формы» также прост — настройте его так же, как HTML-форму.

Создать модель

Теперь мы создадим новый файл models.js в каталоге нашего проекта, чтобы указать коллекцию для хранения наших документов.

Players = new Meteor.Collection("players");

Наша модель Players отображает коллекцию «Players» в вашем MongoDB. Вам не нужно создавать эту коллекцию заранее, поскольку MongoDB будет лениво создавать ее для вас (она еще не существует) после вставки документа.

Соедините вместе клиент, сервер и MongoDB

Чтобы в представлении клиента (браузера) отображались все игроки, нам нужно запросить их в нашей базе данных и передать курсор клиенту. Мы заменим файл app.js по умолчанию, чтобы он выглядел следующим образом:

if (Meteor.isServer) {
  Meteor.publish("playerData", function() {
    return Players.find();
  });
  
  // Set which users can see server metrics
  Facts.setUserIdFilter(function () {
    return true;
  });
}

if (Meteor.isClient) {
  Meteor.subscribe("playerData");

  // Pass query results to the "players" template
  Template.players.scorers = function () {
    return Players.find();
  };

  // Grab user input fields
  Template.form.events({
    'submit form' : function (event, template) {
      var name = template.find("input[name=name]").value;
      var score = template.find("input[name=score]").value;

      // Do input validation
 
      // Insert into database
      var data = { name: name, score: score };
      Players.insert(data, function(err) {
        if(err) throw err;
      });
    }
  });
}

Начиная сверху, у нас есть код на стороне сервера. При этом используется метод публикации Meteor для связи клиента и сервера; мы рассмотрим тонкости метода публикации в следующем разделе. Мы также настроили код, необходимый для публикации метрик сервера в шаблоне «serverFacts», который мы создали в нашем файле app.html.

Затем у нас есть код на стороне клиента. Подобно методу публикации в коде на стороне сервера, здесь мы используем метод подписки Meteor , который мы также рассмотрим в следующем разделе.

Затем мы создаем вспомогательную функцию шаблона, которая запрашивает модель Players и передает курсор в представление клиента (браузера). Это позволяет шаблону «Players» из нашего представления (файл app.html) перебирать все возвращаемые проигрыватели и отображать их в представлении.

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

Изучите методы публикации и подписки Meteor

Чтобы полностью понять, что делают методы публикации и подписки Meteor, важно отметить, что в отличие от других приложений (Rails, Django и т. Д.) Приложения Meteor работают как на сервере, так и на клиенте . Эта архитектура позволяет Meteor отправлять необработанные данные клиенту (данные по проводам) и мгновенно получать к ним доступ, не дожидаясь двусторонней передачи на сервер. Meteor гарантирует, что данные клиента и сервера (которые вы укажете) синхронизированы.

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

Раньше единственной стратегией Meteor для наблюдения за изменениями было частое повторное выполнение запроса и вычисление разницы между каждым набором результатов. С появлением класса OplogObserveDriver Meteor теперь может считывать изменения из оплога.

Возвращаясь к нашему примеру, мы публикуем набор записей с именем «playerData». После того как вы опубликовали запрос в наборе записей playerData, вам нужно прослушать или подписаться на этот набор записей на стороне клиента. Метод подписки в нашем клиентском коде указывает серверу отправлять этот конкретный набор записей клиенту, который хранится в клиентской базе данных под названием MiniMongo.

Теперь, когда данные в нашей MongoDB изменяются для нашего запроса игроков, наше представление должно отражать эти изменения в режиме реального времени и с минимальными затратами на базу данных.

Настройте приложение

Мы почти там! Затем вам нужно собрать пакет, а затем распаковать проект, чтобы настроить приложение.

> meteor bundle app.tgz

> tar -zxvf app.tgz

Создать «локальную» базу данных пользователя

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

Если вы используете MongoLab , вы можете посетить наши документы, чтобы найти инструкции по созданию «локальной» базы данных пользователя .

Как только вы закончите, обязательно скопируйте URI MongoDB для вашей «локальной» базы данных для следующего шага.

Запустите приложение

Установив учетные данные, вы можете запустить приложение с помощью следующей команды:

> PORT=3000 MONGO_URL=<your_uri> MONGO_OPLOG_URL=<your_local_uri> node bundle/main.js

В MONGO_URL указывает на базу данных MongoDB , что ваше приложение считывает и записывает, в то время как MONGO_OPLOG_URL следует указать на свой «локальный» базы данных (которая содержит oplog).

Смотрите разницу в режиме реального времени!

Когда ваше приложение будет запущено, мы сможем проверить, работает ли хвост оплога. Опять же, мы настоятельно рекомендуем прочитать вики Meteor на драйвере Oplog Observe, чтобы вы поняли основные детали.

Чтобы проверить, включен ли хвост оплога, вам нужно убедиться, что метрика наблюдений-драйверов-опл-ов отображается и метрика наблюдения-драйверов- 0 равна 0 или не отображается вообще. Эта разница тонкая, но очень важная!

Для дополнительного удовольствия клонируйте свое приложение и запустите несколько копий одновременно, чтобы видеть обновления в реальном времени между одновременными клиентами. Я рекомендую запустить одну копию вашего приложения с оплогами и одну без. Чтобы запустить приложение без хвостов оплога, просто пропустите в команде параметр MONGO_OPLOG_URL .

> PORT=3000 MONGO_URL=mongolab_uri node bundle/main.js

Получите максимум от своего MongoDB на Meteor

В дополнение к этому уроку мы настоятельно рекомендуем посмотреть выступление Дэвида Глассера Devshop 10 о хвостах оплогов . Он четко формулирует историю вопроса, проблему и решение и предоставляет отличные наглядные примеры.

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