多台机器的多线程

本文关键字:多线程 机器 | 更新日期: 2023-09-27 18:03:48

我已经研究了很多,但我还没有找到任何符合我需要的东西。我希望来自SO的人能对此提出一些见解。

我有一个应用程序,其中预期负载是每个客户数千个工作,我可以有100个客户。目前,它有50个客户,每个客户都有近1000个工作岗位。这些作业是时间敏感的(由客户安排),每个作业最多可以运行15分钟。

为了扩展和匹配调度,我计划在单个服务器上将其作为多线程运行。到目前为止一切顺利。但是企业希望通过添加更多的服务器来扩大规模(根据需要)。目前我的方法是,当它在数据库中准备就绪时,控制台应用程序拾取前500个线程,并使用任务并行库生成10个线程,直到它们完成。我不能把它扩展到另一台服务器上因为那台服务器可能会获取同样的记录。我不能更新正在处理的db记录上的状态,因为如果应用程序在一台服务器上崩溃,作业将处于limbo状态。

我可以做一个消息队列,让多台机器从中挑选。这样做的问题是队列必须是事务性的,以支持对任何崩溃的处理。MSMQ只支持MS DTC事务,因为它涉及数据库,我对DTC事务不太熟悉,特别是在多线程和多机器的情况下。过多的维护和设置以及可能未知的问题。

SQL service broker是一个好的方法吗?有人在生产环境中做过类似的事情吗?我还希望保持事务短(一个作业可以运行15到20分钟——主要是来自服务的流数据)。我执行事务的唯一原因是保持队列的消息完整性。我需要作业被重新挑选,如果它崩溃(重新出现在队列中)

有什么至理名言吗?

多台机器的多线程

为什么不让应用程序接收这些作业并将它们插入到包含作业队列的表中呢?然后,每个工作流程可以拾取一组作业并将状态设置为正在处理,然后完成该工作并将状态设置为已完成。其他信息,如处理每个作业的服务器名称、开始和结束时间戳也可以被记录下来。此外,您可以使用独立的工作进程,而不是使用多个线程,从而使您的编程更容易。

[编辑]SQL Server支持记录级锁定,也可以防止锁定升级。请参阅是否有可能在SQL Server中强制行级锁定?使用这种机制,您可以让您的工作进程对要处理的作业使用独占锁,直到它们完成或崩溃(从而释放锁)。