【问题标题】:Supplying complex state to Hangfire background job为 Hangfire 后台作业提供复杂状态
【发布时间】:2020-09-21 13:36:11
【问题描述】:

我正在编写一个 ASP.NET Core REST API,它在使用 Hangfire 启动长时间运行的异步作业后返回 201 和 202。如果作业在中途失败,Hangfire 会重新启动、运行重试等。显然,为了这样做,它需要知道一些状态。

Hangfire 建议后台作业的参数保持"small and simple",并且如果后台作业需要一些更复杂的对象来将 ID 写入数据库。

我的后台作业需要几个 API 密钥、密码、一些不太容易序列化的对象,以及一些通过内部通用配置库作为配置加载的 YAML 文件。由于这些数据的敏感性,我宁愿不将它们写入数据库。我在这里看到的选项有两个:

  1. 将较大对象的每个片段作为参数传递给 Hangfire 作业,并让 Hangfire 将它们序列化到其数据库。对于 API 密钥和密码等敏感参数,首先使用与应用程序捆绑的一些证书对其进行加密。后台作业在开始运行时从数据库中获取它们后,必须使用相同的证书对其进行解密。
  2. 在启动时将对象设置为public static 类中的某个public static 属性。后台作业可以在需要时参考。例如:
// Startup code simplified for the sake of the example
{
    var envConfigs = new EnvironmentConfiguration( ... a bunch of random stuff ... );
    service.AddSingleton(envConfigs);
    EnvironmentConfiguration.Instance = envConfigs;
}


// Hangfire job

{    
    var result = BusinessLogicDoerMethod(EnvironmentConfiguration.Instance.BusinessLogicInformation);
}

选项 1 很烦人,因为我们必须传递 很多 个参数,还必须处理加密/解密逻辑。

选项 2 可能没问题,我在这里看到的危险是,如果一个后台作业改变了 EnvironmentConfiguration 对象,其他作业和应用程序的其余部分也会看到这种突变。但是,我可以通过不这样做来轻松解决这个问题。

【问题讨论】:

    标签: c# hangfire


    【解决方案1】:

    【讨论】:

      猜你喜欢
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      相关资源
      最近更新 更多