我们目前正在使用quartz调度程序来调度作业,但我们需要避免作业调度,因为如果有1000个作业,它将消耗资源,任何建议替代方案将不胜感激。
最常见的变体(在我看来)最好的变体是使用像 Quartz.NET 这样的作业调度程序。日程安排很困难,尽管事实上大多数时候这对我们的人类大脑来说似乎是显而易见的。
也就是说,我见过实例化类和调用方法的解决方案,这些解决方案实际上是一次又一次等待时间的无限循环。这里的主要负担是作业的并行执行(线程处理等)以及错误处理(例如,其中一个类中的一个未处理的异常很可能会导致整个系统崩溃,这是调度库通常在高层处理的事情)。
如果资源是个问题,我建议使用可以水平扩展的调度程序(我不了解 Quartz,但如果我没记错的话,这可以通过 Hangfire 实现)。
您对 Quartz .NET 这样的系统“资源消耗”的担忧在很大程度上是不可避免的。这实际上取决于您正在寻找什么样的解决方案以及您拥有什么样的基础设施。
例如,如果您不希望使用持久存储解决方案来存储作业元数据(例如 SQL 数据库),您可以尝试使用内存选项来进行作业调度,例如 Hangfire 的内存数据库选项或 Coravel。然而,这样的解决方案有一些缺点,例如不适合分布式/集群友好。在某个时刻,您可能有如此多的作业并需要如此多的吞吐量,以至于超出了给定系统的内存限制。
此时,您要么需要扩展系统资源(添加内存等),要么转向持久存储选项。在这种情况下,您可以选择 Hangfire、Quartz .NET,并且 - 我也会将我的解决方案放在那里 - Didact,第一个 dotnet 作业编排器。
这些都是许多不同公司使用的优秀解决方案,当谈到您对资源消耗的担忧时,正确的答案通常是首先测量、观察,然后根据需要进行调整。您可能会惊讶地发现,如果配置正确,如今一个数据库和一台服务器可以处理多少负载。