需要:
- 从数据库中的作业队列执行作业的 Windows 服务
通缉:
- 此类应用程序的示例代码、指南或最佳实践
背景:
- 用户将单击一个 ashx 链接,该链接会将一行插入到数据库中。
- 我需要我的 Windows 服务定期轮询此表中的行,它应该为每一行执行一个工作单元。
重点:
- 这对我来说并不是全新的领域。
- 编辑:您可以假设我知道如何创建 Windows 服务和基本数据访问。
- 但我需要从头开始编写此服务。
- 我只是想提前知道我需要考虑什么。
- 编辑:我最担心的是失败的工作、工作竞争以及保持服务运行。
最佳答案
鉴于您正在处理数据库队列,由于数据库的事务性质,您已经为您完成了相当多的工作。典型的队列驱动应用程序有一个循环:
while(1) {
Start transction;
Dequeue item from queue;
process item;
save new state of item;
commit;
}
如果处理中途崩溃,事务将回滚并在下一次服务启动时处理该项目。
但是在数据库中编写队列实际上比您想象的很多要棘手。如果您部署一种天真的方法,您会发现您的入队和出队相互阻塞并且 ashx 页面变得无响应。接下来你会发现 dequeue 与 dequeue 是死锁的,你的循环不断地遇到错误 1205。我强烈建议你阅读这篇文章 Using Tables as Queues .
您的下一个挑战是让合并率“恰到好处”。过于激进,您的数据库将因池请求而变得炙手可热。太松了,你的队列会在高峰时间增长,而且会排得太慢。您应该考虑使用一种完全不同的方法:使用 SQL Server 内置 QUEUE
对象并依赖WAITFOR(RECEIVE)
的魔力语义。这允许完全无轮询的自加载调整服务行为。实际上,还有更多:您不需要服务来开始。参见 Asynchronous Procedures Execution有关我在说什么的解释:以完全可靠的方式从 Web 服务调用在 SQL Server 中异步启动处理。最后,如果逻辑必须在 C# 进程中,那么您可以利用 External Activator ,它允许处理托管在独立进程中,而不是 T-SQL 过程。
关于c# - 需要 : A Windows Service That Executes Jobs from a Job Queue in a DB; Wanted: Example Code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3266420/