azure - 指向一个 Blob 容器的多个 Azure 函数应用程序(触发器)
问题描述
在我们的开发环境中,我们有多个运行相同功能应用的环境,但这些环境都指向相同的存储帐户/blob 容器。
我注意到,当插入 blob 时,在多个环境中的 blob 触发器能够一次拾取同一个 blob。我确信从那时起这将是一个问题是显而易见的。
有什么办法可以防止这种情况吗??建议使用更好的触发器来处理这种情况?
我本来希望收据对于 blob 来说是全局的,而不是特定于环境的。
解决方案
运行 Azure Functions 的函数运行时/主机(在每个本地环境中)彼此隔离,因此它们都扫描传入的 blob 并分别存储收据。
在内部,每个主机创建自己的队列消息(传入 blob 信息)供 Blob 触发器使用。我的建议是使用集中队列。
当使用代码插入 blob 时,将消息(blob 名称)发送到队列。如果我们使用门户或存储资源管理器手动上传 Blob,我建议使用队列输出绑定创建一个 Blob 触发器来发送消息,请注意此触发器应仅在一台主机上运行。在这里使用 blob 触发器是一个糟糕的解决方案,因为我们实际上检索了两次 blob,但这是我可以提供手动上传的唯一方法。
// v2 C# Blob Trigger sample for manual upload public static void Run([BlobTrigger("mycontainer/{name}")]Stream myBlob, [Queue("myqueue")]out string message, string name, ILogger log) { log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name}"); message = name; }
使用 Queue Trigger 使用该队列中的消息,然后使用 Blob 输入绑定获取 Blob。通过这种方式,我们可以确保在所有主机中检索一次 blob。
// v2 C# sample public static void Run([QueueTrigger("myqueue")]string blobName, ILogger log, [Blob("mycontainer/{queuetrigger}",FileAccess.Read)]Stream myBlob) { log.LogInformation($"C# Queue trigger function processed: {blobName}"); log.LogInformation($"\n Size: {myBlob.Length} Bytes"); }
如果您使用 v1 功能,本地开发还有另一个简单的解决方案。使用这些设置,所有主机中的 Blob 触发器共享相同的内部队列和 Blob 收据。
- 在
local.settings.json
中,确保每个 Function 项目都具有相同的值AzureWebJobsStorage
(blob 收据、内部队列等所在的位置)。 - 在
host.json
中,为每个主机添加相同的id(用于构造 blob 收据和内部队列的名称),例如"id":"localhost-1300897049"
.
推荐阅读
- python - 使用 numpy.savetxt 保存结构化数组的各个列:ValueError: fmt has wrong number of % formats
- packer - Hashicorp Packer:vsphere-iso builder 部署多个磁盘?
- bash - 在 Mac 上设置或识别 MySQL 安装的 bash 命令是什么?
- google-chrome - 我可以在没有应用程序的情况下在 Chrome 中访问 USB HID 吗?
- arrays - 使用 x87 浮点程序集对数组中的元素求和
- assembly - 一个寄存器可以一次保存多个值吗?
- go - go - 如何让程序在执行期间覆盖自己
- c# - 无法使用 NuGet FileHelpers.ExcelNPOIStorage 读取 Excel 文件
- css - CSS:100%响应矩形不滚动
- ruby - 万一我能回忆起“案例”吗?