在我们的组织中,我们有一个 SQL Server 2005 数据库和相当数量的数据库客户端:网站(php、zope、asp.net)、富客户端(legacy fox pro)。现在我们需要将核心数据库中的某些事件传递给其他系统(MongoDb、LDAP 等)。消息传递范式似乎非常有能力解决这类问题。所以我们决定使用 RabbitMQ 代理作为中间件。
最初从数据库消费事件的问题似乎只有两种可能的解决方案:
- 轮询数据库以获取传出消息并将它们传递给消息代理。
- 在某些表上使用触发器将消息传递到同一台机器上的代理。
由于涉及定期执行 sql 时出现的延迟问题,我不喜欢第一个想法。
但是基于事件的触发方法有一个问题,目前我似乎无法解决。考虑这种情况:
- 将一行插入到表中。
- 触发器触发并发送消息(使用 C# 编写的 CLR 存储过程)
除非写数据的事务被回滚,否则一切正常。在这种情况下,数据将是一致的,但消息已经发送并且无法回滚,因为触发器在写入数据库日志时触发,而不是在事务提交时触发(这是 RDBMS 的正确行为) .
我现在意识到我对触发器的要求太多了,它们不适合处理数据以外的任务。
所以我的问题是:
- 有没有人设法使用触发器提取数据事件?
- 您还能建议哪些其他使用数据事件的方法?
- 查询通知(建立在 Service Broker 之上)是否适合我的情况?
提前致谢!