Content Oriented Web
Make great presentations, longreads, and landing pages, as well as photo stories, blogs, lookbooks, and all other kinds of content oriented projects.
Есть вопросы? Заполните форму
и мы ответим вам в кратчайшие сроки:

Способы повышения производительности информационной системы

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


Шаг 1. Оптимизация модуля расчета тарифов и маркетинговых акций

Произведен рефакторинг кода, оптимизированы запросы и структуры данных.
Результат. Время одного расчета сократилось с 1,8 секунды до 0.1 секунды, количество итераций в коде - с 2700 до 1270.


Шаг 2. Оптимизация модуля обмена с сайтом


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


Шаг 3. Кардинальное изменение алгоритма расчета тарифов на услуги


Несколько слов о механизме расчета тарифов. Документ «Прайс» - это плоская таблица со следующими полями: Город отправления; Город получения; Единица измерения; Диапазон в единицах измерения: килограммы или метры кубический; Цена за единицу измерения.
Алгоритм определения тарифа на услуги представлял собой следующую последовательность действий:
  1. Выборка по услуге и направлениям перевозки,
  2. Поиск интервала, в который груз попадал по своим характеристикам,
  3. Определение максимального тарифа по весу, объему или другим характеристикам.
Таким образом, определение тарифа на услуги осуществлялось перебором. Исходя из структуры грузопотока компании по каждому запросу на определение тарифа обрабатывалось не менее 30% записей Прайса.

Для решения проблемы было предложено перейти на параметрический расчет тарифов. Выявили функциональную закономерность изменения тарифов в зависимости от весового или объемного диапазона. Разработали алгоритм параметрического расчета, при котором определение тарифа на перевозку рассчитывалось как функция заданного типа (полиномиальная, степенная, экспоненциальная) с предопределенными параметрами. В качестве аргумента функции принималась граница весового или объемного диапазона. Подробнее

Результат. Пара, Город отправления \ Город получения, в информационной базе, в документе «Прайс», представляла собой одну запись. Как следствие, количество записей в документе «Прайс» сократилось в 33 раза (с 25 000 записей до 750).


Шаг 4. Разделение основных процедур расчета

Были разделены этапы получения списка услуг на перевозку, расчета цены и расчета цены с учетом маркетинговых акций

Установленная функциональная зависимость в совокупности с выше описанными изменениями позволила хранить данные Прайса непосредственно на сайте в виде JSON-структуры. Такое решение полностью сняло нагрузку на 1С при первичном расчете тарифов, передав самые ресурсозатратные методы на сторону клиента.


Результат. По данным нагрузочного тестирования после реализации мер по повышению производительности информационной системы сайт смог обрабатывать до 100 000 запросов по расчету тарифов в сутки (около 10 000 посетителей сайта), что в 4,5 раза больше, чем до оптимизации процедур и методов расчета.