2014-10-02 65 views
0

我正在设计一个应用程序,需要处理一个作业队列,可以由任何工作服务器处理。作业存储在数据库中,并且类型不同。我对下面列出的设计有个想法:队列,作业和调度程序 - 现有模式或库?

每项工作都实现了IJob,并且子类型包含运行作业所需的所有属性。工作人员将从数据库中提取列表中的下一个作业,并开始处理它,并定期将进度记录回数据库。

工作需要添加到这个队列的周期性基本上,这可能是每5秒,10秒,30秒,1分钟,5分钟,10分钟,1小时...... 1年,2年(你得到的图片) 。所以我需要某种形式的Cron工作来触发这些事件。例如,可以每小时下载一个作业并从某个邮箱处理电子邮件附件。

我的理想解决方案是允许员工在没有冲突的情况下复制和工作的模式,同时也不用担心填充这些工作的“主工”。

我目前的设计涉及到一个单独的数据库表来跟踪哪些“定期”作业已经完成,并且每个工作人员每秒都在该表上执行原子更新。如果定期工作需要创建并且尚未完成,则工作人员将创建它。每个工作程序将由一个Windows任务触发,每秒设置为运行一次。

我相信这应该都可以,但是我认为这是一个很普遍的要求,必须有已知的图案或工具,我不想重新发明轮子。

所以问题:

  • 我是不是重新发明轮子?
  • 我使用的模式是否合理,还是可以改进?
  • 是否有任何第三方库为.NET做到这一点?

当前堆栈是在具有MongoDB后端的Windows服务器(AWS EC2)上运行的.NET/C#。

回答

1

Quartz.NET似乎符合您的大部分标准为'T'。包括所谓的东西,从字面上看,IJob;)。

结合使用模拟队列的RabbitMQ或自定义数据库表,您现在可以定期处理排队的输入作业。这就是说,如果你希望这是分布式(即有多个服务器运行这些工作),你需要在Quartus.NET发行版中有一个SQL数据库。似乎有MongoDB适配器可用,但我从来没有使用过。

+0

石英是完美的。非常快速和易于使用,它使用MongoDb JobStore运行没有问题。为我节省了无数个小时!谢谢 – 2014-10-02 23:38:39

+0

你非常欢迎。 – 2014-10-06 15:51:30