你是对的,这不是你想在触发器中做的事情。在你的应用程序中你最不想做的就是在每个更新/插入/删除中引入 HTTP 请求的延迟,即使一切正常,这也会非常明显。但是当事情运行不好时,它会运行得很糟糕:当 HTTP 资源出现可用性问题时,添加的耦合会导致您的应用程序失败,更糟糕的是与回滚相关的正确性问题(您执行触发器的事务可能会回滚,但HTTP 调用已经完成)。
这就是为什么引入一个将触发器与 HTTP 调用分离的层至关重要的原因,这是通过队列完成的。表是用作队列,还是 Service Broker 队列,甚至是 MSMQ 队列,都由您来决定。最简单的解决方案是将表用作队列:
- 触发器将要进行的 HTTP 调用的请求排入队列(插入)
- 在运行触发器的事务提交后,该请求可用于出列
- 监控(轮询)队列的外部应用程序获取请求并发出 HTTP 调用
Service Broker 相对于自定义表作为队列的优势在于内部激活,这将允许您的 HTTP 处理代码在队列中有要处理的项目时按需运行,而不是轮询。但是从引擎内部通过 SQLCLR 进行 HTTP 调用是非常不明智的。外部进程对于访问 HTTP 之类的东西要好得多,因此不需要增加 Service Broker 的复杂性。