我有多个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存储容器中设置任何设置?
-
Azure存储blob的新功能,我们非常感谢您提供帮助。
答案 0 :(得分:0)
由于我们已经在代码中使用了Apache camel,因此我们尝试使用camel azure-blob组件来解决该问题。下面是我们使用的方法, 对于我们的情况,竞赛条件仍然可以接受 。 骆驼路线始于计时器使用者,生产者使用以下端点从容器获取blob列表,
azure-blob://<account>/<container>?credentials=#storagecredentials&blobType=blockBlob&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>
关键点::在此类处理方法中
,该选项调用元数据端点以更新特定的Blob。
然后使用另一个处理器形成下载blob端点
azure-blob://<account>/<container>/*<blobName>*?credentials=#storagecredentials&blobType=blockBlob&operation=getBlob
,然后使用收件人列表从消息头获取处理器端点。
最终形成另一个删除端点,该端点将在下载后立即删除。