Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Spring引导-将计划作业作为单独的进程运行_Mongodb_Spring Boot_Spring Scheduled - Fatal编程技术网

Mongodb Spring引导-将计划作业作为单独的进程运行

Mongodb Spring引导-将计划作业作为单独的进程运行,mongodb,spring-boot,spring-scheduled,Mongodb,Spring Boot,Spring Scheduled,我有一个SpringBoot应用程序,它也很少有计划的作业。我看不到任何与实现有关的功能问题。其中一个作业几乎每秒运行一次,以进行实时更新。还有其他工作 我怀疑存在性能问题,尤其是当长时间运行的API击中控制器时 // Heavy Job @Scheduled(fixedRate = 10000) public void processAlerts(){ } @Scheduled(fixedDelayString = "${process.events.interval}") public

我有一个SpringBoot应用程序,它也很少有计划的作业。我看不到任何与实现有关的功能问题。其中一个作业几乎每秒运行一次,以进行实时更新。还有其他工作

我怀疑存在性能问题,尤其是当长时间运行的API击中控制器时

// Heavy Job
@Scheduled(fixedRate = 10000)
public void processAlerts(){
}


@Scheduled(fixedDelayString = "${process.events.interval}")
public void triggerTaskReadiness() throws IOException {
    log.info("Trigger event processing job");
}
// Heavy Job to process data from different tables.
@Scheduled(fixedDelayString = "${app.status.interval}")
public void triggerUpdateAppHealth() throws IOException {
    log.info("Trigger application health");
}

是否可以将作业作为单独的流程。在繁重的工作中使用spring boot应用程序的最佳实践是什么。

我认为,这个问题太笼统了。这完全取决于您的资源和工作的具体用途

SpringBoot提供了一种通用的调度机制,但没有对作业的性质做出任何假设

总而言之,当您运行一个繁重的作业时,CPU、网络、I/O和任何消耗的资源(同样,取决于作业的实际代码)都是真实的

如果您在外部运行它,基本上另一个进程将消耗相同的资源,假设它在同一台服务器上运行

从spring boot的角度来看,我可以说:

  • 这看起来像是处理数据库的工作。在这种情况下,Spring boot支持与数据源、连接池、事务管理、更高级的API(如JPA)甚至Spring数据的集成,您还可以插入JOOQ等框架。总之,它使数据库的实际工作更加容易
  • 您已经在问号中说明了Mongodb,spring在spring数据中也集成了Mongodb

    底线如果你是在一个外部流程中运行工作,你就有点自力更生了(这并不意味着它不能完成,这只是意味着你失去了spring袖子上所有的好东西)

  • AppHealth-spring boot已经提供了一个具有db health端点的执行器功能,它还提供了一种方法来创建自己的端点,以检查任何具体资源的运行状况(您可以在代码中实现它,这样您就可以随意检查)。确保使用正确的工具完成正确的工作

  • 关于控制器API。如果您使用传统的SpringMVC运行,tomcat有一个线程池来为API服务,因此从线程管理的角度来看,job的线程不会与controller的线程竞争,但是它们可能共享相同的db连接,因此可能成为瓶颈

  • 关于
    @Scheduled
    的实施。默认情况下,将有一个线程为所有
    @计划的
    作业提供服务,这可能是不够的

  • 您可以通过创建自己的
    taskScheduler
    来更改此行为:

    @Bean(destroyMethod = "shutdown")
    public Executor taskScheduler() {
        return Executors.newScheduledThreadPool(10); // allocate 10 threads to run @Scheduled jobs
    }
    
    你可能对阅读感兴趣

  • Spring
    @Scheduled
    始终在一个Spring管理的应用程序上下文的“边界”内工作。因此,如果您决定扩展实例,那么每个实例都将运行“计划”代码并执行繁重的作业。 使用Quartz是可能的,spring可以将它配置为集群模式,您可以将它配置为每次选择一个节点并执行作业,但由于您计划每秒钟运行一次,我怀疑Quartz是否足够好

  • 一个普遍的观察结果是:像你说的那样做一系列“繁重”的工作与“每一秒都跑”听起来不太好。这听起来不太合理,因为繁重的工作往往持续超过1秒,所以这样做最终会占用所有资源,你将无法运行更多的工作


  • 你好@马克,非常感谢你的详细电子邮件。对我还在为工作频率和要求争论不休。我将使用更多线程池计数和检查来实现任务调度器。每一条评论都对我们的实施非常有用。