微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python Durable Functions 努力获取 Blob URL

如何解决Python Durable Functions 努力获取 Blob URL

我有一个例程可以对数千个订单进行评分,因此运行起来需要一些时间。我正在尝试设置它,以便调用例程的前端 UI 可以检查它的进度,所以我决定通过 Azure Durable Function 来完成。我对其他 Azure Functions 有很多经验,但 Durable Function 对我来说是新的。最初我创建了一个字典,其中包含已完成的订单和尚未完成的订单,然后使用:

context.set_custom_status(status_update)

这适用于测试小订单,但问题是对于大样本,它超过了 Azure 允许 JSON 文本的 16kb 限制。所以我找到了一个建议,将更新写入 Blob,然后将 Blob URL 发送到自定义状态。这就是我一直在用头撞墙的地方。

我尝试了不同的方法来做到这一点,但我总是遇到的问题是 1. blob 尝试保存为相同的名称并崩溃。 2.自定义状态只是Null。我猜它与运行多个实例有关,但这种类型的功能对我来说是新的,所以我可能会被它弄糊涂,并不确定处理它的最佳方法

这段代码都在我的 DurableFunctionsorchestrator 函数中。这是我尝试这样做的一种方法,同时让“更新”函数处理将文件放入 blob 中。

       for order in orders:
           print(order)
           custom_update = yield context.call_activity('Update',order)
           context.set_custom_status(custom_update)
           # expected this custom_update to return the URL for the blob,but the custom update is Null

我也尝试过这种方式,让协调器功能保存 blob:

        for order in orders_list:
            order_status = yield context.call_activity('Update',order)
            print(order_status)
            rated_orders.append(order)
            not_rated_orders = list(filter(lambda order: order not in rated_orders,orders_list))
            status_update.update({'Rated Orders' : rated_orders,'Orders to process' : not_rated_orders})
            blob_name = f'test_{order}.json'
            blob = BlobClient.from_connection_string(conn_str=connection_string,container_name=container,blob_name=blob_name)
            blob.upload_blob(json.dumps(status_update))
            custom_update = {'Blob Url' : str(blob.url)}
            print(f"{blob_name} : {custom_update}")
            context.set_custom_status(json.dumps(custom_update))

方法将更新自定义状态,但不久后会因此错误而崩溃:

System.Private.CoreLib:执行函数时出现异常: Functions.DurableFunctionsorchestrator。 Microsoft.Azure.WebJobs.Extensions.DurableTask:orchestrator > > 函数“DurableFunctionsorchestrator”失败:指定的 blob 已存在。 请求 ID:911649d3-401e-011b-23ef-532bf4000000 时间:2021-05-28T18:29:52.5057612Z 错误代码:BlobAlreadyExists 错误:无。

因此,即使我尝试将订单保存为 Blob 名称,并且订单都是唯一的,但它仍在尝试再次处理该订单,我的猜测是因为它正在运行不同的实例。

如何让程序只处理一次订单,将已处理订单的更新状态保存到 Blob,并在我请求 Durable Function 的 GET 更新时在 customStatus 中返回 Blob 的 URL编排器?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。