Azure 持久实体或静态变量?

Azure durable entity or static variables?

问题:使用静态变量(作为编排之间的共享存储)是线程安全的还是更好地save/retrieve数据到持久实体?

同一命名空间中有几个 azure 函数:hub-trigger、durable-entity、2 个编排(主进程和监视整个进程的编排)和 activity。 他们都需要一些共享变量。在我的例子中,我需要知道主要编排实例的数量(开始新的或暂停)。在另一个编排(monitor)中完成

我已经尝试了这两个选项并询问了,因为我看到了不同的结果。

静态变量: 在我的例子中有一个通用列表,其中 SomeMyType 保存任务的 ID、状态、尝试次数、处理的记录和其他信息。 当我需要开始新的编排和 List.Add() 时,当我需要检索和修改它时,我使用简单的 List.First(id_of_the_task)。 First() - 我确定需要的任务就在那里。 对于静态变量,我有时会看到任务由于某种原因而重复 - 我使用 List.First(id_of_the_task) 检索任务 - 更改结果变量的某些内容,就是这样。代码不多。

Durable-entity: 主要区别在于,我在持久实体上添加了 List,每次我需要检索它时,我都会调用 .CallEntityAsync("getTask") 和.CallEntityAsync("saveTask") 可能会减慢应用程序的运行速度。 使用这种方法需要更多代码和调用,但它看起来更稳定,我没有看到任何重复项。

请指教

无法回答为什么在没有代码的情况下使用静态变量方法会看到重复项,可能是因为列表不是线程安全的,它可能需要 ConcurrentBag 但不确定。静态变量的一个问题是函数应用程序是否不总是打开或者它是否可以有多个实例。因为当函数卸载(或崩溃)时,状态将丢失。静态变量也不跨实例共享,因此在高负载期间它不会工作(如果可以有很多实例)。

耐用实体在这里似乎更好。是的,它们可以在许多并发函数实例之间共享,并且每个实体一次只能执行一个操作,因此它们无疑是一个更好的选择。性能成本有点高,但它们不应该比协调器慢,因为它们执行许多常见操作,写入 Table 存储,检查事件等。

不能说它是否适合您,但是 List.First(id_of_the_task) 您应该能够通过可以保存自定义数据的客户端访问 orchestrators 属性。根据使用情况的另一个想法是,您可以直接使用 CloudTable class 查询 Table 存储以获取有关 运行 编排器的信息。

虽然不完全相关,但您可以查看持久函数的一些并行设置

如果我需要澄清任何问题或者我误解了你的问题,请提出任何问题。