Доступ к файлу хранилища 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&blobType=blockBlob&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>
Ключевая вещь: в этом методе процесса класса
- проверять, установлены ли метаданные или нет, если установлено, то процесс уже выбран BLOB-объектом. поэтому он не будет выбран снова, если процесс выполняется на другом сервере.
- получил имя большого двоичного объекта из отдельного элемента большого двоичного объекта ListBlobItem. используя getURI() и формируя конечную точку в этом классе процессора. чтобы вызвать пользовательскую конечную точку, используется для установки значения заголовка клиента в сообщении In.
использование опции верблюда receientList, которая вызывает конечную точку метаданных для обновления определенного большого двоичного объекта.
Затем использовал другой процессор для формирования конечной точки BLOB-объекта загрузки.
azure-blob://<account>/<container>/*<blobName>*?credentials=#storagecredentials&blobType=blockBlob&operation=getBlob
и использование receiveientList для получения конечной точки процессора из заголовка сообщения.
наконец, формируется еще одна конечная точка удаления, которая будет удаляться после загрузки.