gpt4 book ai didi

database - Dropbox 的 ATF - 如何将函数/回调存储在数据库中?

转载 作者:行者123 更新时间:2023-12-05 04:21:54 24 4
gpt4 key购买 nike

我正在阅读 Dropbox 的 Async。来自 Dropbox 技术博客的任务框架及其架构:https://dropbox.tech/infrastructure/asynchronous-task-scheduling-at-dropbox

架构对我来说似乎很清楚,但我无法理解的是如何将回调(或术语中的 lambda)存储在数据库中以供以后执行?因为它们只是普通的编程语言函数,对吗?或者我在这里遗漏了什么?

此外,

It would need to support nearly 100 unique async task types from the start, again with room to grow.

他们似乎在这里谈论 lambda 的类型。但是,当用户可以在回调函数中提供任意代码时,这怎么可能呢?

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

让我分享一下在 Hangfire 的情况下是如何完成的,这是 .NET 世界中流行的作业调度程序。我以此为例,因为我对此有一些经验并且its source code is publicly available on github .

排队重复作业

RecurringJob.AddOrUpdate(() => Console.WriteLine("Transparent!"), Cron.Daily);

RecurringJob class defines several overloads for AddOrUpdate 接受不同methodCall参数:

  • Expression<Action> : 没有任何参数的同步代码
  • Expression<Action<T>> : 单参数同步代码
  • Expression<Func<Task>> : 不带任何参数的异步代码
  • Expression<Func<T, Task>> : 单参数异步代码

重载预期的不仅仅是委托(delegate)(FuncAction ),而是 Expression , 因为它允许 Hangfire 检索关于

  • 类型
    • 应该调用给定的方法
      • 使用什么参数

检索元数据

有一个类叫做 Job which exposes several FromExpression overloads .他们都在打电话 this private method它完成了所有繁重的工作。它检索类型、方法和参数元数据。

从上面的例子中这个 FromExpression检索以下数据:

  • 输入:System.Console, mscorlib
  • 方法:WriteLine
  • 参数类型:System.String
  • 参数:"Transparent!"

这些信息将存储在作业的属性中:Type , MethodArgs .

序列化元信息

RecurringJobManager 收到这份工作并传递给 transaction通过 RecurringJobEntity如果作业的定义已更改或根本未注册,则包装器执行更新。

在其内部 GetChangedFields 方法是通过 JobHelper 完成序列化的地方和一个 InvocationData 类。在幕后,他们使用 Newtonsoft 的 json.net 来执行序列化。

回到我们的示例,序列化作业(没有 cron 表达式)看起来像这样

{
"t":"System.Console, mscorlib",
"m":"WriteLine",
"p":[
"System.String"
],
"a":[
"Transparent!"
]
}

这是保存在数据库中并在需要触发作业时从中读取的内容。

关于database - Dropbox 的 ATF - 如何将函数/回调存储在数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74137352/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com