Доступ к файлу хранилища BLOB-объектов Azure несколькими узлами Azure

У меня есть несколько файлов формата JSON, которые помещаются в учетную запись хранения Azure в определенном контейнере. В контейнере n файлов.

И от 4 до 8 узлов, которые будут обращаться к контейнеру хранилища Azure для локальной загрузки файлов, код загрузки написан на Java.

Поскольку существует n файлов и несколько файлов, обращающихся к контейнеру одновременно, как избежать ситуации, когда один и тот же файл загружается другим сервером?

Example:
 Azure container has 1.json, 2.json, 3.json, etc which are > 35 MB size.
 batch-process-node1 -> starts downloading 1.json
 batch-process-node2 -> starts downloading 2.json
 batch-process-node3 -> should not start downloading the 1.json 

Есть ли какая-то логика, которая будет построена для каждого узла, в котором есть процесс Java, для уникальной загрузки файла? Есть ли какие-либо параметры, которые можно задать в контейнере хранилища Azure?

-

Попытка использовать компонент Camel Azure-bolb, используя блоб blob (blobType).

Новое в хранилище BLOB-объектов Azure, любая помощь приветствуется.

1 ответ

Поскольку в коде мы уже используем верблюда Apache, мы попытались использовать компонент camel azure-blob для решения этой проблемы. Ниже представлен подход, который мы использовали, но условия гонки приемлемы для нашего сценария. Верблюжий маршрут начался с потребителя таймера и производителя, чтобы получить список больших двоичных объектов из контейнера, используя ниже конечную точку,

azure-blob://<account>/<container>?credentials=#storagecredentials&amp;blobType=blockBlob&amp;operation=listBlobs

Примечание: storagecredential - это компонент класса StorageCredentialsAccountAndKey.

Создан Java-класс, реализующий Processor of camel, и метод process(), использующий exchange.getIn(). GetBody() =>, который предоставляет итеративный объект с параметром ListBlobItem.

Сначала я устанавливаю метаданные блоба, используя нижнюю конечную точку

azure-blob://<account>/<container>/*<blobName>*?credentials=#storagecredentials&blobType=blockBlob&operation=updateBlockBlob&blobMetadata=#blobMetaData1

Примечание: blobMetaData1 является компонентом, созданным в файле контекста.

 <util:map id="blobMetaData1" map-class="java.util.HashMap">
        <entry key="someKey" value="someValue"/>
 </util:map>

Ключевая вещь: в этом методе процесса класса

  1. проверять, установлены ли метаданные или нет, если установлено, то процесс уже выбран BLOB-объектом. поэтому он не будет выбран снова, если процесс выполняется на другом сервере.
  2. получил имя большого двоичного объекта из отдельного элемента большого двоичного объекта ListBlobItem. используя getURI() и формируя конечную точку в этом классе процессора. чтобы вызвать пользовательскую конечную точку, используется для установки значения заголовка клиента в сообщении In.

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

Затем использовал другой процессор для формирования конечной точки BLOB-объекта загрузки.

  azure-blob://<account>/<container>/*<blobName>*?credentials=#storagecredentials&blobType=blockBlob&operation=getBlob  

и использование receiveientList для получения конечной точки процессора из заголовка сообщения.

наконец, формируется еще одна конечная точка удаления, которая будет удаляться после загрузки.

Другие вопросы по тегам