Недавно я пытался улучшить старое программное обеспечение, вышедшее из расцвета. Его основная задача - передать некоторые данные веб-приложению. Данные, о которых идет речь, поступают к нам в виде файлов XML от третьих лиц. Затем мы обрабатываем XML, преобразуем его в реляционные данные и делаем доступным для поиска и т. Д. В настоящее время мы используем монолитное приложение .net и большую базу данных Sql Server для выполнения этой работы. В этой статье я собираюсь сделать что-то подобное с низким кодом и альтернативами SaaS, доступными в Azure, а именно с Azure Search и Logic Apps.

Поиск в Azure

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

Однако для конкретной проблемы, которую я пытался решить, не было простого пути. Я смотрел на данные, которые периодически предоставлялись в виде больших файлов XML. Существуют варианты подключения поиска Azure к файлам хранилища BLOB-объектов Azure и даже анализа структурированных файлов, таких как содержимое JSON, но это может не всегда работать для вас в зависимости от сложности ваших требований. Если вам нужна максимальная гибкость, в службе поиска Azure есть полноценный REST API, который можно использовать для выполнения нескольких задач, от повторного создания индексов до загрузки, объединения и удаления записей данных.

Вот несколько примеров. Я использовал гипотетический сценарий поискового решения для библиотеки.

Создание индекса

Добавление / удаление / объединение данных

С помощью этого API вы можете сделать гораздо больше. Дополнительную документацию можно найти по адресу https://docs.microsoft.com/en-us/rest/api/searchservice/

Однако все это означает, что должен быть какой-то другой компонент за пределами Поиска Azure, который может выполнять эти вызовы REST API. Именно здесь Azure Logic Apps показались мне отличной альтернативой без кода.

Приложения логики Azure

Иногда мне сложно описать приложения Logic Apps кому-то, кто с ними не знаком. Это бессерверное предложение от Azure (что означает, что вам не нужно сосредотачиваться на создании приложения, а вместо этого вы можете просто сосредоточиться на своей логике) - похоже на Функции Azure, за исключением того, что у вас не обязательно есть писать код.

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

Посмотрев на приведенную выше последовательность, давайте посмотрим, как все это можно сделать с помощью компонентов Logic Apps.

Сначала я создаю новое приложение логики и выбираю пустое приложение на странице дизайнера приложения логики.

Теперь, предполагая, что мой XML-файл выгружается в хранилище BLOB-объектов Azure, я могу выбрать триггер, который можно напрямую интегрировать с ним.

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

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

Предположим, обрабатываемый XML-файл выглядит примерно так.

Вы хотите взять это содержимое и преобразовать его во что-то полезное для Поиска Azure. Для этого я использую действие Выбрать.

Это, вероятно, самое важное действие во всем нашем потоке, и оно может выглядеть немного загадочным, если вы не используете Logic Apps. Здесь я использую Expression, чтобы получить источник данных, которые я хочу преобразовать. Выражение звучит так.

json (xml (body (‘Get_blob_content’))) [‘books’] [‘book’]

Начиная с самого внутреннего фрагмента кода, body () является одной из наиболее часто используемых функций в приложениях логики. Его простая цель - получить результат любого другого заданного действия Action. Здесь я использую его для получения результата моего предыдущего действия Get Blob Content Action. Вы передаете имя Action в качестве параметра функции body (). Обратите внимание, что по соглашению, если вы используете пробелы в своем имени Action, они будут заменены символами подчеркивания (_).

Когда у вас есть контент, вы можете проанализировать его несколькими способами. Здесь я анализирую контент как XML, а затем, наконец, XML в JSON, используя обе функции: xml () и json (). Почему XML в JSON? Таким образом, у меня будет более детальный уровень доступа к отдельным свойствам в содержимом XML, как вы увидите позже. Наконец, мне нужно использовать метод доступа [‘books’] [‘book’], чтобы прочитать все записи книги в виде массива JSON. Функция json () просто преобразует массив XML в массив JSON.

Затем я хочу преобразовать эти данные таким образом, чтобы это было полезно для моего индекса поиска Azure.

Обратите внимание, что я добавил @@ search.action (дополнительный @ - это escape-символ), чтобы указать, что я хочу делать с каждой записью в Поиске Azure, с параметрами выгрузка, объединение , mergeOrUpload или delete. Я выбрал mergeOrUpload, чтобы элементы с одинаковым ключевым полем заменялись, а не дублировались. Ключ в этом случае будет моим полем id, как определено при создании индекса поиска Azure ранее. Я вернусь к этому чуть позже.

Теперь вы можете получить доступ к отдельным свойствам массива книг с помощью функции item ().

item () [‘attribute’]

Я добавил метку времени как ProcessedTime, чтобы указать, когда была добавлена ​​запись. Я также переименовал атрибут date в XML, чтобы он отображался в моем индексе как поле publishedDate.

Наконец, поле id будет выглядеть немного сложнее. Мне нужно что-то, что может однозначно идентифицировать книгу, поэтому я собираюсь объединить имя автора с названием книги и закодировать его в base64, чтобы получить тип строки, которая может использоваться как ключ значение.

@ base64 (concat (item () [‘автор’], item () [‘name’]))

Когда вы пытаетесь добавить это выражение, вам, вероятно, лучше переключиться в Просмотр кода и добавить его туда. Представление «Дизайн» отлично подходит для большинства задач при работе с приложениями логики, но иногда приходится переключаться между ними, когда требуется большая гибкость.

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

Вот полный вывод моего очень маленького файла XML.

Поскольку результат очень близок к тому, что я бы в конечном итоге отправил в Поиск Azure, теперь я могу начать создавать действие HTTP, чтобы сделать именно это. Я передам результат предыдущего действия Выбрать в теле этого запроса POST.

В общем, вот и все! Вот как выглядит весь поток.

Я представил здесь упрощенный пример, который можно усовершенствовать для использования в готовом к производству решении. Есть вещи, на которые вам нужно будет обратить внимание, например ограничение на 1000 документов в службе поиска Azure на запрос при работе с Rest API. Мне удалось обойти это, работая с For Loops в Azure Logic Apps, что позволило мне перебирать все объекты в моем массиве XML / JSON и отправлять запросы API для каждой 1000 из них.

И, наконец, у меня были бы документы, доступные мне в Поиске Azure, как полностью доступный для поиска контент.

Это предоставило мне довольно изящное решение, которое невероятно хорошо (с минимальными затратами) работало в интенсивных производственных средах. Хотя это отличное решение, для достижения аналогичных результатов могут быть доступны альтернативные методы и инструменты. Если вы знакомы с некоторыми из них, я хотел бы узнать о них больше, а также узнать о вашем опыте работы с Поиском Azure, приложениями логики и другими предложениями Azure.