我们有一个需要的应用程序
每晚重新处理大量数据,以及
按需重新处理大量数据.
在这两种情况下,大约10,000个石英作业产生然后运行.在每晚的情况下,我们有一个石英cron
作业产生10,000个作业,每个作业分别处理数据.
我们遇到的问题是我们运行了大约30个线程,因此石英工作自然会失败,并且在处理完所有事情之前继续熄火.处理最多可能需要6个小时.这10,000个作业中的每一个都属于可以并行处理且完全独立的特定域对象.10,000个工作中的每一个都可以花费不同的时间(从半秒到一分钟).
我的问题是:
有一个更好的方法吗?
如果没有,我们安排/设置石英作业的最佳方式是什么,以便花费最少的时间来捶打和处理失火?
关于或架构的说明:我们正在运行两个集群,每个集群有三个节点.quartz的版本有点旧(2.0.1),并且在quartz.properties文件中启用了聚类.
在这两种情况下,大约有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();