【问题标题】:Can a SqlServer trigger push to ActiveMQSqlServer 触发器可以推送到 ActiveMQ
【发布时间】:2012-11-29 00:03:43
【问题描述】:

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

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

【问题讨论】:

    标签: sql-server activemq


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-07
        • 2020-06-22
        • 2021-03-28
        • 1970-01-01
        • 1970-01-01
        • 2012-04-14
        • 1970-01-01
        • 2012-12-18
        相关资源
        最近更新 更多