我有一个用户界面,可以将完全不同类型的作业排队。目前,它通过将作业存储在数据库中的相应表中来实现这一点(Table-per-JobType)
然后我的后端进程出现,拿起工作,并假设有一个可用的工作人员(线程),使用它来执行工作的适当方法。
在伪代码中:
While(Runnning) {
While(Queue1.HasJobs && Workers.IdleCount > 0) {
FirstIdleWorker.Execute(Queue1Method(Type1Job));
}
...
While(QueueN.HasJobs && Workers.IdleCount > 0) {
FirstIdleWorker.Execute(QueueNMethod(TypeNJob));
}
//Wait for a job to complete or a polling timeout if queues are empty
}
(实际上并没有那么幼稚,但它说明了处理工作的顺序)
如您所见,这可行,但没有考虑添加了哪些订单作业。这不是交易破坏者,因为作业是原子的,但从 UI 角度来看很烦人 - 例如,用户 1 排队 20 个作业类型 2,然后是用户 2 将类型 1 的 1,000 个作业排队。用户 1 现在必须等待用户 2 的所有作业完成,然后才能处理其(相对)快速作业。
作业确实有一个CreatedOn
属性,因此确定顺序并不困难,但是如何最好地以不是意大利面条代码的强类型方式实现组合队列?
我试图避免带有.CreatedOn
, .Queue1Id
,的“GenericJob”对象.Queue2Id
,.Queue3Id
因为这感觉很草率。
虽然 FIFO 基本上是我所追求的,但这并不是一个严格的要求——我只是不希望物品永远被撞到。
这种事情有模式吗?如果没有,有人可以指点我一个好的教程吗?
(顺便说一句,这些可能是长期运行的作业。一旦从队列中取出作业,我实际上是在幕后使用 TPL 来管理工作人员,但我仍然需要自己管理队列,因为作业比我多得多可以一次性加载到内存中)