...

Глава 9. Оптимизация решений

Тема в разделе "Краткое руководство по созданию Low-code решений", создана пользователем ELMA365, 4 май 2023.

  1. ELMA365

    ELMA365 Moderator

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

    Необходимо обновлять большой объём данных из учётной системы, например, сотни тысяч записей ежедневно. Предположим, что обновление будет происходить за несколько часов. Такой функционал можно реализовать фоновой операцией, которая выполняется в нерабочее время. Несмотря на то, что обновление занимает часы — это не критично, так как операция выполняется в нерабочее время и не влияет на пользователей и правильную работу решения.

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

    Как найти неоптимальные части решения

    Если вы в своём решении заметили длительную загрузку интерфейсов, длительное выполнение сценариев или столкнулись с таймаутами — воспользуйтесь следующими рекомендациями:

    1. В интерфейсах

    Воспользуйтесь вкладкой Network в инструментах разработчика в браузере и обратите внимание на:
    1. Количество синхронных запросов;
    2. Время выполнения этих запросов.

    2. В сценариях

    Измерьте время выполнения сценария с помощью фиксации времени начала и окончания.

    Рекомендации

    Пользователь взаимодействует с интерфейсом в режиме реального времени, поэтому неоптимальная реализация заметнее именно здесь.

    При настройке форм и интерфейсов:
    1. Группируйте свойства и виджеты на формах во вкладки и панели — это поможет пользователю проще ориентироваться в информации;
    2. Используйте флаг Загружать содержимое асинхронно на вкладках и панелях, чтобы не ждать загрузки всех вложенных виджетов при открытии формы. Так пользователь быстро получит доступ к форме с основной информацией, а остальные данные загрузятся позже автоматически или по запросу пользователя;
    3. Используйте пагинацию при работе с большим количеством элементов;
    4. Поставьте флаг Поиск и сортировка по полю для полей приложений, которые чаще всего используются при поиске. Но и не устанавливайте этот флаг на все поля, так как при его установке создаются индексы в базе данных.
    При написании сценариев:
    1. Откажитесь от серверных сценариев на формах, виджетах и интерфейсах там, где это возможно. Клиентские сценарии выполняются прямо на устройстве пользователя без обращения к серверу, поэтому занимают меньше времени;
    2. Если вы используете серверные сценарии в нескольких виджетах, которые потом будут использованы на одной форме, виджете или интерфейсе, то лучше откажитесь от нескольких виджетов в пользу одного. Иначе серверные сценарии из каждого виджета будут исполняться последовательно, что увеличит время выполнения;
    3. При загрузке данных используйте фильтры, а не загружайте их целиком;
    4. Объединяйте все await в Promise.all(). Это позволит выполнить запросы параллельно, а не последовательно. Делайте это только тогда, когда параллельное выполнение не нарушит бизнес-логику;
    5. При работе с данными в цикле используйте Promise.all(). Это позволит обработать все изменения параллельно, а не последовательно. Подробнее об этом в TSSDK.
    6. Объедините несколько последовательных сценариев в бизнес-процессах в один, так они будут выполняться быстрее.
    При настройке запуска бизнес-процессов по таймеру учитывайте существующие фоновые операции и время их выполнения. Рекомендуется определить доступное время запуска для таких операций и разнести их по времени в этом интервале, чтобы они не мешали друг другу.

    ON-PREMISES Высоконагруженные решения

    Если ваше решение работает с большим объёмом данных или пользователей, то:
    1. Разместите postgres и mongo на отдельных серверах с SSD;
    2. Используйте автомасштабирование сервисов или следите за нагрузкой на систему с помощью Grafana и масштабируйте сервисы вручную.
    Если вы столкнулись с медленными запросами, то отследите их трейс в Jaeger и вручную масштабируйте сервисы, в которых запрос находится дольше всего.