是否有扫描执行某些操作的作业表的标准模式?

How*_*amp 5 c# database sql-server algorithm

(我意识到我的头衔很差.如果在阅读完问题之后你会有所改进,请编辑或告诉我,我会改变它.)

我有一个相对常见的工作表场景,其中有一行需要完成.例如,它可以是要发送的电子邮件列表.该表看起来像这样:

ID    Completed    TimeCompleted   anything else...
----  ---------    -------------   ----------------
1     No                           blabla
2     No                           blabla
3     Yes          01:04:22
...
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个标准的练习/模式(或代码 - C#/ SQL Server首选)定期"扫描"(我非常松散地使用术语"扫描")这个表,找到未完成的项目,执行操作一旦成功完成标记就完成了.

除了完成上述步骤的基本过程外,我还在考虑以下要求:

  • 我想要一些"线性扩展"的方法,例如同时运行多个"工作进程"或线程或其他任何方式.(只是一个特定的技术思想 - 我假设由于这个要求,我需要一些方法将项目标记为"正在进行中"以避免多次尝试该操作.)
  • 表中的每个项目只能执行一次.

其他一些想法:

  • 我并不特别关心数据库中的实现(例如,在T-SQL或PL/SQL代码中)与一些外部程序代码(例如,独立的可执行文件或由网页触发的某些操作)相关的执行数据库
  • "做行动"部分是同步还是异步完成并不是我正在考虑作为这个问题的一部分.

Jef*_*nal 1

如果您愿意考虑非数据库技术,最好的(尽管不是唯一的)解决方案是消息队列(通常与包含每个作业详细信息的数据库结合使用)。消息队列提供了很多功能,但基本工作流程很简单:

1) 一个进程将一条“作业消息”(可能只是一个 ID)放入队列中。

2) 另一个进程监视队列。它会轮询队列中的工作,并按照收到的顺序从队列中取出找到的作业,一次一个。您从队列中取出的项目实际上被标记为“正在进行中” - 它们不再可供其他进程使用。

3) 对于关键工作流程,您可以执行事务读取——如果系统出现故障,事务将回滚并且消息仍在队列中。如果存在其他类型的异常(例如数据库读取期间超时),您可能会将消息转发到特殊的错误队列。

扩展此范围的最简单方法是让读取器进程分派多个线程来处理它从队列中拉出的作业。或者,您可以使用多个读取器进程进行扩展,这些进程可能位于不同的服务器上。

.NET 支持包括Microsoft Message Queue以及 Windows Communication Foundation 或 System.Messaging 命名空间中的类。它需要一些设置和配置(您必须创建队列并配置权限),但这是值得的。