2012-03-18 7 views
3

JOliver EventStore 3.0を使用し、簡単なサンプルを使い始めるだけです。EventStoreがConcurrencyExceptionを簡単にスローする原因は何ですか?

私はNServiceBusを使用して単純なpub/sub CQRSを実装しています。クライアントはバス上でコマンドを送信し、ドメインサーバはコマンドを受信して​​処理し、イベントストアにイベントを格納し、イベントストアのディスパッチャによってバスに発行されます。読取りモデル・サーバーは、それらのイベントにサブスクライブして読取りモデルを更新します。ファンシーで、ほんのちょっとした本です。

これは動作していますが、単純なテストでは、イベントがEventStoreに格納されているときに、ドメインサーバで(並行して)多数の同時実行例外が発生しています。正常に再試行されますが、再試行回数が5回に達すると、エラーキューにコマンドが終了することがあります。

ここで、並行処理例外の原因を調べるために調査を開始できますか。ディスパッチャを削除してイベントの保存に専念すると、同じ問題が発生します。

私はEventStoreの永続性のためにRavenDBを使用しています。私はちょうどこの、空想何もしていないよ:

using (var stream = eventStore.OpenStream(entityId, 0, int.MaxValue)) 
{ 
    stream.Add(new EventMessage { Body = myEvent }); 
    stream.CommitChanges(Guid.NewGuid()); 
} 

例外のスタックトレースは次のようになります。

2012-03-17 18:34:01166 [Worker.14] WARN NServiceBus.Unicast.UnicastBus [(null)] <(null)> - EmployeeCommandHandlerがメッセージの処理に失敗しました。 EventStore.ConcurrencyException:タイプ の例外 'EventStore.ConcurrencyException'がスローされました。 でEventStore.OptimisticPipelineHook.PreCommit(試みをコミット) はC:\コード\公開\ EventStore \ SRC \ projの\ EventStore.Core \ OptimisticPipelineHook.cs:EventStore.OptimisticEventStore.Commitでライン 55(試みをコミット) Cで:\ Code \ public \ EventStore \ src \ proj \ EventStore.Core \ OptimisticEventStore.cs: EventStore.OptimisticEventStream.PersistChangesで(Guid commitId) にc:\ Code \ public \ EventStore \ src \ proj \ EventStore .Core \ OptimisticEventStream.cs: Cで行EventStore.OptimisticEventStream.CommitChangesで 168(GUID commitId):\コード\公開\ EventStore \ SRC \ projの\ EventStore.Core \ OptimisticEventStream.cs:CQRSTest3でライン 149。 Domain.Extensions.StoreEvent(ISto \ DEV \テスト\ CQRSTest3 \ CQRSTest3.Domain \ Extensions.cs:ライン13 CQRSTest3.Domain.ComandHandlers.EmployeeCommandHandler.Handle(ChangeEmployeeSalary メッセージ)で におけるC CにreEvents eventStore、実体識別子のGUID、オブジェクトEVT) :\ DEVの\テスト\ CQRSTest3 \ CQRSTest3.Domain \ ComandHandlers \ Emplo yeeCommandHandler.cs:ライン55

+0

例を使用してテストを再試行してください。並行処理の問題がRavenDb統合に固有であるかどうかを確認するSQLストア? –

答えて

10

私はそれを考え出しました。それを見つけるためにソースコードを掘り起こしなければならなかった。私はこれがより良く文書化されたことを望む!ここに私の新しいeventstoreのwireupです:

EventStore = Wireup.Init() 
      .UsingRavenPersistence("RavenDB") 
      .ConsistentQueries() 
      .InitializeStorageEngine() 
      .Build(); 

私は内部的にravenがする作っていたeventstoreクエリにWaitForNonStaleResultsを使用するカラス永続性プロバイダのために、().ConsistentQueriesを追加する必要がありました。

基本的には、新しいイベントを追加して、カレンダーが索引付けに追いつく前に別のイベントを追加しようとすると、ストリームリビジョンが最新ではありませんでした。 2番目のイベントは最初のイベントに進みます。

+1

それを見つけるための余分な点。 EventStoreの次のステップの1つは、優れたドキュメントです。 –

+0

このメソッドを見るのが嬉しいです。私はそれが失効したクエリの結果であるとわかったら、私はイベントストアのソースをハックする必要があるのではないかと心配しました。私は新しい文書を楽しみにしています。 :) –

+1

@JonathanOliver私はイベントストアを使用していないとちょうど後からこれにつまずいた。私は当時、レイヴンにとっては初めてでしたが、今はもっともっともっとそれに没頭しています。 '.ConsitentQueries()'の実装を変更する必要があります。 '.WaitForNonStaleResults()'は本番環境では本当に悪いです。あなたは忙しいシステムで永遠に待つでしょう。おそらく '.WaitForNonStaleResultsAsOfNow()'を使ってカットオフを提供するべきです。 –

関連する問題