Azure 持久实体,用于存储运行之间的函数应用程序状态 (.net 6)

2024-01-07

我想每分钟运行一个简单的 .net 6 c# 消耗 azure 函数应用程序(不持久),但我需要记住上次运行的状态。

状态由 json 可序列化对象的数组和一些访问令牌字符串组成。

所以我创建了一个像这样的持久功能实体:

[JsonObject(MemberSerialization.OptIn)]
public class DurableStorageEntity
{
    [JsonProperty("simpledata")]
    public string SimpleData { get; set; }

    [JsonProperty("complicateddata")]
    public List<ComplicatedObject> ComplicatedData { get; set; }

    public void SetSimpleData(string data) => this.SimpleData = data;


    public void SetComplicatedObject(List<ComplicatedObject> data) => this.ComplicatedObject = data;

    [FunctionName(nameof(DurableStorageEntity))]
    public static Task Run([EntityTrigger] IDurableEntityContext ctx)
        => ctx.DispatchAsync<DurableStorageEntity>();
}

这很有效,但我不确定这有多高效以及我可以通过这种方式存储多少状态数据。经过测试后,我也不确定从常规(即非持久)函数应用程序调用时这是否可靠。

我找不到这方面的任何明确信息。在里面关于实体函数的 MS 文档 https://learn.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-entities?tabs=csharp它只是指出:

实体函数定义读取和更新小块状态的操作,称为持久实体。

And

实体提供了一种通过将工作分布到多个实体(每个实体具有适度大小的状态)来扩展应用程序的方法。

所以这让我不确定我可以存储多少数据。我通常会存储几个包含数百个项目的数组,每个对象由字符串、整数和日期组成。如果有更好的方法来存储运行之间的状态,那么欢迎使用替代方案,但我确实喜欢使用这些实体函数,所以我希望它是一个可行且可靠的选择。

12月2日更新:

我一直在测试使用 100 项对象数组(字符串、整数、日期时间)存储对象列表。

我在我的机器上本地运行这个。我可能做错了什么,但有时它会返回我之前存储的旧数据,而不是持久实体存储中存储的最新数据。我不知道为什么会发生这种情况。我可以通过存储大量数据来实现它,但它在其他时候也会随机发生。

生成了 100 个对象 大小:6 365 853 字节 读取时间:250ms 写入时间:215ms

生成了 1000 个对象 大小:63 658 851 字节 读取时间:2s 659ms 写入时间:1s 811ms

生成了 10000 个对象 写入似乎成功,但读取时得到了之前的 1000 个对象

生成了 10 个对象 按预期读回 10 个对象

生成了 2000 个对象 错误:仍然得到 10 个对象

生成了 1000 个对象 错误:仍然得到 10 个对象

生成了 100 个对象 错误:仍然得到 10 个对象

生成 1 个对象 终于如愿拿回了 1 个对象

生成了 10 个对象 错误:三次运行仍然获取 1 个对象,但在第四次运行函数应用程序时突然获取 10 个对象,因为它应该。

这是在我的本地机器上,win10,i7,32Gb RAM,并且在 VS2022 中没有调试器。


是的,这可能是预期的结果。这并不是说实体不可靠。它们工作得很好,并且对于存储功能数据来说是可靠的,但它们可以有延迟更新,使系统像任何分布式系统一样工作。 持久实体是一个基于队列的系统,基于天蓝色存储队列和表工作。当为 SetComplicatedObject 创建 SignalEntityAsync 时,它将在队列中创建一条消息。然后实体将在某个时刻执行 SetComplicatedObject。可能会立即发生,也可能在执行前延迟一段时间发生。在执行之前,将从 azure 表中读取实体。然后它将执行并将其保存回表中(如果实体太大,将使用 blob)。当实体对象变大时,读取和保存将花费更长的时间,因此实体可能需要更长的时间才能完全执行信号和更新。

在 Azure 函数中,ReadEntityState 将从表中读取数据(提交的数据)。因此读取的数据可能会也可能不会完全更新。

根据你的解释,我认为触发器看起来像这样。将复杂对象更改为 int 列表并添加第二次读取以说明更新更改。

public static int Ptr = 0;
public static int[] Sizes = new int[] { 0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000};
[FunctionName("Function1")]
public async Task Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log, [DurableClient] IDurableEntityClient client)
{
    var entityId = new EntityId(nameof(DurableStorageEntity), "test");
    await client.SignalEntityAsync(entityId, "SetComplicatedObject", new List<int>(new int[Sizes[Ptr]]));
    await Task.Delay(500);
    var item1 = await client.ReadEntityStateAsync<DurableStorageEntity>(entityId);
    await Task.Delay(1000);
    var item2 = await client.ReadEntityStateAsync<DurableStorageEntity>(entityId);
    log.LogInformation($"End - Expected size: {Sizes[Ptr]} - Item1 size: {item1.EntityState.ComplicatedData.Count} - Item2 size: {item2.EntityState.ComplicatedData.Count}");
    Ptr++;
}

这产生了输出(运行不同时间时可能会有所不同)

End - Expected size: 0 - Item1 size: 0 - Item2 size: 0
End - Expected size: 1 - Item1 size: 1 - Item2 size: 1
End - Expected size: 10 - Item1 size: 10 - Item2 size: 10
End - Expected size: 100 - Item1 size: 100 - Item2 size: 100
End - Expected size: 1000 - Item1 size: 1000 - Item2 size: 1000
End - Expected size: 10000 - Item1 size: 10000 - Item2 size: 10000
End - Expected size: 100000 - Item1 size: 100000 - Item2 size: 100000
End - Expected size: 1000000 - Item1 size: 1000000 - Item2 size: 1000000
End - Expected size: 10000000 - Item1 size: 1000000 - Item2 size: 10000000

请注意上次运行的“错误”,其中 Item1 不正确,但又过一秒后,Item2 获得了正确的项目,因为表中的实体在读取之间进行了更新。

持久实体不能保证所有更新均已执行。那么您可能必须切换到其他一些数据存储解决方案。 Sql、NoSql 等。您还可以使用 azure 表存储,但没有持久实体,只需立即读取和更新表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Azure 持久实体,用于存储运行之间的函数应用程序状态 (.net 6) 的相关文章

  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi

随机推荐

  • 如何在 JOptionPane 上添加文本区域

    目前我有一个JOptionPane 单击按钮后 我正在执行以下行 JOptionPane showInputDialog this Enter your message Messages 2 它会打开一个带有文本框的弹出窗口 此文本框接受大
  • Elasticsearch、Tire 和嵌套查询/与 ActiveRecord 的关联

    我正在使用 ElasticSearch 和 Tire 来索引和搜索一些 ActiveRecord 模型 并且我一直在寻找索引和搜索关联的 正确 方法 我还没有找到最佳实践 所以我想问是否有人有一种他们认为非常有效的方法 作为一个示例设置 这
  • Android OpenGL ES 生成纹理的圆形网格

    我是 Android 上的 OpenGL ES 新手 我有一个关于为代表圆形的纹理生成网格的问题 左边是所需的网格 右边是我的纹理 如何生成左侧的网格 然后按以下方式渲染 triangle1 Centerpoint WhitePoint n
  • 使用 ggplot2 的发散堆积条形图:图例中的因子排序问题

    我正在尝试绘制李克特量表数据发散堆积条形图 with ggplot2 我见过很多解决方案 其中我发现最好的一个是这个多方面的解决方案 https stackoverflow com questions 51201852 faceted ho
  • 使用单个接口注册多个实现

    有没有一种方法可以使用 simple injector 注册由多个具体类实现的单个接口 而不使用模板接口 说我们有 2 节课MyClass1 and Myclass2这两个类都在实现IInterface1 现在使用 simple injec
  • 在 Pandas Dataframe 中查找空或 NaN 条目

    我正在尝试搜索 Pandas Dataframe 以查找其中缺少条目或 NaN 条目的位置 这是我正在使用的数据框 cl id a c d e A1 A2 A3 0 1 0 419279 0 843832 0 530827 text76 1
  • 建立空链接的不同方法?

    除了这些方法之外 还有没有办法制作空链接呢 a href Example a a href Example a a href Example a 我不介意使页面跳转到顶部的某些内容 但我不希望它更改地址栏中的 URL 理想的链接应尽可能类似
  • Android adb 在列表设备和其他命令中挂起

    当我尝试从终端运行 adb 命令时 尤其是adb devices adb kill server and adb start server它挂起 我需要输入CTRL C退出进程 无法将 APK 部署到物理或虚拟设备 有东西阻止了 adb 进
  • 网站在移动浏览器中看起来不正确

    我现在正在构建一个网站 当我在移动浏览器上加载该网站时 一些元素被推到左侧 在右侧留下难看的空白 我的猜测是 大的米色矩形 直接位于导航下方 的宽度大于其下方的包装纸 注意 矩形不包含在包装器内 但是 我尝试了几种不同的方法 但仍然出现右侧
  • Marklogic:导入 csv 时在文档上创建多个 XML 文件。如何获取根文档 URI 路径?

    我是 Marklogic 的新手 我尝试将 100k 记录的 CSV 文件导入到 Marklogic 导入后 我发现它默认导入到文档数据库 另外 我发现对于每条记录 我都会看到数据库中生成的 XML 文件 其中增量编号附加到我在导入时提到的
  • 用 Perl 编写编译器的一部分(用 C++ 编写)

    我正在尝试了解更多有关编译器和编程语言的知识 很遗憾我的大学不提供有关编译器的课程 所以我必须自己做 谢谢互联网 此刻我tryin为了理解和实现我的语言的词法分析器 我需要正则表达式 我习惯很快地编写 Perl 正则表达式脚本 我认为我可以
  • Jquery 成功函数未使用 JSONP 触发

    一直在使用 jQuery 调用我的服务 该服务位于不同的域中 对服务的调用已成功进行 我的调试点被触发 并且返回了正确的响应 我嗅探了流量 我的问题主要是成功和失败回调不会被触发 我读过一些其他帖子 https stackoverflow
  • 访问 VBA 错误“此类对象不支持操作”

    我有这个 vba 代码 但我不明白为什么它返回错误me ID 存储为字符串顺便说一句 Private Sub ID AfterUpdate Dim db As DAO Database Dim rs As DAO Recordset Me
  • 从其他 Xaml 文件绑定到 Usercontrol 内的元素

    谁能告诉我如何绑定到用户控件的元素 我尝试使用数据触发器与 IDataErrorInfo 一起禁用 启用按钮 所以当元素位于同一视图上时我通常会这样做
  • 调用带注释的方法时运行另一个函数

    有没有办法创建自定义或使用现有注释来在调用带注释的方法时触发代码运行 最好 我想使用 Spring 库 例如 SendEmail templateName public void doSomething log info Something
  • 如何更改内容类型 Python

    我想将文件上传到远程设备 如果我查找与wireshark的连接 我会得到这个 POST saveRestore htm cgi HTTP 1 1 Host 10 128 115 214 User Agent Mozilla 5 0 X11
  • Elmah 没有记录 HttpRequestValidationException

    在我的 ASP NET MVC2 应用程序中 Elmah 无法记录任何HttpRequestValidationException 除非您通过远程桌面登录网络服务器并以本地主机身份浏览该网站 例如 如果我输入 39使用我获得的域名从我的电脑
  • 不包含引号但可以包含转义引号的正则表达式

    我正在寻找一个正则表达式来匹配一个字符串 该字符串可以包含除单引号之外的任何内容 但如果引号被转义 则应该匹配 本质上 我想匹配字符串 Tuco and Tuco ABC 但不是 Tuco 看起来下面的内容与引号不匹配 但无法匹配引号 什么
  • 引起原因:java.sql.SQLException:找不到jdbc的合适驱动程序:mysql://localhost:3306/domain

    你好我正在使用以下 hibernate core 4 1 2 Final jar mysql connector 5 1 6 jar 两者都可以在我的项目 lib 目录中找到 我有以下内容休眠 cg xml配置
  • Azure 持久实体,用于存储运行之间的函数应用程序状态 (.net 6)

    我想每分钟运行一个简单的 net 6 c 消耗 azure 函数应用程序 不持久 但我需要记住上次运行的状态 状态由 json 可序列化对象的数组和一些访问令牌字符串组成 所以我创建了一个像这样的持久功能实体 JsonObject Memb