2

谁能告诉我是否可以将数据从 SqlServer 触发器直接推送到 ActiveMQ。

我已经浏览了 ActiveMQ 文档,但没有看到任何对它的引用。我们可以使用服务轮询数据库以获取插入,但触发器将是理想的解决方案。

4

2 回答 2

2

但触发器将是理想的解决方案

绝对不。这是一个坏主意的原因有很多,但我会给你主要的:

  • 增加了每个 DML 的延迟,因为您需要等待 RPC 调用完成。
  • 当 ActiveMQ 存在可用性问题时,随机和不稳定行为的操作失败(RPC 调用失败,DML 和原始应用程序事务随之而来)
  • 存在回滚时的正确性。仅此一项就是一个完整的表演停止者。如果运行触发器的应用事务回滚,无论出于何种原因,您都无法撤消 ActiveMQ 操作。

其中一些问题可以通过将应用事务与排队系统一起注册到分布式事务 (2PC) 中来解决,即 . 用于 ActiveMQ 的 XA。这解决了最后一个问题,但代价是增加了严重的延迟并将吞吐量降低了几个数量级。

提倡的解决方案是让触发器在一个用作队列的表中本地入队,并让外部应用程序从该表中出列并推送到 ActiveMQ。不要偷工减料并将您的应用程序状态用作“队列”(即轮询状态并标记为“已处理”),这就是 99% 的“数据库中的队列”尝试失败的原因。

当您将数据存储从队列存储中分离出来时,您仍然无法解决一些固有的问题(无法进行一致的备份/恢复,HA/DR 故障转移时的“脑裂”就像队列一样不遵循数据库故障转移等),但只有购买嵌入在数据库中的排队和消息传递,如Service Broker ,才能解决这些问题。

于 2012-12-11T12:52:53.083 回答
0

我会说可以在 Sql Server 中创建一个 UDF,该 UDF 在 .NET 中运行代码并创建一个 UDP/TCP 连接 ActiveMQ 服务器。

我已经通过这种方式通过 SqlServer 数据库进行了很多网络连接,在本地网络中创建了非阻塞连接。

于 2020-03-04T14:42:37.250 回答