1

Оптимизация запросов виалон

(edited by Константин Зорков 14/10/2020 16:43:15)

Topic: Оптимизация запросов виалон

Описание текущего алгоритма:
На данный момент в системе реализован следующий алгоритм получения данных из “Виалон”:
1) “Логин под токеном” (token/login), запрос выполняется разово для получения ID сессии.
2) “Поиск элементов” (core/search_items), запрос выполняется для каждого необходимого транспортного средства. Транспортных средств может быть сколько угодно. В параметрах указывается тип искомых элементов: “avl_unit”, имя свойства: “sys_name”, так же указывается значение свойства, а именно номер ТС. Из результата отбирается “id” для выполнения дальнейших запросов. Пример запроса в файле “Приложение 1”.
3) “Выполнение отчета” (report/exec_report), запрос выполняется для каждого полученного на предыдущем этапе “id” транспортного средства. В параметрах укзывается id ресурса (reportResourceId), id шаблона (reportTemplateId), id элемента (reportObjectId), id подэлемента указывается 0, задается временной интервал (может быть равен одному часу). Из результата отбирается массив таблиц. Пример запроса в файле “Приложение 2”.
4) “Получить строки таблицы” (report/get_result_rows), запрос выполняется для каждой полученной на предыдущем этапе таблицы. В параметрах указывается индекс таблицы, индекс первой и последней полученной строки. Из результата отбираются необходимые данные по транспортным средствам. Пример запроса в файле “Приложение 3”.

Пункты 2, 3, 4 выполняются для некоторого списка тс, который может быть более 500 штук.


Предложенный механизм оптимизации алгоритма
После первого обращения Нам было предложено использовать операцию “Выполнение нескольких команд” (core/batch). Исходя из информации из технической документации о том, что “Выполнение отчета” (report/exec_report) невозможно выполнять несколько раз в одной сессии, то Нами предположено, что следующий алгоритм невозможен:
1) “Поиск элементов” (core/search_items) для всех транспортных средств в одном запросе.
2) “Выполнение отчета” (report/exec_report) для всех найденных на предыдущем шаге id в одном запросе.
3) “Получить строки таблицы” (report/get_result_rows) для всех отчетов.
Появился вариант объединить эти три запроса в один запрос с использованием операции “Выполнение нескольких команд” (core/batch) следующим образом:
1) “Поиск элементов” (core/search_items) для одного транспортных средств.
2) “Выполнение отчета” (report/exec_report) для найденного на предыдущем шаге id.
3) “Получить строки таблицы” (report/get_result_rows) для текущего отчета.
4) “Удаление результата предыдущего отчета” (report/cleanup_result) для текущего отчета.
5) Повторять пункты 1-4 для всех транспортных средств.
Но при таком алгоритме запроса возникает вопросы:
“А будет ли данный алгоритм более оптимизированный и снизится ли время выполнения?”
“Если же данный алгоритм более эффективный и менее время затратный, то намного ли, так как транспортных средств может быть более 500 штук и интервал времени при выполнении отчета может быть час?”
Так же еще интересующие Нас вопросы:
“Какие еще варианты оптимизации алгоритма могут быть Вами предложены?”
По скольким транспортным средствам получится выполнять данный запрос, чтобы он не переполнялся?

Post's attachments

Attachment icon Приложение 1.txt 246 b, 18 downloads since 2020-10-14 

Attachment icon Приложение 2.txt 272 b, 12 downloads since 2020-10-14 

Attachment icon Приложение 3.txt 142 b, 12 downloads since 2020-10-14 

2

Оптимизация запросов виалон

Re: Оптимизация запросов виалон

Добрый день!

Использование core/batch запроса в вашем случае не сильно оптимизирует. Т.к при работе с отчетами - в любом случае нужно дождаться выполнения отчета на сервере : можно ожидать в фоне так скажем и парралельно еще какие-то дейсвтия выполнять ( параметр remoteExec =1  ) , можно просто ждать результата (без выполнения каких-либо паралельный действий)

Единственный метод оптимизации для большего кол-ва объектов  в таком случае - это выполнять групповые отчеты : группы можно создать заранее с N кол-вом объектов, либо формировать по мере необходимости (в этом случае один из id объектов указывается в параметре reportObjectId, остальные в массиве в reportObjectIdList )

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

Diana Cheley
Wialon Hosting Expert
Gurtam
3

Оптимизация запросов виалон

(edited by Лео 23/10/2020 10:56:04)

Re: Оптимизация запросов виалон

А помните, @chdi мой вопрос на ту же тему?
Есть в программировании такой страшный косяк - запрос в цикле. Это когда один и тот же запрос выполняется 500 раз вместо того, чтобы один раз выполнить, передав в него список из 500 элементов.
Так вот ваша апишка позволяет нам работать с виалоном только по подобию запроса в цикле. Это крайне затратно по ресурсам вам и долго и неудобно нам.
Почему бы не зафиксировать фича-реквест на тему "сделать методы апи для работы с группой объектов"? Мы один раз заливаем список ТС, выполняем по нему какой-либо запрос и сами разбираем табличку результатов. Всё делается одним запросом. Это быстро и удобно всем.

ps: у о***ком это есть и работает удобно

4

Оптимизация запросов виалон

Re: Оптимизация запросов виалон

Лео wrote:

А помните, @chdi мой вопрос на ту же тему?
Есть в программировании такой страшный косяк - запрос в цикле. Это когда один и тот же запрос выполняется 500 раз вместо того, чтобы один раз выполнить, передав в него список из 500 элементов.
Так вот ваша апишка позволяет нам работать с виалоном только по подобию запроса в цикле. Это крайне затратно по ресурсам вам и долго и неудобно нам.
Почему бы не зафиксировать фича-реквест на тему "сделать методы апи для работы с группой объектов"? Мы один раз заливаем список ТС, выполняем по нему какой-либо запрос и сами разбираем табличку результатов. Всё делается одним запросом. Это быстро и удобно всем.

ps: у о***ком это есть и работает удобно

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

Diana Cheley
Wialon Hosting Expert
Gurtam