【发布时间】:2020-09-21 13:36:11
【问题描述】:
我正在编写一个 ASP.NET Core REST API,它在使用 Hangfire 启动长时间运行的异步作业后返回 201 和 202。如果作业在中途失败,Hangfire 会重新启动、运行重试等。显然,为了这样做,它需要知道一些状态。
Hangfire 建议后台作业的参数保持"small and simple",并且如果后台作业需要一些更复杂的对象来将 ID 写入数据库。
我的后台作业需要几个 API 密钥、密码、一些不太容易序列化的对象,以及一些通过内部通用配置库作为配置加载的 YAML 文件。由于这些数据的敏感性,我宁愿不将它们写入数据库。我在这里看到的选项有两个:
- 将较大对象的每个片段作为参数传递给 Hangfire 作业,并让 Hangfire 将它们序列化到其数据库。对于 API 密钥和密码等敏感参数,首先使用与应用程序捆绑的一些证书对其进行加密。后台作业在开始运行时从数据库中获取它们后,必须使用相同的证书对其进行解密。
- 在启动时将对象设置为
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 对象,其他作业和应用程序的其余部分也会看到这种突变。但是,我可以通过不这样做来轻松解决这个问题。
【问题讨论】: