我正在设计一个需要处理作业队列的应用程序,可以由任何工作服务器处理。作业存储在数据库中,类型不同。我对下面概述的设计有一个想法:
每个作业都实现IJob
,子类型包含运行作业所需的所有属性。工作人员将从数据库中提取列表中的下一个作业,并开始处理它,定期将进度记录回数据库。
作业需要在周期性基础上添加到此队列,可以是每5秒,10秒,30秒,1分钟,5分钟,10分钟,1小时...... 1年,2年(你得到图片)。所以我需要某种形式的Cron作业来触发这些事件。例如,每小时可以下载一个作业并处理来自某个邮箱的电子邮件附件。
我理想的解决方案是一种模式,允许工人在没有冲突的情况下被复制和工作,同时也不用担心填补这些工作的1名“主工人”。
我目前的设计涉及一个单独的数据库表来跟踪哪些“定期”作业已经完成,每个工作人员每秒对该表执行原子更新。如果定期作业需要创建并且尚未完成,则工作人员将创建它。每个工作程序将由一个Windows任务触发,设置为每秒运行一次。
我相信这一切都可以正常工作,不过我认为这是一个很常见的要求,必须有已知的模式或工具,我不想重新发明轮子。
所以问题:
当前堆栈是在Windows服务器(AWS EC2)上运行的.NET / C#,带有MongoDB后端。
答案 0 :(得分:1)
Quartz.NET似乎符合您的大部分标准。'。包括名字,字面意思,IJob
;)。
结合使用RabbitMQ或模拟队列的自定义数据库表,您现在可以定期处理排队输入的作业。
话虽这么说,如果你想要分发它(即有多个服务器运行这些作业),你需要在vanilla Quartz.NET发行版中使用SQL数据库。似乎有MongoDB适配器可用,但我从未使用过。