【问题标题】:Dropbox's ATF - How functions/callbacks are stored in database?Dropbox\'s ATF - 函数/回调如何存储在数据库中?
【发布时间】:2022-10-25 22:22:29
【问题描述】:

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

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

还,

它需要从一开始就支持近 100 种独特的异步任务类型,并且还有增长空间。

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

任何帮助,将不胜感激。谢谢!

【问题讨论】:

  • 您是否对如何在 Dropbox ATF 或任何其他后台作业调度程序(如Hangfire)中解决它感兴趣?
  • 在任何类似的解决方案中。我只是想了解这是如何完成的。

标签: database asynchronous architecture job-scheduling system-design


【解决方案1】:

让我分享一下 Hangfire 是如何完成的,这是 .NET 世界中流行的作业调度程序。我用这个作为例子,因为我有一些经验和its source code is publicly available on github

将重复性工作排入队列

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

RecurringJob class defines several overloads for AddOrUpdate 接受不同的方法调用

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

重载预计不仅仅是一个委托(FuncAction),而是一个 Expression,因为它允许 Hangfire 检索有关的元信息

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

检索元数据

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

在上面的示例中,FromExpression 检索以下数据:

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

这些信息将存储在 Job 的属性中:TypeMethodArgs

序列化元信息

RecurringJobManager 接收此作业并通过RecurringJobEntity 包装器传递给transaction,以在作业的定义已更改或根本未注册时执行更新。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多