Параллельная загрузка таблиц в Облаке PowerBI

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

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

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

К сожалению, в веб версии (облаке PowerBI) эта галка никак не влияет на выполнение, и облако делает сразу несколько параллельных запросов к нашему серверу.

Это нагружало сервер параллельными запросами, потом произошли улучшения 1) Кеширование запросов 2) Сбор данных из битрикса в 1 поток. 

Если был запрос 2, 3 или большим потоком мы возвращали 200 ответ "in_process"

Оказалось что облако PowerBI увидев это в параллельном потоке читало как 200 ответ, и начинало искать ключи по правилам данных, что ожидаемо вызвало ошибку.

Результат- обновление в облаке не срабатывало.


Оказалось что что есть несколько HTTP кодов при которых сервис PowerBI Делает автоматический рефреш https://docs.microsoft.com/en-us/power-query/handlingstatuscodes

Мы попробовали 504 и заголовок ['Retry-After'] = 120 (максиму 3 повторения!!)

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


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

import time
time.sleep(5)

return HttpResponseRedirect(request.build_absolute_uri())

Это работает!!!!

минусы решения

1) занимает UWSGI обработчики django  

2) каждому потоку отдает из кеша весь набор данных (нагрузка на сеть)


По хорошему можно доделать (пока можно жить так, но потом можно улучшить)

1) чтоб не занимало uwsgi обработчики... или их вынести в отдельное uwsgi приложение, тогда очередь будет для таких запросов (и будет еще чуть подтупливать через nginx при нагрузке)

2) определить что этот запрос был не первый из сервис PowerBI и на остальные отвечать ошибкой, тогда сервису придется использовать данные из первого потока


Полезные ссылки

https://docs.microsoft.com/en-us/power-query/handlingstatuscodes

 https://docs.microsoft.com/en-us/power-query/handlingstatuscodes