5

ユーザーが「バッチのような」アクションを実行する状況を処理するために、Webアプリケーション用にNServiceBusを実行しています。1000エンティティに影響を与えるコマンドを起動するように。

それはうまく機能しますが、中程度の負荷の間にいくつかのデッドロックが発生します。これは問題ではありません。メッセージを再試行してください。:)

この問題は、次のメッセージが到着して接続を開こうとしたときに発生します。その場合、接続は「破損」します。

次のエラーが発生します:System.Data.SqlClient.SqlException(0x80131904):有効なトランザクション記述子が付属している必要があるため、新しいリクエストの開始は許可されていません

私はウェブを検索しました、そして私たちの問題は報告されたNH「バグ」であると思います:

回避策は、接続プールを無効にすることです。しかし、パフォーマンスが低下するので、私はそれが好きではありません。

NServiceBus 2.6、NHibernate3.3を実行しています。

誰かがこれを経験したことがありますか?NServiceBusのアップグレードは役に立ちますか?

4

2 に答える 2

1

過去にこれを見たことがあります。設計が保証する場合は、トランザクションを 2 つに分割してみてください。メッセージ トランザクションをデータベース操作までフローする場合、障害はカスケード効果を持ち、影響を与えます (理想的にはそうすべきです)。 't) 後続のメッセージも同様です。

于 2013-03-19T00:49:16.140 に答える
0

コマンド内の 1000 個のエンティティを更新する代わりに、イベントを発行してコマンドが完了したことを伝え、このイベントに対して複数のサブスクライバーが作用して効果エンティティを更新することができます。1000 個のエンティティを更新するコマンドは、いくつかの小さなコマンドに分割する必要があるように思えます。サガを見て、長期にわたるビジネス プロセスを処理する方法を確認してください。たとえば、プロセスが開始された、ステップ 1 が完了した、ステップ 2 が完了した、プロセスが完了したなどのようなものがあるかもしれません。

于 2013-03-21T09:00:33.043 に答える