【发布时间】:2014-12-24 08:02:35
【问题描述】:
问题
我有一个消息记录的 SQL 表,tbl_message_queue,每个都有一个发布时间戳字段(现在或将来)。新记录不断被插入。
当发布时间戳到期时,符合条件的记录需要由控制台应用程序 .exe 处理。处理完成后,将从tbl_message_queue 中删除相应的记录。
应该减少/消除发布时间戳和执行之间的延迟时间。
选项 #1:频繁轮询
我可以通过Windows Task Scheduler 将我的 .exe 设置为每 10-15 秒运行一次。其中将包括如下 SQL 语句:
SELECT *
FROM tbl_message_queue
WHERE qmsg_ts_release <= GETDATE()
这感觉像是一种低效、蛮力、滞后友好的解决方案。但这是我最熟悉的结构。
选项 #2:重新安排 SQL 代理作业
我从未尝试过这个,但似乎它可以工作。这听起来很老套,所以如果这是一个非常糟糕的主意,请原谅我。
我可以创建一个具有CmdExec Job Step 的 SQL 代理作业,并不断重新安排该作业:
UPDATE qmsg_ts_releaseINSERT tbl_message_queue- .exe 完成
在MIN(qmsg_ts_release) 运行下一个。
呼...我知道这听起来真的很难看,但它并没有积极的轮询,并且可能会消除任何延迟。
其他选项
对于此类问题,还有其他选择或更好的解决方案吗?我不熟悉消息队列架构中的最佳实践。
像MSMQ 或SQL Server Service Broker 这样的东西会更好地解决这类问题吗?我对其他选项知之甚少,不知道从哪里开始。
【问题讨论】:
-
为什么不做一个 REST 服务并在插入新记录时调用它。
-
@Steve 听起来像是 OP 的问题是记录插入了未来的日期时间以进行处理,例如它不是在插入时立即执行,而是在日期时间被点击时立即执行
-
类似于选项 1,但可以根据您的未来计划进行扩展的解决方案。我已经为一个类似的项目实现了 Quartz.Net 来安排和邮件通知。可能它将是一个独立的应用程序,因此您可以在将来实现其他目的。 quartz-scheduler.net
-
如果是这种情况,那么制作一个 REST api,它将在给定时间运行的 windows 调度程序中添加一个新条目
标签: .net sql-server windows message-queue