Azure blob存储文件由多个azure节点

时间:2018-06-11 02:54:08

标签: azure apache-camel azure-storage-blobs azure-blob-storage

我有多个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存储容器中设置任何设置?

-

尝试使用块blob(blobType)来使用Camel Azure-bolb组件。

Azure存储blob的新功能,我们非常感谢您提供帮助。

1 个答案:

答案 0 :(得分:0)

由于我们已经在代码中使用了Apache camel,因此我们尝试使用camel azure-blob组件来解决该问题。下面是我们使用的方法, 对于我们的情况,竞赛条件仍然可以接受 。 骆驼路线始于计时器使用者,生产者使用以下端点从容器获取blob列表,

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

注意:storagecredential是类型为StorageCredentialsAccountAndKey类的Bean。

使用exchange.getIn()。getBody()=>创建了一个实现骆驼处理器并在process()方法中实现的Java类,该类提供了具有ListBlobItem的可迭代对象。

首先,我使用以下端点设置blob的元数据

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

注意:blobMetaData1是在上下文文件中创建的bean。

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

关键点::在此类处理方法中

  1. 验证是否设置了元数据,如果已设置,则 进程已经被选中。这样就不会再被选中 假设进程是否在其他服务器上执行
  2. 从ListBlobItem单个Blob项目中获取Blob名称。 使用getURI()并在此处理器类中形成端点。 为了调用自定义端点,用于将其设置为客户 In邮件的标题值。
使用接收者骆驼选项

,该选项调用元数据端点以更新特定的Blob。

然后使用另一个处理器形成下载blob端点

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

,然后使用收件人列表从消息头获取处理器端点。

最终形成另一个删除端点,该端点将在下载后立即删除。