Рубрики
Без рубрики

Я бегаю Meteor в масштабе в течение года сейчас. Вот что я узнал.

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

Автор оригинала: FreeCodeCamp Community Member.

Эли Штайнбок

Год назад я написал статью, описывающую Мой первый опыт масштабирования Meteor Отказ Короче, я создал популярный сайт Fantasy Football, использующий Метеор Отказ В определенный момент мой сервис начал замедляться. Один сервер, который я управлял, игра больше не может обрабатывать нагрузку. Я смог решить эти вопросы раннего масштабирования – среди прочего – добавление дополнительных серверов.

Ну, когда прибыл новый лето новый сезон футбола, я еще раз столкнулся с масштабированием вопросов. Добавление большего количества серверов только не решит эти проблемы. Но мне удалось их преодолеть.

Эта статья объяснит вещи, которые я узнал на этот раз, сломался на шесть частей практических советов.

Одна вещь, которая изменилась с момента моей последней статьи, заключается в том, что группа Development Meteor наконец выпустила Галактика Что дает вам Meteor Hosting на 29 долларов за контейнер в месяц. Это не включает в себя хостинг базы данных, но вы можете использовать что-то вроде Составить или MLAB для этого. В качестве альтернативы, вы можете самосовещать базу данных на AWS или Digitalocean Отказ Это будет дешевле, но потребует больше работы с вашей стороны.

Я сам пользуюсь Digitalocean для хостинга. Сайт работает на 5 долларов в месяц, 512 МБ капельки с одним экземпляром Meteor работает на капель. Я использую Meteor Up (MUP) для развертывания и составления Compose.io для хостинга базы данных.

Стоит ли идти с наливойке или галактикой, зависит от вас. Galaxy сделает кучу материала для вас и сэкономит вам время. Переход на цифровой маршрут сэкономит вам 24 доллара за контейнер в месяц. Для многих компаний, идущих с галактикой, самым смыслом, так как заработная плата разработчика будет гораздо дороже. В любом случае я оставлю вам деловые решения до вас.

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

Краткое описание извлеченных уроков

Вот главные уроки, которые я узнал из моего года масштабирования:

Урок № 1: Индексы Mongodb являются супер важными!

Урок № 2: Имея слишком много экземпляров Meteor – это проблема!

Урок № 3: Не беспокойтесь о масштабировании Nginx.

Урок № 4: Отключите пользователей, когда они отсутствовали на некоторое время

Урок № 5: Griggs находится в огне

Урок № 6: Возьми тьму от того, как они масштабировали покемонов

Давайте пройдемся через это один за другим.

Урок № 1: Индексы Mongodb являются супер важными!

Так что это была любительская ошибка. Каждая статья о масштабировании Meteor (или Mongodb) говорит вам использовать индексы. И я сделал! Но один индекс отсутствовал, и я сгорел за это – действительно сожжено – на самую важную ночь года для нас.

Объясняя индексы в качестве примера. Если у вас есть 10 000 баллов игроков и хотите найти наивысший балл, в обычном случае Mongo должен будет пройти все эти оценки, чтобы найти самый высокий. Если у вас есть индекс на счет, то Mongo сохраняет копию всех баллов в порядке по возрастанию, либо убыванию, и найдет самый высокий балл в доле времени. Вы можете прочитать больше о индексах на MongoDB Сайт Отказ

В метеорном проекте я рекомендую иметь один publications.js Файл, который содержит все ваши публикации. Ниже каждая публикация вы должны иметь код, который создает необходимый индекс для каждой публикации. Код для создания индекса в METEOR выглядит что-то это:

Meteor.startup(function () {    Teams._ensureIndex({ userId: 1 });});

_id Поле имеет индекс по умолчанию, поэтому вам не нужно беспокоиться об этом.

Попасть в детали. Я использую Сочинять для хостинга Mongodb. Они были в порядке, и поддержка также была в порядке, но не слушайте их, когда они думают, что все ваши проблемы могут быть решены, добавив больше RAM. Это не верно. Это может иногда работать, но в моем случае это было просто ерундым советом.

Я использую Kadira.io Для мониторинга производительности. Каждое приложение Meteor должно использовать Kadira, а базовый пакет отлично и бесплатный, поэтому нет причин не. (Обновление: Kadira в настоящее время все еще очевидный выбор для приложений Meteor, но команда позади Кадира недавно отошла от Meteor, поэтому остерегайтесь этого на будущее.)

В Кадире я видел такие графики, как эти:

В определенной точке PUBSUB и методы отклика от отклика становятся смехотально большими. Что-то выше 1000 мс, чтобы ответить проблематично. Даже 500 мс отклика может быть плохо. Но 10-20 секунд в качестве среднего времени отклика в течение часа прямо в основном означает, что ваши пользователи ненавидят вас, и ваше приложение едва работает на них.

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

Итак, на данный момент, что вы делаете, это вы карабкаете вокруг Google и Spam Stackoverflow и Meteor Forums Отказ

В конце концов я приземлился на этот драгоценный камень в панелях Kadira:

От этого мы видим, что база данных вечно отвечает. Добавление большего количества экземпляров Meteor не собирается помочь нам здесь. Нам нужно разобраться в Монго.

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

Ответ пришел от посещения Compose.io в пиковые времена. На приборной панели вы можете взглянуть на текущие ops (текущие операции), которые работают в любой момент. Я видел что-то вроде этого (но намного хуже):

Я понятия не имел, что было все этому Мумбо Jumbo, но вы увидите, что каждый OP имеет secs_running поле. На изображении выше он говорит 0 секунд для всего, что отлично! Но то, что я видел во время пика, было 14 секунд, 9 секунд, 10 секунд … для разных операций, которые продолжались! И все было приехать из того же запроса, сделанного моим приложением.

Я провел этот запрос сам, и это действительно забрало что-то вроде 16 секунд, чтобы получить ответ! Нехорошо! И пробегая его с объяснением (как некоторые на форумах метеорных форумов) показали, что 180 000+ документов отсканированы! Вот один из проблемных запросов:

Во всяком случае, вот и вот, нет индекса, установленного для этого запроса. Я добавил следующие индексы:

Meteor.startup(function () {    HeadToHeadMatches._ensureIndex({ team1Id: 1, gameweek: 1 });  HeadToHeadMatches._ensureIndex({ team2Id: 1, gameweek: 1 });});

После этого вся база данных начинает быстро действовать снова. Этот проблемный запрос замедлялся всю базу данных!

Урок № 2: Имея слишком много экземпляров Meteor – это проблема!

Поэтому, как только вы узнаете, как масштабировать на несколько экземпляров, вы надеетесь, что это конец всех масштабирующих страданий. Увы, это не так. И добавление слишком много серверов повредит производительностью в определенной точке.

Это потому, что Mongo использует дополнительную оперативную память для каждого соединения с базой данных. У меня должно было быть около 60-70 экземпляров, связанных с моей базой данных в какой-то момент, и Mongo не понравилось, и мне не нужно так много. Метеорские экземпляры не было узким местом для производительности.

Вы можете дать Mongo больше RAM, конечно, но просто осторожно, что происходит, когда вы продолжаете добавлять больше серверов. Вы можете принимать загрузку каждого экземпляра METEOR, но вы добавляете груз в Mongo, создавая новое узкое место.

Урок № 3: Не беспокойтесь о масштабировании Nginx

Одна вещь, которую я беспокоился об этом лете, это то, что Nginx будет моим узким местом. Это редко бы редко. Nginx должен иметь возможность обрабатывать тысячи параллельных пользователей без проблем.

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

Некоторые основные моменты из статьи, которые стоит использовать немедленно:

Выключите журналы доступа:

Рабочие процессы и соединения:

Урок № 4: Отключить пользователей IDLE

Этот важен! Я не знаю, почему это не большая вещь в сообществе Meteor!

Отсоедините пользователей, когда они только что оставили свою вкладку. Это так просто сделать и спасает драгоценные ресурсы.

Чтобы отключить автоматически, вы можете использовать этот пакет: Mixmax: Smart-Disconnect.

Урок № 5: Griggs находится в огне

Если вы получили это далеко на посте, вы, вероятно, чувствуете себя супер вдохновленным и в настроении для футбола. Я представляю вам воле Griggs:

Здесь на самом деле не было смысла. Это, казалось, на этот момент в статье написана подходящая вещь. Но если мы действительно хотим выучить урок от этого, то здесь идет:

Если вы соло-разработчик, и у вас есть тысячи людей, которые полагаются на ваше приложение на работу прямо сейчас Вещи могут стремиться. Мой совет вам (и себе): успокойся черт возьми. Слушай, что некоторые будут Григгс в огне. Надеюсь, вы будете работать, и даже если вещи борются, это, вероятно, не так плохо, как вы думаете.

Покемон Go был довольно ужасен в начале. Серверы постоянно перегружены, но люди продолжали возвращаться, чтобы играть. С точки зрения бизнеса, Niantic все еще сделала убийство. Сдача теперь умерла, но это не имеет ничего общего со своими вопросами масштабирования, или многие ранние ошибки. Это только конец присяга.

Таким образом, урок жизни, слушай, будет Григгс, когда вы стремитесь.

Урок № 6: Возьми тьму от того, как они масштабировали покемонов

На тему покемона иди, давайте немного поговорим о том, что случилось. Во-первых, покемонов идет не случится с тобой. У Pokemon Go провел сильную команду бывших гугулеров, которые знали, как сделать дело с огромными грузами, но даже они попали с популярностью приложения. Они были готовы к большой нагрузке, но не нагрузки размер твиттера.

Некоторые приложения вокруг Pokemon идут также выскочили. Pokemon Go Chat Apps, и Pokemon Go Instagrams начал появляться и стало очень популярным, очень быстро с миллионами пользователей в течение нескольких дней. Некоторые из этих приложений были разработаны сольными разработчиками и обработанием нагрузки было для них проблемой.

Есть Эта статья О том, как кто-то построил приложение Pokemon Go Instagram с 500 000 пользователей через 5 дней и запустил его на сервере 100 долларов в месяц. Это поразительно. И вынос из статьи состоит в том, что вы можете построить быстрый MVP, который масштабируется, если вы знаете, что вы делаете.

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

Если вы можете построить вещи правильным способом от GET, это определенно плюс, и это, безусловно, стоит просить более опытных разработчиков для советов, чтобы попытаться получить вещи прямо с самого начала. Но не позволяйте страху масштабирования удерживать вас от создания приложения вашей мечты. Грубая реальность заключается в том, что люди, вероятно, не понравятся вашему приложению, и это будет впечатляющим, если вы можете получить 100 человек, чтобы использовать его.

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

Заглядывая вперед

Эти эпизоды, касающиеся масштабирования, были бремя и в идеале, я бы предпочел бы не иметь дело с этими вопросами. Было бы здорово, если бы дела только что сработало, и вы могли бы отталкивать проблемы масштабирования как можно дольше. Из-за этого я начал смотреть на другие платформы, которые обрабатывают масштаб лучше.

Одна такая платформа является эликсиром, который построен на Эрланге. Erlang – это то, что WhatsApp использует и позволила команде 35 инженеров масштабироваться до 450 миллионов пользователей! Даже сегодня, с близкими к 1 миллиардам пользователей, WhatsApp имеет команду всего 50 инженеров! Это довольно невероятно, и вы можете прочитать больше здесь Отказ Как они достигли таких потрясающих шкале для приложения в реальном времени с таким немногими людьми? Ответ Erlang. И сегодня вы можете использовать силу Эрланг с Phoenix Framework и Эликсир Отказ Мы все еще используем METEOR, но некоторые аспекты приложения, которые я рассматриваю, чтобы перейти к эликсиру, который позволит нам ударить в живых обновлениях в крупных масштабах.

Я также посмотрел на Apollo, который будет работать с METEOR или любым сервером Node.js. APOLLO поможет вам масштабировать METEOR, потому что вам не нужна всякая публикация, чтобы быть реактивной при использовании APOLLO (которые являются самым большим стоком на сервере CPU для приложений Meteor.) Вы можете достичь аналогичного результата с использованием методов Meteor для отправки данных вместо публикации.

Одним из последних точек зрения является то, что, несмотря на многие влиятельные разработчики Meteor, недавно покинув сообщество, на фасаде масштабирования были некоторые события в отношении масштабирования. Проверьте Redis-Oplog пакет и Обсуждение для большего. Это очень новый пакет, и я все равно сказал, что это в бета-версии от моего маленького опыта, играя с ним неделю назад.

Если вам понравилось этот пост, дайте ему сердце, и если вы хотите, чтобы удержать новейшие в вдохновенном масштабировании статей, дайте мне следующее.