为 Hangfire 后台作业提供复杂状态
Supplying complex state to Hangfire background job
我正在编写一个 ASP.NET Core REST API returns 201s 和 202s 在使用 Hangfire 启动长时间的 运行ning 异步作业之后。如果作业在中途失败,Hangfire 将重新拾起,运行 重试等。显然,为了这样做,它需要知道一些状态。
Hangfire 建议保留后台作业的参数 "small and simple",如果后台作业需要一些更复杂的对象来将 ID 写入数据库。
我的后台作业需要几个 API 密钥、密码、一些不太容易序列化的对象,以及一些通过内部通用配置库作为配置加载的 YAML 文件。由于这些数据的敏感性,我宁愿不将它们写入数据库。我在这里看到的选项有两个:
- 将每个 piece 较大的对象作为参数传递给 Hangfire 作业,并让 Hangfire 将它们序列化到它的数据库中。对于 API 密钥和密码等敏感参数,首先使用与应用程序捆绑在一起的证书对其进行加密。后台作业在开始 运行ning.
时必须在从数据库中获取它们后使用相同的证书对其进行解密
- 启动时在
public static
class 中将对象设置为某些 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
对象,其他作业和应用程序的其余部分也会看到该突变。但是,我可以通过简单地不这样做来轻松解决这个问题。
我正在编写一个 ASP.NET Core REST API returns 201s 和 202s 在使用 Hangfire 启动长时间的 运行ning 异步作业之后。如果作业在中途失败,Hangfire 将重新拾起,运行 重试等。显然,为了这样做,它需要知道一些状态。
Hangfire 建议保留后台作业的参数 "small and simple",如果后台作业需要一些更复杂的对象来将 ID 写入数据库。
我的后台作业需要几个 API 密钥、密码、一些不太容易序列化的对象,以及一些通过内部通用配置库作为配置加载的 YAML 文件。由于这些数据的敏感性,我宁愿不将它们写入数据库。我在这里看到的选项有两个:
- 将每个 piece 较大的对象作为参数传递给 Hangfire 作业,并让 Hangfire 将它们序列化到它的数据库中。对于 API 密钥和密码等敏感参数,首先使用与应用程序捆绑在一起的证书对其进行加密。后台作业在开始 运行ning. 时必须在从数据库中获取它们后使用相同的证书对其进行解密
- 启动时在
public static
class 中将对象设置为某些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
对象,其他作业和应用程序的其余部分也会看到该突变。但是,我可以通过简单地不这样做来轻松解决这个问题。