我已经研究了很多,但我找不到满足我需求的东西。我希望SO的某个人可以对此有所了解。
我有一个应用程序,其中预期的负载是每个客户数千个工作,我可以有100个客户。目前,它有50个客户,每个接近1000个工作岗位。这些工作对时间敏感(由客户安排),最长可运行15分钟(每项工作)。
为了扩展和匹配计划,我打算在单个服务器上以多线程运行它。到现在为止还挺好。但是企业希望通过在混合中添加更多服务器来扩展(根据需要)。目前我的方式是它在数据库中准备就绪时,控制台应用程序首先获取500并使用任务并行库生成10个线程并等待它们完成。我无法将其扩展到另一台服务器,因为那可以获取相同的记录。我无法将db记录上的状态更新为正在处理,因为如果应用程序在一台服务器上崩溃,则作业将处于不稳定状态。
我可以做一个消息队列,并从中挑选多台机器。这个问题是队列必须是事务性的,以支持处理任何崩溃。 MSMQ
仅支持MS DTC
事务,因为它涉及数据库,我对DTC事务并不熟悉,特别是对于多线程和多台机器。太多的维护和设置以及可能未知的问题。
SQL service broker
是一个好方法吗?有没有人在生产环境中做过这样的事情?我还希望保持交易简短(一项工作可以运行15,20分钟 - 主要是来自服务的流数据)。我正在进行事务的唯一原因是保持队列的消息完整性。如果崩溃(重新出现在队列中)
任何智慧的话语?
答案 0 :(得分:0)
为什么不让应用程序接收作业并将它们插入到包含作业队列的表中。然后,每个工作流程都可以获取一组作业并将状态设置为处理,然后完成工作并将状态设置为已完成。还可以记录其他信息,例如处理每个作业的服务器名称,开始和结束时间戳。此外,您可以使用独立的工作流程,而不是使用多个线程,从而使您的编程更容易。
[编辑] SQL Server支持记录级别锁定,也可以防止锁定升级。见Is it possible to force row level locking in SQL Server?。使用这种机制,您可以让您的工作进程对要处理的作业进行独占锁定,直到它们完成或崩溃(从而释放锁定)。