我在不同子系统之间建模了一个集成架构。来自子系统的所有通知都使用原语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有关。
感谢任何帮助,谢谢
答案 0 :(得分:0)
在任何想象中,我都不是Oracle专家。我甚至可能不会成为新手。
但是,我知道NServiceBus会查询每个发布的订阅存储,以防发布之间的订阅发生更改。
Oracle客户端是否可能对分布式事务中可以登记的查询数量有某种限制?也许作为一种预防N + 1类型性能问题的方法?
那就是说,你想发布30多个相同类型的事件似乎很奇怪。我想知道你的商业用例是什么。事件通常被认为是宣布发生了不可撤销的事情。为什么会发生30件事?
如果业务案例是可靠的,那么实现您自己的订阅存储引擎可能是一个好主意,该引擎使用一些有限的缓存(甚至5秒),这样您就不会在每次发布时都返回查询数据库。 / p>