【发布时间】:2019-11-29 20:01:13
【问题描述】:
我正在使用 spring-boot-starter-quartz 2.2.1.RELEASE 来安排 Quartz 作业。我已经在两个节点上部署了我的代码。 而quartz.properties 是这样的:
对于节点一:
org.quartz.scheduler.instanceName: machine1
org.quartz.scheduler.instanceId = AUTO
对于节点二:
org.quartz.scheduler.instanceName: machine2
org.quartz.scheduler.instanceId = AUTO
所以在这种情况下,每个节点可以单独运行相同的扫描作业。 现在在我的“qrtz_job_details”数据库中,我可以有两条工作记录,即scanJobbyMachine1和scanJobbyMachine2。
我还在 node1 上部署了一个前端 UI,它具有 RESTful API 来安排作业。我使用 nginx 将我的请求随机发送到我的一个节点。
如果我请求查询所有作业,该请求可能会发送到 node1,并且只会显示 node1 的作业。但我想同时显示 node1 和 node2 的作业。
如果我请求更新scanJobbyMachine1,它可能会被发送到node2。并且无法进行更新,因为node2只有instanceName为machine2的属性文件。
这是我的计划:
方案 A:使用集群模式。但是 Quartz 还不支持“Allow Job Excution to be pin to a cluster node”。所以在集群模式下,我的工作只会被一个节点执行。但我希望两个节点都做扫描工作。 here is the issue link in github
Plan B:使用非集群模式。然后我必须像这样在 Controller 中编写重复的 API:
localhost:8090/machine0/updateJob
localhost:8090/machine1/updateJob
并使用nginx设置当我请求/machine0/updateJob时,发送到10.110.200.60(machine1的ip),当我请求/machine1/updateJob时,发送到10.110.200.62(machine2的ip)
对于 queryAllJobs,我必须先使用我的后端向 10.110.200.60 和 10.110.200.62 发送请求,并在我的后端合并响应列表,然后在前端显示它。
C 计划:用两个属性文件编写另一个后端。只是为了安排作业而不执行这些作业(我不知道这是否可行)并将其部署在这两个节点上。
我真的不想像 Plan C 那样编写和部署另一个后端,也不想像 Plan B 那样编写重复的 API。 有什么好主意吗?
【问题讨论】: