Как запросить облачные двоичные объекты в хранилище Windows Azure


Я использую Microsoft.Вид из окна.StorageClient для управления большими двоичными объектами в хранилище Azure. Я пришел к тому, что пользователю нужно перечислить загруженные файлы и изменить/удалить их. Поскольку в одном контейнере содержится много файлов, какой лучший способ запросить службы хранилища azure для возврата только нужных файлов? Кроме того, я хотел бы иметь возможность возвращать только определенное количество больших двоичных объектов, чтобы я мог реализовать подкачку.

В CloudBlobContainer есть метод под названием ListBlobs, но похоже, он возвращает все капли в контейнер. Это не сработает для меня.

Я много искал по этой теме и не смог найти ничего полезного. Эта ссылка показывает только основы.

--------- EDIT

Мой ответ ниже не извлекает капли лениво, но он извлекает все капли в контейнере, а затем фильтрует результат. В настоящее время нет решения для ленивого извлечения блобов.

4 26

4 ответа:

Что я понял о хранилище blob-объектов Windows Azure, так это то, что это голые кости. Как в чрезвычайно голых костях. Его следует использовать только для хранения документов и связанных метаданных,а затем извлекать отдельные большие двоичные объекты по идентификатору.

Недавно я перенес приложение из MongoDB в хранилище blob-объектов Windows Azure. Исходя из MongoDB, я ожидал кучу различных эффективных способов извлечения документов. После миграции я теперь полагаюсь на традиционную СУБД и ElasticSearch для хранения blob-информация в более удобном для поиска виде.

Очень жаль, что хранилище blob-объектов Windows Azure настолько ограничено. Я надеюсь увидеть намного-расширенные возможности поиска в будущем (например, поиск по метаданным, свойствам, регулярным выражениям имен blob-объектов и т. д.) Кроме того, индексы, основанные на map / reduce, были бы потрясающими. Microsoft имеет шанс преобразовать много людей из других систем хранения документов, если они сделали эти вещи.

Метод ListBlobs извлекает большие двоичные объекты в этом контейнерелениво . Таким образом, вы можете писать запросы к этому методу, которые не выполняются до тех пор, пока вы не зациклите (или материализуете объекты с помощью ToList или другого метода) список.

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

Закажите по дате последнего изменения и возьмите номер страницы 2 (10 больших двоичных объектов на странице):

blobContainer.ListBlobs().OfType<CloudBlob>()
         .OrderByDescending(b=>b.Properties.LastModified).Skip(10).Take(10);

Получить определенный тип файлов. Это будет работать, если вы установили ContentType во время загрузки (что я настоятельно рекомендую вам сделать):

blobContainer.ListBlobs().OfType<CloudBlob>()
         .Where(b=>b.Properties.ContentType.StartsWith("image"));

Получить .jpg файлы и упорядочить их по размеру файла, предполагая, что вы задаете имена файлов с их расширениями:

blobContainer.ListBlobs().OfType<CloudBlob>()
    .Where(b=>b.Name.EndsWith(".jpg")).OrderByDescending(b=>b.Properties.Length);

Наконец, запрос не будет выполнен, пока вы не скажете ему:

var blobs = blobContainer.ListBlobs().OfType<CloudBlob>()
                          .Where(b=>b.Properties.ContentType.StartsWith("image"));

foreach(var b in blobs) //This line will call the service, 
                        //execute the query against it and 
                        //return the desired files
{
   // do something with each file. Variable b is of type CloudBlob
}

Для возврата конкретных результатов одним из возможных вариантов является использование префикса blob и/или контейнера для эффективного индексирования того, что вы храните. Например, вы можете добавить префикс даты и времени при добавлении больших двоичных объектов, или вы можете добавить префикс пользователя, в зависимости от вашего варианта использования, как вы хотите "индексировать" свои большие двоичные объекты. Затем вы можете использовать этот префикс или его часть в вызове ListBlobs[Segmented] для возврата конкретных результатов, очевидно, вам нужно сначала поместить наиболее общие элементы, а затем более конкретные элементы, например:

2016_03_15_10_15_blobname

Это позволит вам получить все Blob-объекты 2016 года или Blob-объекты марта 2016 года и т. д. но не мартовские капли в любой год без нескольких звонков.

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

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

Вы также можете использовать это как метод fail back, используя подход page by page и сохраняя маркер продолжения, если пользователь щелкает одну страницу на другую последовательно или вы могли бы потенциально кэшировать имена blob-объектов и делать свою собственную подкачку из этого.

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

Azure Data Lake Gen 2 будет поддерживать данные, хранящиеся в озере данных для поиска с помощью USQL. API-интерфейсы хранилища больших двоичных объектов можно использовать для хранения и извлечения данных.