如何优雅地处理成千上万的石英失火?

 大可 发布于 2023-02-07 19:38

我们有一个需要的应用程序

    每晚重新处理大量数据,以及

    按需重新处理大量数据.

在这两种情况下,大约10,000个石英作业产生然后运行.在每晚的情况下,我们有一个石英cron作业产生10,000个作业,每个作业分别处理数据.

我们遇到的问题是我们运行了大约30个线程,因此石英工作自然会失败,并且在处理完所有事情之前继续熄火.处理最多可能需要6个小时.这10,000个作业中的每一个都属于可以并行处理且完全独立的特定域对象.10,000个工作中的每一个都可以花费不同的时间(从半秒到一分钟).

我的问题是:

    有一个更好的方法吗?

    如果没有,我们安排/设置石英作业的最佳方式是什么,以便花费最少的时间来捶打和处理失火?

关于或架构的说明:我们正在运行两个集群,每个集群有三个节点.quartz的版本有点旧(2.0.1),并且在quartz.properties文件中启用了聚类.

1 个回答
  • 在这两种情况下,大约有10,000个石英作业产生

    无需产生新的石英作业.Quartz是一个调度程序 - 而不是任务管理器.

    在夜间重新处理中 - 您只需要一个石英cron作业来调用一些负责管理和运行10,000个任务的服务.在"按需"场景中,石英根本不应该参与其中.只需直接调用该服务即可.

    该服务如何管理10,000个任务?

    通常,只有一个JVM可用时,您只需使用一些JVM ExecutorService.在这里,由于手指下有6个节点,因此您可以轻松使用Hazelcast.Hazelcast是一个java库,使您可以集群节点,相互有效地共享资源.Hazelcast有一个简单的解决方案来分发你的ExecutorService,这就是所谓的分布式执行器服务.这是因为创建Hazelcast容易ExecutorService和所有成员提交任务.以下是调用单个成员的文档中的示例:

    Callable<String> task = new Echo(input); // Echo is just some Callable
    HazelcastInstance hz = Hazelcast.newHazelcastInstance();
    IExecutorService executorService = hz.getExecutorService("default");
    Future<String> future = executorService.submitToMember(task, member);
    String echoResult = future.get();
    

    2023-02-07 19:40 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有