загрузка большого количества данных больших двоичных объектов Azure в приложение WPF

Мне дали задание создать прототип приложения. У меня еще нет кода, так как концепции решений, которые я придумал, кажутся в лучшем случае вонючими...

Проблема:

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

У нас также должно быть небольшое настольное приложение (WPF), которое должно иметь возможность читать, фильтровать и сортировать эти файлы журналов.

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

Возможные решения, которые я придумал (концептуально):

1:

  • подключиться к хранилищу BLOB-объектов
  • открыть контейнер
  • чтение/загрузка больших двоичных объектов (с примененным фильтром)
  • распаковать файлы .gz
  • читать и отображать

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

2:

  • создать веб-роль, которая будет запускать службу WCF или REST
  • сервис возьмет параметры фильтра и другие вещи и вернет один файл xml/json с данными, обработка будет выполняться в облаке

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

EDIT: под фильтром я подразумеваю ограничение результатов по дате и серьезности (информация, предупреждение, ошибка). Файлы .gz сохраняются в структуре, которая делает это довольно простым, и я не буду фильтровать, просматривая сами файлы.

3:

  • какое-то другое элегантное и простое решение, о котором я не знаю

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


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


person Ivan Pintar    schedule 07.11.2012    source источник
comment
Мне непонятно. один файл .gz на запись в журнале Существует один главный журнал? Если вы собираетесь фильтровать, не заглядывая в эти файлы .gz, то как вы фильтруете?   -  person paparazzo    schedule 07.11.2012
comment
Приложение будет вызывать что-то вроде Logger.Log(severity, message). Для каждого из этих вызовов создается новый файл с именем типа серьезность-дата.gz (в имени есть еще некоторые данные, но в данном случае это не имеет значения).   -  person Ivan Pintar    schedule 07.11.2012
comment
Мне все еще не ясно. Вы говорите, что фильтруете только по имени файла .gz? Значит, у вас нет контроля над приложением Logger? У вас есть контроль над вызовами Logger.Log?   -  person paparazzo    schedule 07.11.2012
comment
Logger — это класс, который создает журналы, и это довольно большие решения, поэтому смена регистратора невозможна. Приложение WPF будет просто читать их, и да, оно будет фильтровать только на основе имени файла. Не будет необходимости фильтровать по фактическому содержанию.   -  person Ivan Pintar    schedule 07.11.2012
comment
Хорошо, что прояснил первые два вопроса. Но 3-й. У вас есть контроль над вызовами Logger.Log? Приложение будет звонить. Является ли приложение, которым вы управляете, которое вы могли бы просто обернуть вызовами в Logger.Log?   -  person paparazzo    schedule 07.11.2012
comment
Что вы имеете в виду под The? У меня есть облачная среда, в которой есть куча приложений, которые регистрируют вещи. Теперь мне нужно настольное приложение, которое будет просто читать журналы. Регистратор находится в облаке. Настольное приложение не имеет к этому доступа.   -  person Ivan Pintar    schedule 07.11.2012


Ответы (2)


Насколько я понимаю, у вас есть набор файлов журнала в хранилище BLOB-объектов Azure, которые отформатированы определенным образом (gzip), и вы хотите их отобразить.

Насколько велики эти файлы? Отображаете ли вы каждую часть информации в файле журнала?

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

Одно решение


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

1) Я бы попросил рабочую роль сканировать файл журнала в хранилище BLOB-объектов Azure. 2) Иметь какой-то механизм для отслеживания того, какие из них были обработаны, и текущее «состояние», возможно, дату UTC последнего файла gzip. 3) Выполнить всю распаковку /извлечение файла журнала в рабочей роли. 4) Рабочая роль помещает содержимое в базу данных SQL, хранилище таблиц Azure или распределенный кэш для доступа. 5) Доступ может осуществляться с помощью службы REST (ASP.NET Web API/Node). .js и т. д.)

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

Хорошая вещь в этом заключается в том, что если вам нужно масштабировать свою работу (в одночасье), вы можете развернуть 2, 3, 6 рабочих ролей ... извлечь контент, передать результат в служебную шину или очередь хранения, которые будут вставлены в SQL , кэш и т.д. для доступа.

person Bart Czernicki    schedule 07.11.2012
comment
Да, у меня есть файл gzip для каждой записи журнала, которая происходит в облачных приложениях. Хотя мне нравится идея иметь базу данных и получать к ней доступ, я не думаю, что это возможное решение на данный момент. Кроме того, журналы должны быть свежими в приложении, поэтому, если эта рабочая роль запускается и заполняет базу данных один или два раза в день, я все равно буду получать устаревшие данные в клиенте. - person Ivan Pintar; 07.11.2012
comment
Рабочие роли могут пинговать/искать обновления каждую 1 секунду, если они вам нужны, и обновлять таблицу SQL/хранилище Azure. Это может быть в значительной степени в режиме реального времени, чтобы обработать его. Я сомневаюсь, что ваше приложение создает ZIP-файлы журнала каждую секунду. Имейте в виду, что при доступе к журналам из приложения пользовательского интерфейса вы понесете транзакционные издержки ... плюс это резко ограничивает масштабируемость ваших решений для отображения необработанных файлов журналов (представьте, что вы хотите вовремя выполнить запрос или что-то еще в нескольких файлах журналов... Что вы собираетесь делать? Разархивировать 10 файлов журнала в режиме реального времени, обработать запрос и визуализировать пользовательский интерфейс?). - person Bart Czernicki; 07.11.2012
comment
Оказывается, что, возможно, рабочая роль, которая будет сохранять данные журнала в базу данных, также является вариантом, хотя и не первым вариантом, так что вот +1. - person Ivan Pintar; 12.11.2012

Простого хранения больших двоичных объектов недостаточно. Метаданные, которые вы хотите отфильтровать, должны храниться в другом месте, где их можно легко отфильтровать и получить все метаданные. Поэтому я думаю, что вы должны разделить это на 2 проблемы:

A. Как мне эффективно составить список всех «gzip» с их метаданными и как применить фильтр к этим gzip-файлам, чтобы отобразить их в моем клиентском приложении.

Решения

  • Большие двоичные объекты: список больших двоичных объектов выполняется медленно, а фильтрация невозможна (вы можете группировать в контейнере по месяцам, неделям, пользователям или ..., но это не фильтрация).
  • Хранилище таблиц: Очень быстро, но поиск медленный (индексируются только PK и RK)
  • SQL Azure: вы можете создать таблицу со списком «gzip» вместе с некоторыми другими метаданными (например, пользователь, создавший gzip, когда, общий размер и т. д.). Используя хранимую процедуру с несколькими хорошими индексами, вы можете сделать поиск очень быстрым, но SQL Azure — не самое масштабируемое решение.
  • Lucene.NET: существует AzureDirectory для Windows Azure, который позволяет использовать Lucene.NET в вашем приложении. Это сверхбыстрая поисковая система, которая позволяет вам индексировать ваши «документы» (метаданные), и это идеально подходит для фильтрации и возврата списка «gzip».

Обновление. Поскольку вы фильтруете только по дате и серьезности, вам следует просмотреть параметры больших двоичных объектов и таблиц:

  • Большие двоичные объекты: вы можете создать контейнер на дату + уровень серьезности (20121107-низкий, 20121107-средний, 20121107-высокий...). Предполагая, что у вас не слишком много больших двоичных объектов на данные + серьезность, вы можете просто перечислить большие двоичные объекты непосредственно из контейнера. Единственная проблема, которая может возникнуть здесь, заключается в том, что пользователь захочет просмотреть все элементы с высокой серьезностью за последнюю неделю (7 дней). Это означает, что вам нужно перечислить большие двоичные объекты в 7 контейнерах.
  • Таблицы: даже если вы говорите, что хранилище таблиц или БД не вариант, подумайте о хранении таблиц. Используя разделы и ключи строк, вы можете легко фильтровать очень масштабируемым способом (вы также можете использовать CompareTo, чтобы получить диапазон элементов (например, все записи с 1 по 7 ноября). Дублирование данных идеально приемлемо в хранилище таблиц. Вы можете включить некоторые данные из gzip в объект хранилища таблиц, чтобы отобразить их в своем приложении WPF (наиболее важная информация, которую вы хотите отобразить после фильтрации). Это означает, что вам нужно будет обработать только blob, когда пользователь открывает/дважды щелкает запись в приложении WPF

B. Как отобразить "gzip" в моем приложении (например, после двойного щелчка по результату поиска)

Решения

  • Подключитесь к учетной записи хранения из приложения WPF, загрузите файл, распакуйте его и отобразите. Это означает, что вам нужно будет сохранить учетную запись хранения в приложении WPF (или использовать SAS или политику контейнера), и если вы решите изменить что-то в бэкэнде, как хранятся файлы, вам также нужно будет изменить WPF-приложение.
  • Подключиться к веб-роли. Эта веб-роль получает большой двоичный объект из хранилища больших двоичных объектов, распаковывает его и отправляет по сети (или отправляет в сжатом виде, чтобы ускорить передачу). Если что-то изменится в том, как вы храните файлы, вам нужно только обновить веб-роль.
person Sandrino Di Mattia    schedule 07.11.2012
comment
Ну, фильтр, возможно, неправильный термин, но я бы ограничил результаты датой и уровнем журнала (информация, предупреждение, ошибка), я отредактирую вопрос, чтобы это было ясно. Файлы BLOB-объектов структурированы таким образом, что это не должно быть большой проблемой. Как я ответил Барту Черницки, БД (таблица или SQL), вероятно, не будет вариантом. Что касается второй части, я хотел бы иметь возможность отображать некоторые данные в самом списке, а не только при выборе одного блоба. Кстати +1 за люцен здесь. Идея мне нравится, обязательно присмотрюсь. - person Ivan Pintar; 07.11.2012
comment
Еще немного подумав, действительно ли мне нужен lucene, если я фильтрую по дате и серьезности, что в основном будет просто структурировать имя файла, как и ожидалось, и проверять, есть ли оно там. - person Ivan Pintar; 07.11.2012