【发布时间】:2021-05-19 04:52:49
【问题描述】:
问题:使用静态变量(作为业务流程之间的共享存储)是线程安全的还是更好地将数据保存/检索到持久实体?
在同一个命名空间中有几个 azure 函数:hub-trigger、durable-entity、2 个编排(主进程和监视整个进程的一个)和活动。 他们都需要一些共享变量。就我而言,我需要知道主要编排实例的数量(开始新的或保留)。它在另一个编排(监视器)中完成
我已经尝试了这两个选项并询问,因为我看到了不同的结果。
静态变量:在我的例子中,有一个通用列表,其中 SomeMyType 保存任务的 ID、状态、尝试次数、处理的记录和其他信息。 当我需要开始新的编排和 List.Add() 时,当我需要检索和修改它时,我使用简单的 List.First(id_of_the_task)。 First() - 我确定需要的任务在那里。 使用静态变量,我有时会看到任务因某种原因而重复——我使用 List.First(id_of_the_task) 检索任务——更改结果变量的某些内容就是这样。代码不多。
持久实体:主要区别在于我在持久实体上添加 List 并且每次需要检索它时我都会调用 .CallEntityAsync("getTask") 和 .CallEntityAsync("saveTask ") 这可能会减慢应用程序的完成速度。 使用这种方法需要更多的代码和调用,但它看起来更稳定,我没有看到任何重复。
请指教
【问题讨论】:
-
一定要为此使用持久实体,您不能使用静态变量作为状态,因为此数据不会跨应用程序实例持久化。当您的函数进入休眠状态时,无论是等待内部或外部事件或计时器,C# 应用程序上下文都将结束。在 Azure AppFabric 上运行时,无法保证当您的应用再次启动时它将位于同一主机上,函数管道将重新启动,并且您的变量将保持默认状态。
标签: azure static-variables azure-durable-functions