Добавление дополнительных данных из API REST в SQL Azure - PullRequest
0 голосов
/ 21 февраля 2019

Мои потребности следующие: - Необходимо извлекать данные из стороннего API в SQL Azure.

  • API будут запрашиваться каждый день для добавочных данных и могут потребовать разбиение на страницы по умолчаниюлюбой ответ API будет давать только записи Top N.

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

По двум причинам я выбрал Function App, которая будет запускаться ежедневно, а не фабрику данных, которая может запрашивать веб-API.

Есть ли лучший способ сделать это?Также я подумываю о том, чтобы перенести весь JSON в хранилище BLOB-объектов, а затем проанализировать данные из JSON в SQL Azure.Любые рекомендации?

Ответы [ 5 ]

0 голосов
/ 05 марта 2019

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

Я хотел бы здесь сказать, что наилучшая степень параллелизма и сложности в значительной степени зависит от вашего уровня комфорта и требований.Приведенный ниже пример является своего рода «крайним» примером разделения процесса на отдельные этапы и использования функции для каждого;в некоторых случаях может не иметь смысла разделять отдельные шаги и объединять их в один. Durable Functions также помогают упростить управление этим процессом.

  • Функция, управляемая таймером, которая запрашивает API, чтобы определить глубину требуемых страниц, или ставит в очередь дополнительные страницы для второй функции, которая фактически вызывает вызов API с постраничным вызовом
  • Эта функциязатем запрашивает API и записывает в пустую область (например, Blob) или помещает каждую строку в очередь для записи / обработки (например, что-то вроде очереди хранения, так как они дешевы и быстры, или очередь шины интеграции, еслизаинтересованные стороны (например, pub / sub)
  • При записи в «блоб-блоб» функция, запускаемая BLOB-объектами, считывает BLOB-объекты и ставит в очередь отдельные записи в очередь (например, очередь хранения, так как очередь хранениябыло бы дешево и быстро для чего-то подобного)
  • Другая функция, запускаемая очередью, фактически обрабатывает запись отдельных строк в следующую систему в строке, SQL или как угодно.

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

0 голосов
/ 04 марта 2019

Сколько нужно времени, чтобы позвонить на все страницы?Если значение меньше десяти минут , я рекомендую создать функцию Azure, которая запрашивает API и вставляет данные json непосредственно в базу данных SQL.

Функция Azure

Функции Azure очень экономически эффективны .Первый миллион казни бесплатен.Если это займет больше десяти, взгляните на долговечные функции.Для обработки нумерации страниц у нас есть много примеров.Ваше точное решение будет зависеть от API, который вы вызываете, и языка, который вы используете.Вот пример в C # с использованием HttpClient .Вот один для Python с использованием запросов .Для обоих, картина похожа.Получить общее количество страниц из API, установить переменную в это значение и выполнить цикл по страницам;Получение и сохранение ваших данных в каждой итерации.Если API не предоставит максимальное количество страниц, выполните цикл, пока не получите ошибку.Подсказка: убедитесь, что указана верхняя граница для этих циклов.Кроме того, если ваш API ненадежен или имеет периодические сбои, рассмотрите возможность использования шаблона изящной повторной попытки, такого как экспоненциальный откат .

Azure SQL Индексированные вычисляемые столбцы Json

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

Использование такого соединения должно обеспечить невероятную производительность за единицу стоимости!Дайте нам знать, что вы в конечном итоге используете.

0 голосов
/ 22 февраля 2019

Если бы вы могли установить значения по умолчанию N в вашем API, тогда вы могли бы использовать веб-активность в фабрике данных Azure для вызова API остальных для получения данных ответа. Затем настройте данные ответа в качестве входных данных.активности копирования (@activity('ActivityName').output) и базы данных sql в качестве вывода.Пожалуйста, посмотрите эту ветку: Используйте выходные данные из вызова веб-активности в качестве переменной .

Поддержка веб-активности аутентификация свойств для вашего токена доступа.

Также я подумываю о том, чтобы перенести весь JSON в хранилище BLOB-объектов, а затем проанализировать данные из JSON в SQL Azure.Любые рекомендации?

Что ж, если бы вы могли сбросить данные в хранилище больших двоичных объектов, тогда Azure Stream Analytics - идеальный выбор для вас.

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

0 голосов
/ 02 марта 2019

ADF

ADF будет сомнительным, так как нумерация страниц может быть еще не готова.

Проверьте эту ссылку: https://social.msdn.microsoft.com/Forums/en-US/9e43277c-e97c-4335-a17b-e0056d85784e/perform-pagination-for-rest-api-adf?forum=AzureDataFactory

Если есть нумерация страниц, вы можете попробовать это следующим образом:

1.copy активность: http source для azure blob (это было быдорогая часть и зависит от того, сколько раз вы бежите).Или для разбивки на страницы, вы можете написать код AC # для этого на вашей виртуальной машине, если вы хотите обрабатывать файлы локально и отправлять их в хранилище BLOB-объектов Azure.

Вы можете создать внешний источник данных для BLOB-объектов в своей базе данных SQL Azure.Затем вы можете использовать openrowset и openjson для синтаксического анализа файла json.

Существуют сторонние компоненты, которые не являются бесплатными, но для них легко реализовать опции нумерации страниц.Вы просто помещаете исходный API, заголовки и настройки пагинации.(здесь я предполагаю, что у вас есть лицензия ssis на ВМ)

0 голосов
/ 22 февраля 2019

Возможно, вы можете создать задачу времени агентом SQL-сервера.

SQL server Agent - new job - Steps - new step: enter image description here

Введите в команду Импорт документов JSON из хранилища BLOB-объектов Azure sql statemanets, например.

Schedules - new schedule: enter image description here Установите время выполнения.

Но я думаю, что для этого вам лучше использовать функцию Azure. Azure Functions - это решение для простого запуска небольших кусков кода или «функций» в облаке.Вы можете написать только тот код, который вам нужен для решения проблемы, не беспокоясь о целом приложении или инфраструктуре для его запуска.Функции могут сделать разработку еще более продуктивной, и вы можете использовать предпочитаемый язык разработки, такой как C #, F #, Node.js, Java или PHP.

Это более интуитивно и эффективно.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...