8

当触发器执行时,我需要向外部 URL 发布(HTTP 方法)一些信息我知道使用触发器时有很多安全和性能影响,所以我担心这里不是进行这种处理的地方。但无论如何,我发布这个是为了获得一些关于如何解决问题的反馈或想法。一些考虑:

  • 触发器中触发的事务可以是异步的。
  • 该过程必须照顾授权
  • 最终 URL 是 Internet 上的 php 脚本。

真正触发此执行的应该是向表中插入或更新一条记录,因此我必须使用此触发器,因为我无法触及(第三方)应用程序。

附带说明一下,Service Broker是否值得考虑?欢迎任何想法。

4

1 回答 1

10

你是对的,这不是你想在触发器中做的事情。在你的应用程序中你最不想做的就是在每个更新/插入/删除中引入 HTTP 请求的延迟,即使一切正常,这也会非常明显。但是当事情运行不好时,它会运行得很糟糕:当 HTTP 资源出现可用性问题时,添加的耦合会导致您的应用程序失败,更糟糕的是与回滚相关的正确性问题(您执行触发器的事务可能会回滚,但HTTP 调用已经完成)。

这就是为什么引入一个将触发器与 HTTP 调用分离的层至关重要的原因,这是通过队列完成的。表是用作队列,还是 Service Broker 队列,甚至是 MSMQ 队列,都由您来决定。最简单的解决方案是将表用作队列

  • 触发器将要进行的 HTTP 调用的请求排入队列(插入)
  • 在运行触发器的事务提交后,该请求可用于出列
  • 监控(轮询)队列的外部应用程序获取请求并发出 HTTP 调用

Service Broker 相对于自定义表作为队列的优势在于内部激活,这将允许您的 HTTP 处理代码在队列中有要处理的项目时按需运行,而不是轮询。但是从引擎内部通过 SQLCLR 进行 HTTP 调用是非常不明智的。外部进程对于访问 HTTP 之类的东西要好得多,因此不需要增加 Service Broker 的复杂性。

于 2012-10-16T08:34:51.320 回答