1

我有一个函数应用程序,它在上传或更新 blob 时触发。但在我的要求中,我的容器一次可能会收到数千个 blob(客户将批量上传 blob 到容器)。在这种情况下,据我所知,函数应用程序将为容器中的每个 blob 并行运行。但我需要在队列中处理它们。所以,我想在这里使用队列存储。每当上传 Blob 时,让我通过 Blob 触发函数应用程序将该 Blob 名称作为队列消息添加到队列存储,然后我将拥有一个队列触发函数应用程序,它将触发和处理队列中的 Blob。如果我的方法有误,请纠正我?另外,我需要知道有没有办法从函数应用程序中添加队列消息。

4

2 回答 2

1

您应该在您的场景中使用 Azure 事件网格推拉事件模式,其中存储帐户会将事件直接推送到存储队列订阅者处理程序。

该解决方案不需要任何编码。

于 2020-03-30T11:09:22.710 回答
1

你的方法是正确的。我在我的应用程序中做了同样的事情当多个用户在 blob 上上传图像时,我添加了 blobnameurl存储队列。您可以创建 Azure 函数来处理来自队列的消息,但请确保您的 Azure 函数batchSize为 1

Azure 函数存储队列触发器默认批量大小为 16,它将并行处理 16 条消息。主机.json

用于在队列中创建新实体和上传实体详细信息的示例API 代码。

await this.adRepository.AddEntity(ad);           
        var adDto = this.mapper.Map<AzureSearchServiceDto>(ad);

        //Push data in Queue
        await this.storageService.PushMessageIntoQueue(AppConstraint.ImageVerificationQueue, adDto .ToJson());

功能 验证图像和创建缩略图

[FunctionName("ImageVerificationFunction")]
    public async Task Run([QueueTrigger("%ImageVerificationQueue%", Connection = "StorageConnection")]string message, ILogger log)
    {
        log.LogInformation($"ImageVerificationFunction processed: {message}");
        var azureSearchServiceDto = JsonConvert.DeserializeObject<AzureSearchServiceDto>(message);
        await this.imageVerificationService.Verify(azureSearchServiceDto);
    }

storageService是我在存储队列中发送消息的自定义服务

于 2020-03-30T10:40:15.883 回答