По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
В интернете можно найти множество статей с описанием шаблонов масштабирования баз данных (БД), но, в основном, это разрозненная информация с перечислением методик и практически без объяснений. Ниже приведено подробное руководство по шаблонам масштабирования БД, пошаговым объяснением принципов их работы и примерами использования. Практический пример Предположим, вы создали стартап, который предлагает совместные поездки по дешевой цене. Вы выбрали город для поездок, а первая реклама привлекла не более 10 клиентов. Вы храните информацию обо всех клиентах, поездках, местах, бронированиях и историях заказов в одной и той же БД и, скорее всего, на одной физической машине. У вас нет навороченного кеширования или конвейера обработки больших данных, ведь ваше приложение только появилось. На данный момент это – идеальный вариант: в базе мало клиентов, и система, вряд ли, бронирует по поездке каждые 5 минут. Но время идет. В вашей системе регистрируется все больше людей, ведь это самый дешевый сервис на рынке. Да и реклама сделала свое дело. Вы получаете по 10 заказов в минуту. Постепенно это количество увеличивается до 20, а затем и 30 бронирований в минуту. В этот момент вы замечаете, что система начинает тормозить: время отклика API сильно увеличилось, а некоторые транзакции блокируются или зависают и, в конечном итоге, не проходят. Время ответа приложения также увеличилось, что вызвало недовольство клиентов. Как же решить эту проблему? Шаблон №1 – оптимизация запросов и реализация пула соединений Первое решение, которое приходит на ум: кэш слишком часто использует нединамические данные (история бронирования, история платежей, профили пользователей и т.д.). Но прикладным уровнем кеширования вы не сможете решить проблему с временем отклика API, предоставляющим динамические данные (текущее местоположение водителя, ближайшая машина для конкретного клиента, текущая стоимость поездки после выхода на маршрут и т.д.). Вы приходите к выводу, что база данных слишком нормализована, поэтому вы решаете ее немного «разбавить» и добавляете несколько избыточных столбцов (такие столбцы часто попадают в операторы WHERE или JOIN ON в запросах). Это сокращает количество запросов на соединение, разбивает большие запросы на несколько маленьких и добавляет их результаты на прикладной уровень. Можно заняться и параллельной оптимизацией – настроить подключения к базам данных. Внешние и клиентские библиотеки БД доступны практически для всех языков программирования. Для кеширования подключений к БД можно воспользоваться библиотеками пула соединений. Либо вы можете настроить размер пула соединений в самой СУБД. Создание сетевого подключения – вещь весьма затратная, поскольку требует двусторонней коммуникации между клиентом и сервером. Пулы соединений помогают оптимизировать количество подключений. Библиотеки пула соединений реализуют мультиплексирование подключений – несколько потоков приложения могут пользоваться одним и тем же подключением. Вы замеряете время отклика API и замечаете снижение задержки на 20-50% (или даже больше). На данный момент это хорошая оптимизация. Затем вы расширили бизнес на еще один город и получили больше клиентов. Постепенно вы доходите до 80-100 бронирований в минуту. Ваша система не в состоянии справиться с таким объемом. Вы вновь замечаете увеличение времени ожидания API, а слой базы данных не справляется с нагрузкой. Но в этот раз оптимизация запросов не дает вам существенного улучшения производительности. Вы проверяете метрики системы и видите, что дисковое пространство заполнено, ЦП занят в 80% времени, а ОЗУ переполняется слишком быстро. Шаблон № 2 – вертикальное масштабирование или масштабирование вверх Изучив все системные метрики, вы не находите другого решения, кроме как обновить аппаратное обеспечение системы. Вы увеличиваете размер оперативной памяти в 2 раза, а объем диска – раза в 3. Это называется вертикальным масштабированием. Вы сообщаете группе по обслуживанию инфраструктуры, команде devops или агентам сторонних центров обработки данных (ЦОД) о необходимости обновления вашей машины. Но как настроить саму машину для вертикального масштабирования? Вы выделяете машину большего объема. Один из подходов заключается в том, чтобы не переносить данные со старой машины вручную, а настроить новую машину в качестве копии, или реплики (replica), уже существующего устройства, или источника (primary), прописав временную конфигурацию первичной реплики (primary replica). После завершения репликации назначьте новую машину в качестве primary и отключите старую. Поскольку обрабатывать запросы планируется на этой новой машине, все чтение/запись также будет вестись на ней. Отлично. Вы прокачали систему, и теперь все работает намного быстрее. Ваш бизнес идет на ура, и вы решаете расшириться еще до 3 городов. Теперь вы ведете деятельность в 5 городах. Трафик увеличился втрое, вы получаете по 300 заказов в минуту. Проблема с производительностью вернулась: размер индекса сильно сказывается на памяти, базу данных необходимо постоянно поддерживать, а сканирование таблицы с индексом замедлилось до невозможности. Вы подсчитали стоимость дальнейшего масштабирования системы, но цена не внушает доверия. Так что же делать? Шаблон №3 – разделение ответственности на команды и запросы (CQRS): Вы понимаете, что та самая большая машина не в состоянии обработать все запросы на чтение/запись. Да и чаще всего компаниям нужны транзакционные возможности на запись (write), а не чтение (read). Вас даже устраивает небольшая несогласованность данных или замедление операций read. В принципе, раньше это тоже не казалось вам проблемой. Вы решаете, что неплохо было бы разделить операции чтения и записи на физической машине. Это позволит отдельным машинам выполнять больше операций чтения/записи. Теперь вы берете целых 2 большие машины и настраиваете их репликами для текущего компьютера. Репликация базы данных решит вопрос с переносом данных с primary машины на реплики. Вы перенаправляете все запросы на чтение (буква Q в CQRS, что означает «запрос» - Query) в реплики – любая реплика может обслуживать любой запрос на чтение. А все запросы на запись остаются на первичной машине. Возможна небольшая задержка в репликации, но в вашем конкретном случае это не критично. Вариант с настройкой primary-replica вполне подходит для большинства стартапов среднего масштаба, получающих по сотням тысяч запросов ежедневно… но при условии, что компании периодически архивируют старые данные. Вы вновь расширились на 2 города, и замечаете, что primary-машина не справляется со всеми запросами на запись. Многие такие запросы приходят с опозданием. Более того, задержка между primary и replica начинает сказываться на клиентах и водителях. Например, поездка завершена, клиент успешно ее оплачивает, но водитель не видит платеж, поскольку активность клиента – это запрос на запись, который идет на машину primary, а активность водителя – это запрос на чтение, который приходит на одну из реплик. Вся система настолько замедлилась, что водитель не видит платежа как минимум секунд 30, и это вызывает недовольство как со стороны клиента, так и у самого водителя. Как же поступить сейчас? Шаблон №4 – репликация с несколькими источниками Конфигурация primary-replica помогла вам успешно масштабироваться, однако теперь для операций записи не хватает возможностей. Быть может, вы согласитесь слегка пожертвовать быстротой запросов на чтение. А почему бы не перенести запросы на запись тоже в реплики? В модели с несколькими источниками (multi-primary) все машины работают как источник, и как реплика. Такая структура чем-то напоминает замкнутый круг из машин: A->B->C->D->A. «B» может реплицировать данные из «A», «C» – реплицирует данные из «В», «D» – дублирует данные из «C», а «A» делает тоже самое из «D». Вы можете выполнять операцию чтения и одновременно записывать данные в любой узел; вы можете транслировать запрос во все узлы, а значение вернет один из откликнувшихся узлов. Все узлы имеют одинаковую схему БД, один и тот же набор таблиц, индекс и т.д. Но нужно следить, чтобы в узлах одной таблицы не было конфликта по id , иначе при трансляции запросов несколько узлов вернут разные данные по одному и тому же id. Вообще считается, что для ID лучше использовать UUID или GUID. Еще один недочет данной системы: из-за трансляции запросов и поиска корректного результата, запросы на чтение могут оказаться неэффективными. Это, своего рода, принцип распределения/сборки в действии. И вот вы вновь масштабировали бизнес. В этот раз на 5 новых городов. Система не справляется. Теперь вам нужно обрабатывать по 50 запросов в секунду. Вам очень не хватает обработки большого количества параллельных запросов. Но как это сделать? Шаблон №5 – декомпозиция Вы знаете, что база данных location получает много трафика на чтение/запись. Вполне возможно, что соотношение записи к чтению составляет 7:3. Это создает большую нагрузку на существующие БД. В таблицах location содержится несколько первичных данных: долгота (longitude), широта (latitude), отметка времени (timestamp), ID водителя (driver id), ID поездки (trip id) и т.д. Там практически нет информации о поездках или данных пользователя, его платежах и т.д. Возможно, стоит разделить таблицы location на отдельную схему? Как насчет того, чтобы распределить эту БД по отдельным машинам с корректно настроенной конфигурацией primary-replica или multi-primary? Это называется декомпозицией данных по функциональности. В разных БД можно хранить данные, разделенные по функциональному признаку, а результат (при необходимости) агрегируется на серверном уровне. Такой способ позволит вам масштабировать нужный функционал с большим количеством запросов на чтение/запись. В то же время прикладной или серверный уровень приложения должен будет заняться объединением результатов, что приведет к значительному изменению кода. Теперь представьте себе, что вы масштабировались до 20 городов в своей стране и планируете открыть филиалы в Австралии. Растущий спрос на ваше приложение требует все более быстрого времени ответа. Ни один из методов выше с этим не поможет. Вам нужно масштабировать систему так, чтобы при расширении в другие страны/регионы не приходилось слишком часто проектировать и менять архитектуру. Как же тогда поступить? Шаблон №6 – горизонтальное масштабирование Вы хорошо загуглили эту тему, почитали массу статей о том, как другие компании решали такую проблему, и поняли, что настал момент масштабироваться горизонтально. Вы выделили, скажем, 50 машин – все с одинаковой схемой БД и одинаковыми наборами таблиц. На каждой машине хранится лишь часть данных. Поскольку во всех БД хранится один и тот же набор таблиц, вы можете спроектировать систему таким образом, чтобы реализовать привязку данных (то есть все связанные данные хранятся на одной машине). В каждой машине может быть своя реплика; реплики используются для восстановления после сбоя. Каждая такая база данных называется «шардом». На физической машине может быть один или несколько шардов – их количество зависит от нужной вам схемы проектирования. Вы должны придумать ключ шардирования, который бы всегда относился к одной и той же машине. Представьте себе много машин с кучей связанных данных в одном наборе таблиц; операции на чтение/запись запрашиваются для одной и той же строки или набора ресурсов на одной и той же машине с БД. Реализовать шардинг довольно сложно. По крайней мере, так говорят инженеры. Но при обслуживании миллионов или даже миллиардов запросов, рано или поздно вам придется пойти на столь непростой шаг. Настроив шардинг, вы уверены, что сможете масштабироваться во многие страны. Ваш бизнес разросся настолько, что инвесторы вынуждают вас расширяться на другие континенты. И тут опять возникают проблемы. Все то же время отклика API. Ваш сервис находится в США, и у пользователей из Вьетнама возникают трудности при бронировании. Но почему? И что же делать? Шаблон №7 – умное сегментирование центров обработки данных Ваш бизнес развивается в Америке, Южной Азии и нескольких странах Европы. Каждый день вы получаете миллионы заказов, а ваш сервер атакуют миллиарды запросов. Поздравляю! Это пиковый момент в вашей деятельности. Запросы из приложения поступают с разных континентов и проходят через сотни или даже тысячи серверов в интернете, поэтому время отклика растет. Может, распределить трафик по центрам обработки данных? Вы могли бы настроить ЦОД в Сингапуре, и он бы обрабатывал все запросы из Южной Азии. Затем сделать еще один в Германии – он займется всеми запросами из европейских стран, и оставить ЦОД в Калифорнии для обработки американских запросов. Кроме того, вам понадобится репликация между ЦОД – на случай, если потребуется восстановление после сбоя. Если центр обработки данных в Калифорнии выполняет репликацию сингапурского ЦОД, то в случае аварии в Калифорнии (стихийные бедствия, отсутствие электричества и т.д.), все запросы из США будут передаваться в Сингапур и наоборот. Такой метод масштабирования подходит для: обслуживания миллионов клиентов из разных стран, сохранения всех данных и поддержания постоянной доступности системы. Заключение В статье приведены общие методы по масштабированию базы данных. Стоит сказать, что у большинства инженеров нет достаточных возможностей для реализации всех шаблонов. Но лучше знать о существовании таких схем, которые в будущем могут помочь вам с проектированием архитектуры и систем.
img
В некоторых компаниях существует сменный график работы операторов. Как правило, в этом случае, они делят между собой рабочее место. То есть, когда приходит один оператор, то он вводит на общей рабочей станции свои учётные данные и работает под своей учётной записью, а когда приходит другой оператор - то делает то же самое, но под собственной учётной записью. Таким образом, компания экономит на необходимости организации отдельного рабочего места под каждого сотрудника. Кстати, с IP-телефоном можно провести точно такой же трюк и для этого существует специальное понятие - Hot Desking. Как это сделать на IP-АТС Asterisk с помощью графической оболочки FreePBX, мы сейчас расскажем в этой статье. Итак, для того чтобы настроить эту фичу, нам сначала нужно разделить привычный нам модуль Extensions на два отдельных модуля Devices и Users. Для этого открываем Advanced Settings, ищем опцию User & Devices Mode и меняем её значение на deviceanduser вместо extensions. Не забываем нажать Submit и Apply Config Отлично! Теперь, если мы посмотрим в раздел Applications, то увидим там два новых модуля - Devices и чуть пониже - Users: Рассмотрим модуль Devices. Данный модуль теперь управляет сущностями устройств, то есть – телефонов, софтфонов и других клиентов. Как видите, здесь уже находятся внутренние номера, которые были созданы ещё в модуле Extensions: Однако теперь, доступный для настройки функционал немного изменился: По умолчанию, на данном устройстве есть жёстко привязанный пользователь (в данном случае - 175. Мы рассмотрим его настройки в модуле Users). В такой конфигурации на данное устройство нельзя залогиниться с учётными данными другого пользователя. Чтобы это изменить, нужно поменять значение опции Device Type с Fixed на Adhoc. Дефолтного пользователя, который будет по умолчанию залогинен на данном устройстве, можно оставить без изменения, а можно поставить: Теперь нужно сделать настройки для пользователей, которые будут логиниться на данное устройство в модуле Users. Как видите, пользователи также остались от тех, которые были созданы при модуле Extensions: Для начала сделаем настройки для дефолтного пользователя на устройстве - 175. Самое главное здесь – это задать пароль (а точнее даже PIN) пользователя, чтобы функционал аутентификации заработал на устройстве. Пользователь вручную будет вводить этот пароль на устройстве, поэтому в качестве пароля можно указать только цифры: Один настроенный пользователь нам ничего не даст, чтобы организовать сменную работу на устройстве, нам нужно их как минимум два. Для этого, в модуле Users, создадим ещё одного пользователя, который не будет привязан ни к какому устройству и зададим для него PIN код: Супер, переходим к самому интересному. У нас есть софтфон DrayTek, который выступает в роли устройства с номером 175. По умолчанию, на нём сидит пользователь Алексей Добронравов с внутренним номером 175. Но сегодня в смену вступает созданный ранее пользователь - Крипто Виталий с внутренним номером 199. Чтобы залогиниться на устройстве, Крипто Виталию нужно: Набрать Feature Code - *11; Он услышит в трубке предложение набрать свой внутренний номер (199) и нажать #; Если такой внутренний номер существует, то ему будет предложено ввести пароль (PIN код) и нажать #; Если пароль будет введён верно, то пользователя поблагодарят и сообщат, что оператор зарегистрирован. Для того, чтобы удалить регистрацию, используйте фича код - *12 Сногсшибательно! Теперь на нашем устройстве (софтфоне) зарегистрирован другой пользователь (Крипто Виталий) и он может совершать звонки! Давайте проверим это, позвонив на другой внутренний номер, например - 188, на котором у нас зарегистрирован стационарный телефон: Profit! Попробуйте реализовать этот функционал у себя и сократите затраты на организацию дополнительных мест!
img
Привет, дорогой любитель автоматизации с помощью бизнес - процессов! Мы очень рады, что в поисках полезной автоматизации обработки лидов в Битрикс24 ты нашел эту статью. Все потому, что мы тоже любим упрощать работу себе и своим сотрудникам, поэтому вот тебе кейс: Валерий – успешный менеджер по продажам. К нему прилетает лид. У Валерия есть только его электронная почта – оставлять телефон лид не захотел/не смог. После первичной обработки (выяснение потребностей, требований к услугам и так далее) лид сообщает, что не может ответить на некоторые вопросы и просит тайм – аут – предположим, пару дней. Конвертировать в сделку лида рано – мы не знаем ключевых параметров для формирования коммерческого предложения. Лид так и остается MQL (Marketing Qualified Lead) сущностью. В силу некоторых анатомических особенностей, Валерий бывает забывчив. В потоке новых лидов, которых он успешно конвертируется в SQL (Sales Qualified Lead), Валерий забывает про MQL лида. Но не забывает бизнес – процесс, о котором мы сейчас и расскажем. Битрикс24 бесплатно! Битрикс24 общается с лидом за вас Бизнес процесс работает следующим образом: Менеджер ставит лид в статус «Дожимаем лида»; Запускается цикл, который будет выполнятся до тех пор, пока лид находится в статусе «Дожимаем лида»; Бизнес-процесс берет паузу в 3 рабочих дня и спустя это время отправляет первое письмо лиду. Письмо будет отправляться от email адреса ответственного, с обращением к лиду по имени и формированием небольшой подписи в письме. Письмо отправляется такого содержания : Принято ли решение по проекту «%название_лида%». Параллельно с этим ответственному приходит сообщение об отправке внутри Битрикс24; После выполнения предыдущего шага, снова берется пауза в три рабочих дня, после чего отправляется письмо лиду другого содержания: Очень хотим с Вами работать :) Принято ли решение по проекту «%название_лида%»?. Параллельное уведомление приходит и ответственному; После чего, указанные выше шаги повторяются еще 2 раза (то есть общее число отправленных писем с интервалом в 3 рабочих дня будет равно 6); После отправки шестого письма бизнес процесс прервется; Очень советуем настроить триггеры в Битрикс24. Например, при событии «Входящее письмо» и «Входящий email» у вас будет переключаться статус – тем самым, при наличии активности по лиду (переписка, звонок) бизнес процесс будет прерываться. Блок-схема работы указана ниже: Настройка бизнес - процесса Итак, переходим к разбору полетов. Открываем CRM → Настройки → Автоматизация → Бизнес - процессы. В разделе «Лид» нажимаем добавить шаблон: даем первичное название и описание шаблону, предварительно сняв галочки на параметру автоматического запуска (запускать бизнес процесс мы будем изнутри другого процесса). Скачать бизнес – процесс для лидов в Битрикс24 Переходим во вкладку «Переменные» и создаем две служебных переменные, нажав «Создать переменную»: Идентификатор mail_choose Название: - выбор письма для отправки; Описание: - переменная содержит в себе либо 1, либо 2. В зависимости от значения, Заказчику будут отправляться разные письма; Тип: - целое число; Значение по умолчанию: - 0; Идентификатор count Название: - счетчик отправок; Описание: - когда клиенту будут отправлены 2 формата письма - мы будем увеличивать значение этой переменной на 1; Тип: - целое число; Значение по умолчанию: - 0; Общая структура нашего бизнес – процесса следующая: Первый элемент – «Цикл». Условно говоря, это блок, в котором задается некое условие, и, до тех пор, пока это условие выполняется, все элементы внутри цикла будут прогоняться снова и снова. Лишь в том случае, когда условие не выполнится, цикл будет завершен. В нашем случае условием «Цикла» будет статус лида. Пока он равен статусу «Дожимаем лида» - цикл жив: Итак, цикл начинается. Первым действием мы увеличиваем переменную mail_choose на 1 (ее значение по умолчанию 0). Это нужно для выбора письма, которое мы будем отправлять лиду. Для этого, мы выбираем блок «Изменение переменных», выбираем переменную «Выбор письма для отправки» и приравниваем ее к значению =({=Variable:mail_choose}+1). Переменная будет увеличена на 1. Добавляем блок «Пауза в выполнении». Здесь мы будем ставить бизнес – процесс на паузу на 3 рабочих дня. В разделе «Режим» выбираем чек-бокс «Время» и в поле «Дата» добавляем следующий код: =addworkdays({=System:Now}, 3) Приступаем к отправке. Данный блок будет отработан только после паузы в 3 рабочих дня. Первым делом, нам надо убедиться, что количество отправленных писем клиенту не равно 6 (мы не хотим отправлять клиенту больше 6 писем с напоминанием о себе). Счетчик с идентификатором count увеличивается каждый раз, когда клиенту отправляется четное письмо. Это значит, что уходит первое письмо – счетчик не увеличивается. Уходит второе – прибавляем 1 к переменной count. Уходит третье – ничего. Уходит четвертое - + 1. И так далее. В результате, когда переменная будет равна 3, мы будем завершать наш бизнес процесс. Если наш счетчик меньше 3, то мы переходим к выбору письма. Тут в игру вступает переменная mail_choose. Сейчас она равна 1 (мы увеличили ее в начале цикла). Поэтому, мы отправляем первое письмо и уведомление ответственному: После отправки уведомления бизнес процесс переходит в начало цикла. Там мы опять увеличиваем переменную mail_choose на 1, проходим паузу и условие. Теперь наша переменная равна 2, поэтому, мы отправляем лиду второй вариант письма: Второе письмо отправлено, и теперь, нам нужно обработать наши переменные: =({=Variable:count}+1) - увеличиваем счетчик отправок на 1; Выбор письма для отправки - приравниваем к 0; Вот и все. Теперь все происходит по новой, но переменная count = 1. Пока count не достигнет значения 3, цикл будет повторяться. Для этого, заранее настраиваем запуск этого бизнес – процесса при переключении статус лида на «Дожимаем лида». Давайте протестируем: переводим лида в нужный статус: О том, как создать запуск бизнес – процесса по переключению статус лида можете прочитать в этой статье. Через 3 дня нам (лиду) приходит первое письмо: И еще через 3 дня приходит второе письмо: Удачных полетов :)
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59