Ktor-Kotlin 中的 Quartz 调度器运行在 Kubernetes 集群的所有 Pod 上
Posted
技术标签:
【中文标题】Ktor-Kotlin 中的 Quartz 调度器运行在 Kubernetes 集群的所有 Pod 上【英文标题】:Quartz Scheduler in Ktor-Kotlin runs on all the pods of Kubernetes cluster 【发布时间】:2021-12-25 23:40:57 【问题描述】:我是 Quartz 的新手,我在 KTOR 应用程序中使用 Quartz 2.3.2。 此应用程序将使用 Kubernetes 部署在集群中运行。
我的要求是只在这个 kubernetes 框架的一个实例/pod 中运行调度程序
我使用下面的代码在 kubernetes 集群中运行quartz
但下面的代码运行在 Kubernetes 集群的所有 Pod 上。如何只在一个实例上运行?
object SchedulerMain
fun schedulerTest(config: DBConfig)
DBConnectionManager.getInstance().addConnectionProvider(
"myDs",
HikariCpPoolingConnectionProvider(
"org.postgresql.Driver",
config.readerUrl.toString(),
config.username,
config.password,
10,
"SELECT * FROM table;"
)
)
val schedFact: DirectSchedulerFactory = DirectSchedulerFactory.getInstance()
try
val jobStore = JobStoreTX()
jobStore.setIsClustered(true)
jobStore.clusterCheckinInterval = 20000
jobStore.tablePrefix = "schema.qrtz_"
jobStore.misfireThreshold = 60000
jobStore.driverDelegateClass = "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate"
jobStore.dataSource = "myDs"
val simpleThreadPool = SimpleThreadPool()
simpleThreadPool.threadCount = 5
schedFact.createScheduler(
"TestScheduler", "AUTO", simpleThreadPool, jobStore
)
val sched: Scheduler = schedFact.getScheduler("TestScheduler");
val jobA: JobDetail =
JobBuilder.newJob(JobA::class.java).withIdentity("jobA", "group2").storeDurably()
.build()
val triggerA: Trigger =
TriggerBuilder.newTrigger().withIdentity("triggerA", "group2").startNow()
.withPriority(15).withSchedule(
SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(40)
.repeatForever()
).build()
if (!sched.checkExists(jobA.key))
sched.scheduleJob(jobA, triggerA);
sched.start()
catch (e: SchedulerException)
e.printStackTrace()
AUTO 是字符串吗? 吊舱 1
Pod 1 和 2 都有相同的日志
更新: 我截断了所有石英表并启动了 kubernetes 集群,然后它按预期在单个实例上运行。 然后我停止了 Kubernnetes 集群并重新启动而不截断表,调度程序在所有 pod 上启动
【问题讨论】:
【参考方案1】:Quartz
在集群模式下以某种方式运行,即所有工作在节点之间平衡以分配负载。
为什么您希望调度程序只在集群的一个节点上工作?
如果您希望您的作业非并发执行,请在您的作业类上使用@DisallowConcurrentExecution
。
【讨论】:
以上是关于Ktor-Kotlin 中的 Quartz 调度器运行在 Kubernetes 集群的所有 Pod 上的主要内容,如果未能解决你的问题,请参考以下文章