重新播放/重复/重新激发现有文件的Azure BlobStorage函数触发器

nvbavucw  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(90)

我刚刚上传了几十GB的文件到Azure CloudStorage。每个文件都应该被FunctionApp拾取和处理,以响应BlobTrigger

[FunctionName(nameof(ImportDataFile))]
public async Task ImportDataFile(
    // Raw JSON Text file containing data updates in expected schema
    [BlobTrigger("%AzureStorage:DataFileBlobContainer%/{fileName}", Connection = "AzureStorage:ConnectionString")]
    Stream blobStream,
    string fileName)
{
    //...
}

字符串
这在一般情况下工作,但愚蠢的是,我没有做一个最后的测试,该功能之前上传所有的文件到我们的UAT系统.
上传花了几天时间(由于CoViD-19,在我的国内互联网上行链路上运行),所以我真的不想重新做。

**是否有某种方法可以“重播”BlobUpload触发器?**这样函数就可以再次触发,就好像我刚刚重新上传文件一样.

iaqfqrcu

iaqfqrcu1#

根据此link
Azure Functions将Blob收据存储在Azure存储帐户中名为azure-webjobs-hosts的容器中,用于您的函数应用(由应用设置AzureWebJobsStorage定义)。

要强制重新处理blob,请从azure-webjobs-hosts容器中手动删除该blob的blob收据。虽然重新处理可能不会立即发生,但保证会在稍后的时间点发生。要立即重新处理,可以更新azure-webjobs-hosts/blobscaninfo中的scaninfo blob。将再次扫描上次修改时间戳在LatestScan属性之后的任何blob

jei2mxaa

jei2mxaa2#

我发现了一个hacky-AF的工作,重新处理现有的文件:
如果将元数据添加到Blob,则会重新触发BlobStorage Function Trigger。
在Azure存储资源管理器中访问,但右键单击Blob >属性>添加元数据。
我是设置键:“ForceRefresh”,值“测试”.

tcbh2hod

tcbh2hod3#

我在代码中处理blob时遇到了一个问题,这意味着webjobs-blobtrigger-poison队列中有一堆消息。我必须将它们移回azure-webjobs-blobtrigger-name-of-function-app。如果没有上述步骤,删除blob收据并调整scaninfo blob将无法工作。
幸运的是,Azure存储资源管理器有一个菜单选项,可以将消息从一个队列移动到另一个队列:
x1c 0d1x的数据

uelo1irk

uelo1irk4#

我发现了一个变通办法,如果你不投资的文件名:
Azure存储资源管理器在顶部栏中有一个“克隆新名称”按钮,它将添加一个新文件(并触发函数),而无需通过本地计算机传输数据。

  • 请注意,“复制”后接“粘贴”也会重新触发blob,但似乎会将数据传输到您的计算机,然后再次备份.
sqserrrh

sqserrrh5#

其他的答案要么不适合我,要么是太昂贵的操作是可行的。由于停机,我不得不这样做100k+ blob,这是我写的应用程序来管理此功能。需要两个包:<PackageReference Include="Azure.Storage.Blobs" Version="12.19.0" /><PackageReference Include="System.Linq.Async" Version="6.0.1" />

public class Program
{
    private static string _blobStorageConnectionString = "YOURCONNECTIONSTRING";
    private static DateTime _filterAfterDate = new DateTime(2023, 10, 17);

    public static async Task Main(string[] args)
    {
        BlobServiceClient blobServiceClient = new BlobServiceClient(_blobStorageConnectionString);
        BlobContainerClient blobContainerClient = blobServiceClient.GetBlobContainerClient("YOUR_CONTAINER_HERE");
        long iterator = 0;
        await foreach (var blob in blobContainerClient.GetBlobsAsync(BlobTraits.Metadata).Where(x => x.Properties.LastModified > _filterAfterDate/*OR ANY OTHER FILTERS*/))
        {
            BlobClient blobClient = blobContainerClient.GetBlobClient(blob.Name);
            blobClient.SetMetadata(blob.Metadata.ToDictionary(x => x.Key, y => y.Value));

            Console.WriteLine($"{++iterator} : Resubmitted blob {blob.Name}\nLastModifiedDate {blob.Properties.LastModified}\n\n");
        }
    }
}

字符串
这实际上不需要下载或重置任何blob,并维护元数据

相关问题