1

我为不同子系统之间的集成架构建模。来自子系统的所有通知都使用原语发送到订阅的子系统Publish。这些通知在方法for内循环发送Handler,所以它们都在同一个TransactionScope. 我做了一个简单的例子来解释这一点:客户端向服务器发送一条消息,该服务器使用原语发送可变数量的消息Publish。这是服务器处理程序:

public void Handle(MyMessage message)
    {

        for (int i = 0; i < message.numberOfNotifications; i++)
        {
            Bus.Publish<NotificationMessage>(m =>
            {
                m.myPersonalCount= i;
            }
            );
        }
    }

我正在寻找但我无法弄清楚的是,当我设置i为 30 或更少时,一切正常。从 31 或更多我收到此错误消息:

could not execute query
[ SELECT this_.SubscriberEndpoint as y0_ FROM "Subscription" this_ WHERE this_.MessageType in (?) ]

并查看我得到的内部异常Unable to enlist in a distributed transaction

我使用原语尝试了相同的操作,Send但一切都是(尝试使用 10k 条消息),所以这是一个仅与Publish指令相关的问题。

我将 Oracle 10g 用于 dbms,将 Oracle 11g 用于客户端。

如果端点不是事务性的,我没有任何问题,所以问题似乎只与 TransactionScope 有关。

任何帮助表示赞赏,谢谢

4

1 回答 1

0

无论如何,我都不是 Oracle 专家。我可能连新手的资格都达不到。

但是,我知道 NServiceBus 会为每个发布查询订阅存储,以防发布之间的订阅发生更改。

Oracle 客户端是否可能对可以在分布式事务中登记的查询数量有某种限制?也许是为了防止 N+1 类型的性能问题?

也就是说,您想要发布 30 多个相同类型的事件似乎很奇怪。我想知道您的业务用例是什么。事件通常应该宣布发生了不可撤销的事情。为什么会发生30件事?

如果业务案例是可靠的,那么实现自己的订阅存储引擎可能是个好主意,该引擎使用一些有限的缓存(甚至 5 秒),这样您就不会在每次发布时都返回查询数据库。

于 2012-11-16T17:50:33.073 回答