Рубрики
Uncategorized

Руководство разработчиков к приложениям о масштабирования рельсов

Приложения для масштабирования Rails — это процесс архитектуры Master App и поддержки инфраструктуры. Узнайте, как это сделано прямо из наших руководств по рельсам для разработчиков.

Автор оригинала: Edward James.

Ravi Duddukuru

От Airbnb до Zendesk, тонна действительно отличных приложений была построена с использованием языка программирования RUBY и Rails Web Framework. Хотя и менее популярный вариант, чем другие фронт-конечные рамки, такие как React, oneular, и Vuejs, Rails по-прежнему содержит существенные заслуги в современном разработке программного обеспечения.

Ruby on Rails (ROR) — это открытый источник, хорошо задокументированный, яростно поддерживаемый и постоянно расширен с новыми драгоценными камнями — библиотеки с открытым исходным кодом сообщества, служащие «ярлыками» для стандартизированной конфигурации и распределения RUBY-код.

Рельсы Возможно, является самым большим драгоценным драгоценным камнем ROR-GEM — полный веб-прикладной Server Server, которая легко настроить и масштабировать.

Что такое рельсы? Быстрая республика

Рельсы были построены на помещении архитектуры просмотра моделей-контроллера (MVC).

Это означает, что каждое приложение Rails имеет три взаимосвязанные слои, ответственные для соответствующего набора действий:

  1. Модель: Слой данных, корпус бизнес-логики приложения
  2. Контроллер: «Мозговой центр», обрабатывающие функции приложений
  3. Вид: определяет графические пользовательские интерфейсы (Guis) и Performance UI

По сути, модельный слой устанавливает необходимую структуру данных и содержит коды, необходимые для обработки входящих данных в HTML, PDF, XML, RSS и других форматах. Затем модельный слой связывает обновления на просмотр, который обновляет GUI. Контроллер, в свою очередь, взаимодействует как с моделями, так и с видами. Например, при получении обновления с вида он уведомляет модель о том, как ее обработать. В то же время он может также обновить представление о том, как отобразить результат для пользователя.

рельсы-архитектура

(Архитектура приложения Basic Rails. Источник изображения: Средний Несомненно

Основная архитектура MVC дает несколько важных преимуществ рельсов:

  • Возможности параллельного развития — один разработчик может работать на вид, в то время как другие обрабатывают модельную подсистему. Вышесказанное также делает Ruby на Rails народный выбор для методологии быстрого развития приложений (RAD).
  • Кодовые компоненты для многоразового использования — контроллеры, представления и модели могут быть упакованы для совместного использования и повторного использования в нескольких функциях с относительной легкостью. Когда сделано справа, это приводит к чищему, более читаемому коду, а также более быстрое время разработки. Кроме того, Ruby On Rails построен на сухом принципе (не повторяйте себя), побуждая более частые повторное использование кода для монотонных функций.
  • Top Security — Рамочная структура имеет множество встроенных озаборотных объектов, таких как защита от инъекций SQL и XSS-атак, среди прочего. Более того, существует множество отгруженных общественных драгоценных камней, обращаясь к массиву общих и возникающих угроз кибербезопасности.
  • Сильный потенциал масштабируемости — есть веская причина, по которой на рельсах построены веб-приложения, такие как GitHub, Twitch, и FiverR. Поскольку это хорошо, когда общая архитектура приложений и стратегии развертывания сделано правильно. На самом деле, одна из старейших приложений Rails, Shopify, Scales до Обработка миллионов запросов в минуту (RPM).

Несмотря на это, многие направляющие рельсов до сих пор делают произвольную заявку на то, что Приложения Rails трудно масштабироваться Отказ Эти правда? Не полностью, так как этот пост будет демонстрировать.

3 Общие проблемы с Apps Cleasing Rails

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

Чтобы лучше понять, откуда эти проблемы составляют, давайте сначала откройте какую масштабируемость для веб-приложений.

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

Ключевое слово здесь — «архитектура», так как ваш выбор конфигурации инфраструктуры, подключения и общая макета являются детерминантами для масштабирования всей системы. Используемые вами языки (ы) или языки программирования будут иметь только предельное (если какое-либо) влияние на масштабируемость.

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

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

В частности, проблемы масштабирования Ruby часто всплывают из-за:

  • Плохое запрос базы данных
  • Неэффективная индексация
  • Отсутствие ведения журнала и мониторинга
  • Выбор двигателя базы данных подбора базы данных
  • Вялый кеширование
  • Чрезмерно сложный и спагеттический код

Переполненная архитектура приложения

ROR поддерживает многопоточь. Это означает, что Rails Framework может обрабатывать параллельную обработку различных частей кода.

С одной стороны, Multi-Threading — это продвижение, поскольку оно позволяет использовать Time Time Wire и Traft высокопроизводительные приложения.

В то же время, однако, стоимость переключения контекста между различными потоками в очень сложных приложениях может получить высоту. Соответственно, производительность начинает отставать в какой-то момент.

Как справиться

По умолчанию Ruby на рельсах приоритетывает чистый, многоразовый код. Создание архитектуры приложения Rails чрезмерно сложна (думаю, что слишком обычай) действительно может привести к вопросам производительности и масштабируемости.

Это было так с Twitter Circa 2007.

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

Twitter-ui-прототип

Источник изображения: SlideShare.

Интересно, что в то же время еще один веб-приложение High-Rails под названием Penny Arcade делал все хорошо. Почему? Поскольку он не имел фанок слишком пользовательский код, были четко отображены зависимости и хорошо приветствовали соединенные базы данных.

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

Suboptimal Setup базы данных

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

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

Иногда сложная конструкция базы данных также является частью преднамеренных решений, как это было в случае с одним из Наши клиенты, пеннипоп Отказ Чтобы сохранить данные приложений, команда настроила запрос API на приложение Rails. Сам приложение затем сохраняет данные внутри Dynamodb и отправляет ответ обратно в приложение. Вместо ActiveRecord команда создала свой собственный слой хранения данных, чтобы включить связь между приложением и DynamOdb.

Но проблема, в которой они столкнулись, это то, что Dynamodb имеет ограничения на то, сколько информации можно сохранить в одном клавише. Это был технический выключатель сделки, но команда DEV придумала интересный обходной путь — сжимая значение ключа в полезную нагрузку на закодированные данные Base64. Это позволило команде обменять большие записи между приложением и базой данных без компромисса пользовательского опыта или производительности приложения.

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

Как справиться

Предоставлено, есть много подходов к улучшению эффективности базы данных Rails. Умышленные разбиение кэширования и базы данных (SHARDING) — одна из общих маршрутов, поскольку ваше приложение растет более сложным.

Что еще лучше, так это то, что у вас есть тонна отличных решений для разрешения проблем базы данных ROR, таких как:

  • Redis — магазин структуры данных с открытым исходным кодом в памяти для приложений Rails.
  • ActiveRecord — база данных запроса инструмента стандартизации доступа к популярным базам данных со встроенным кэшинговым возможностям.
  • Memcached — распределенная система кэширования памяти для Ruby на рельсах.

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

Более того, вы можете:

  • Переключитесь на UUIDS по стандартным идентификаторам для принципиальных ключей, поскольку ваши базы данных выращивают более сложные.
  • Попробуйте другие альтернативы ORM для ActiveRecord, когда ваши DBS становятся очень большими. Некоторые хорошие включают Sequel, DataMapper и ARM адаптер.
  • Используйте GEM-драгоценные камни для диагностики и выявления скорости и производительности в начале. Популярные из них являются Rack-Mini-Profiler, Bullet, Rails_Panel и др.

Недостаточная пропускная способность сервера

Последняя проблема — это простое, но все еще распространяется. Вы не можете ускорить ваши рельсы приложения на миллионы RPMS, если вам не хватает ресурсов.

Удаленные, с облачными вычислениями, предоставление дополнительных экземпляров — это вопрос нескольких кликов. Тем не менее, вам все еще нужно понимать и учитывать:

  • Определенные приложения/подсистемы требований к дополнительным ресурсам
  • Облачные вычисления стоит (ака денежный компромисс для скорости)

В идеале вам нужны инструменты для постоянного сканирования ваших систем и определяют случаи медленных характеристик, ресурсов в разделе (и более и изложенных) -Provisioning, а также общие показатели эффективности для различных приложений.

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

Как справиться

Один из Уроки, которые мы узнали при строительстве и масштабировании двигателя. На Kubernetes было то, что платформа контейнера не устанавливает ограничения ресурсов по умолчанию для размещенных контейнеров. Соответственно, ваши приложения могут потреблять неограниченное количество процессоров и памяти, которые могут создавать ситуации «шумных соседей», где некоторые приложения входят слишком много ресурсов и перетаскивают производительность других. Решение: Орчерните ваши контейнеры из Get-Go. Используйте планировщик Kubernetes в правые узлы для стручек, ограничите максимальное распределение ресурсов, плюс определяют поведение Pod Prememption.

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

В нашем случае мы используем:

  • Свободный бит для распределенного коллекции журнала
  • Kibana + Elasticsearch для анализа журнала
  • Прометеус + графана для предупреждения и визуализации метрик

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

Приложения для масштабирования Rails: Два основных подхода

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

Оба подхода имеют свои заслуги в соответствующих случаях.

Вертикальное масштабирование

Вертикальное масштабирование, то есть, обеспечивая больше серверных ресурсов для приложения, может увеличить количество оборотов. Базовые помещения такие же, как для других рамки. Вы добавляете дополнительные процессоры, RAM и т. Д., До тех пор, пока не будет технически осуществимым и не имеет финансового смысла. Понятно, вертикальное масштабирование — это темп «патч».

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

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

Например, если вы планируете реализовать вертикальную автоскализацию POD (VPA) на Kubernetes, он учитывает несколько ограничений.

Во время наших экспериментов с масштабированием приложений Ruby мы обнаружили, что:

  • VPA — довольно разрушительный метод, поскольку он разобрает оригинал POD, а затем воссоздает его вертикально масштабированную версию. Это может вызвать большой хаос.
  • Вы не можете сопрянуть VPA с помощью горизонтального автоскализатора POD.

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

Горизонтальное масштабирование

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

По сути, вы преобразуете свои приложения в трехуровневую архитектуру.

  • Веб-сервер и балансировщик нагрузки для подключенных приложений
  • Экземпляры приложений Rails (на месте или в облаке)
  • Экземпляры базы данных (также локальные или облачные)

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

Для эффективных процессов Reroute Rails через экземпляры серверов необходимо выбрать оптимальный веб-сервер и решение балансировки нагрузки. Тогда прямые экземпляры на новые развязанные рабочие нагрузки.

Балансировка нагрузки

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

Большинство облачных вычислительных услуг поставляются с собственными решениями балансировки нагрузки программного обеспечения (думайте упругая нагрузка балансировки на AWS). Такие решения также поддерживают отображение динамического хоста порта. Это помогает создать бесшовное сопряжение между зарегистрированными веб-балансировщиками и экземплярами контейнеров.

Когда дело доходит до приложений Rails, два наиболее распространенных варианта используются с комбинацией веб-серверов и серверов приложений (или службы Fusion) для обеспечения оптимальной производительности.

  • Веб-серверы передают запрос пользователя на свой веб-сайт, а затем передайте его в приложение Rails (если применимо). По сути, они отфилялируют ненужные запросы на компоненты CSS, SSL или JavaScript (которые сервер может обрабатывать сам), тем самым уменьшая количество запросов к приложению Rails для голых существ.

— Примеры рельсов веб-серверов: Nginx и Apache.

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

— Примеры серверов приложений для Rails: Unicorn, Puma, Thin, Rainbows.

Наконец, есть также услуги «Fusion», такие как пассажирское приложение (Phance Passenger). Эта услуга интегрируется с популярными веб-серверами (Nginx и Apache) и приводит к слою сервера приложений — доступен для автономной и комбинированного использования с веб-серверами.

Фюзия-пассажир

Источник изображения: Phance Passenger

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

В двух словах, главная идея с помощью серверов Web и App — оптимально охватывать различные рельсы процессы в разных случаях.

Pro Tip: То, что мы нашли при создании нашего продукта, это то, что упругий балансировщик нагрузки AWS часто не хватает. Основным недостатком является то, что ELB не может справиться с несколькими VHOSTS.

В нашем случае мы продолжали настроить балансировщик нагрузки на основе Nginx и настроили автоматическое масштабирование на нем для поддержки elb. В качестве альтернативы вы также можете попробовать haproxy.

Экземпляры приложений

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

Серверы приложений (Unicorn, Puma и т. Д.) Помогите обеспечить правильную связь между веб-серверами и впоследствии повысить пропускную способность запросов, обработанных в секунду. На рельсах вы можете выделить сервер приложений для обработки нескольких экземпляров приложений, что, в свою очередь, может иметь отдельную «рабочую» процессы или потоки (в зависимости от того, какой тип службы сервера приложений вы используете).

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

Когда дело доходит до настройки правильных экземпляров для контейнеров, используйте следующее:

  1. У вас есть четыре переменных в Min/Max CPU и Min/Max Memory для регулирования размера POD
  2. Ограничить ресурсы с использованием [Минимальные требования + 20%] формула
  3. Используйте среднее использование процессора и среднее использование памяти в виде метрик масштабирования
  4. Разумейте время. Стручки и кластеры занимают от 4 до 12 минут, чтобы масштабировать на Куберане.

Снимание Если вы не хотите делать вышеупомянутые догадки каждый раз, когда вы строите новый POD/кластер, двор двигателя поставляется с прогнозирующей функцией масштабирования кластера, которая помогает вам масштабировать вашу инфраструктуру, не совсем не баллотируя расходы.

Масштабирование базы данных

Передача баз данных на отдельный сервер, используемый всеми экземплярами приложений, является одним из гладких движений, которые вы можете сделать для Машины Rails Apps Отказ

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

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

Например, AWS RDC позволяет выбрать среди 18 типов экземпляров базы данных и кодифицировать прекрасное зерновое обеспечение. Выбирая для размещения ваших данных в более дешевой облачной области, может привести к значительной экономии затрат (по времени до 40%!).

Вот как повседневные расходы по требованию различаются по регионам AWS:

США Восток (Огайо)

  • db.t3.small — $ 0,034 в час
  • db.t3.xlarge — $ 0,272 в час
  • db.t3.2xlarge — $ 0,544 в час

США Запад (Ла)

  • db.t3.small — $ 0,0408 в час
  • db.t3.xlarge — $ 0,3264 в час
  • db.t3.2xlarge — $ 0,6528 в час

Европа (Франкфурт)

  • db.t3.small — $ 0,04 в час
  • db.t3.large — $ 0,16 в час
  • db.t3.2xlarge — 0,64 доллара в час

Asia Pacific (Сеул)

  • db.t3.small — $ 0,052 в час
  • db.t3.large — 0,208 $ в час
  • db.t3.2xlarge — $ 0,832 в час

Другой Pro Tip: opt для зарезервированных экземпляров по требованию по требованию, когда вы сможете дальше полной почасовой стоимости.

Кэширование

Реализация кэширования базы данных является еще одним шагом ядра для ускорения ваших приложений Rails, особенно когда речь идет о производительности базы данных. Учитывая тот факт, что ROR поставляется с собственной функцией кэширования запросов, которая кэширует набор результатов, возвращаемый каждым запросом, это стыдно не получать от этого!

Кэширование может помочь вам ускорить эти медленные запросы. Но до реализации, расследовать!   Как только вы нашли «правонарушителей», подумайте о том, чтобы попробовать Разные стратегии Такие как:

  • Кэширование низкого уровня — лучше всего работает для любого типа кэширования для получения запросов базы данных.
  • Redis Cache Store — позволяет хранить ключи и пары значений до 512 МБ в памяти, плюс предоставляет нативную репликацию данных.
  • Memcache Store — еще один простой встроенный хранилище данных в памяти со значениями, ограниченными на 1 МБ. Поддерживает многопоточную архитектуру, в отличие от Redis.

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

Sharding базы данных

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

Sharding Data означает нарезку записей DB горизонтально или вертикально на более мелкие куски (осколки) и хранение их в кластере узлов базы данных. Окончательное преимущество заключается в том, что запрос должен теперь быстрее произойти быстрее, поскольку большая база данных разделена в два раза и имеет в два раза больше памяти, ввода/вывода и CPU.

Тем не менее, компромисс в том, что кашимент может значительно повлиять на логику вашего приложения. Объем каждого запроса теперь ограничен либо DB 1, либо DB 2 — нет комбингации. Соответственно, при добавлении новых функций приложений необходимо тщательно рассмотреть вопрос о том, как получить доступ к данным через осколки, как обмен относится к инфраструктуре, и какой лучший способ масштабировать поддерживающую инфраструктуру, не влияя на логику приложения.

Для заключения: Есть ли более простые решения для масштабирования приложений для размеров рельсов?

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

Вы можете попробовать двигатель двора Kontainers (yek) — наш UOPS PAAS AutoScaling Services для контейнерных приложений. По сути, мы действуем как ваша команда с невидимой. Вы кодируете свои приложения и развернули их в EYK, и мы возьмем через автоматическую масштабирующую реализацию, контейнерную оркестровку и другую инфраструктуру справедливые задачи оттуда.

Узнайте больше о Движок Двор Отказ

Оригинал: «https://www.codementor.io/@devgraph/the-developers-guide-to-scaling-rails-apps-1kqjzwm773»