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;
            }
            );
        }
    }

私が探していて理解できないのは、i30 以下に設定するとすべて問題ないということです。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ディレクティブのみに関連する問題です。

dbms には Oracle 10g を、クライアントには Oracle 11g を使用しています。

エンドポイントがトランザクション対応でない場合、問題はないので、問題は TransactionScope のみに関係しているようです。

どんな助けでも大歓迎です、ありがとう

4

1 に答える 1

0

私はどう考えてもオラクルの専門家ではありません。初心者の資格すら無いかも知れません。

ただし、パブリッシュ間でサブスクリプションが変更された場合に備えて、NServiceBus はパブリッシュごとにサブスクリプション ストレージをクエリすることを知っています。

Oracle クライアントには、分散トランザクションに参加できるクエリの数に何らかの制限がある可能性はありますか? おそらく、N+1 型のパフォーマンスの問題を防ぐ方法として?

とはいえ、同じ種類のイベントを 30 件以上公開するのは非常に奇妙に思えます。あなたのビジネスユースケースは何ですか?イベントは通常、取り返しのつかないことが起こったことを通知するものです。なぜ 30 のことが起こったのでしょうか。

ビジネス ケースがしっかりしている場合は、パブリッシュごとにデータベースのクエリに戻らないように、制限付きのキャッシュ (5 秒でも) を使用する独自のサブスクリプション ストレージ エンジンを実装することをお勧めします。

于 2012-11-16T17:50:33.073 に答える