我有一个任务,在这个任务中我可以控制数据库,但不能控制在SQL Server 2008 R2数据库上执行CRUD操作的应用程序。
理想情况下,我想在对数据表进行插入操作后不久调用(POST)一个web API(请注意,我不必等待API响应)。
实现这个目标的想法
-
在数据表上创建一个SQL Server触发器(CLR启用,但它是SQL Server 2008R2,所以它使用。net 2.0)。
我可能需要创建一个存储过程来调用web API (POST)(它应该是即发即忘,因为我不需要等待API响应)作为触发器的一部分。
-
服务代理和依赖注入警报——比;这工作得很好,但我担心并发性。
-
传统轮询
你能推荐其他的方法吗?(请将利弊作为解决方案的一部分)
触发器的问题在于它们在触发它们的语句的上下文中执行,因此触发器的延迟将减慢/阻塞实际应用程序。因此,您应该永远不要在触发器中执行冗长的处理或调用外部服务。
我的方法是:
-
有一个非常精简的触发器,只使
INSERT
进入一个单独的表(一个"命令"表或任何你可能称之为它)。该表应包含通知 所需的所有相关信息。 有一个单独的,预定的进程-要么是一个预定的SQL Server作业,要么是服务器上的外部应用程序-定期轮询表-每分钟,每15分钟-无论你需要什么-如果在"命令"表中有一个新的条目,它做它需要做的事情并发送通知或调用外部WebAPI服务等
使用这种方法,您的系统仍然可以尽可能地响应(不受"卡住"触发器的延迟),并且它使您能够灵活地根据需要频繁地调度"通知发送者"应用程序或SQL作业。