我目前正在使用Hangfire来匿名化大量数据库中的用户数据(yay GDPR) . 对于测试环境,我们需要匿名化所有数据 .

这是大约500万条记录 . 作业的结构方式是我在聚会表中添加了一个状态列

  • 没有

  • Todo

  • 入队

  • InProcess

  • 完成

因此,首先有一个查询将所有记录的状态更新为1,然后是一些查询,这些查询准备表以帮助进行匿名化 .

之后,匿名化本身就开始了 . 第一项工作是循环所有各方以更新状态以排队,然后添加后台作业以匿名化一方 .

拾取该作业后,状态将更新为InProcess,并且实际作业将排入队列

var hangfireJobId = BackgroundJob.Enqueue<IGeneralDataProvider>(x => x.AnonymizeStep1(arguments.PartyId));
hangfireJobId = BackgroundJob.ContinueWith<IGeneralDataProvider>(hangfireJobId, x => x.AnonymizeStep2("some param", "some other param", arguments.PartyId));
hangfireJobId = BackgroundJob.ContinueWith<IGeneralDataProvider>(hangfireJobId, x => x.AnonymizeStep3(arguments.PartyId));
hangfireJobId = BackgroundJob.ContinueWith<IGeneralDataProvider>(hangfireJobId, x => x.AnonymizeStep4(arguments.PartyId));

......等到第35步

这里正在执行的作业都是存储过程(所以低cpu / io) .

但最终的结果(我现在正在测试)并不是我所希望的 .

我有16个服务器实例运行默认的20个工作线程 . 进展非常缓慢,排队工作的循环需要花费太多时间 .

我正在考虑将最后一步放在优先级队列上,以便更快地完成这些工作 .

作业的吞吐量似乎很糟糕,但我认为这是因为我们使用Ms SqlServer作为后备存储 . 我似乎无法说服我的同事改用redis会加快这个过程 .

我确定Hangfire是一个可以使用的平台,我只是做错了 .

任何帮助,指针,提高吞吐量和性能的提示都非常感谢 .