2017-12-12 10 views
0

RabbitMQキューからセンサーメッセージを読み取るサービスファブリックサービスがあります。次に、メッセージの内容を持つセンサーアクタを呼び出して、センサアクタがその状態を更新できるようにします。センサアクタはルームアクタを呼び出して状態を更新し、プロセスはフロア、建物、サイトに移動します。ActorConcurrencyLockTimeoutExceptionビルディング階層の状態を集約するアクターについて

時には、部屋、階または建物のアクタでActorConcurrencyLockTimeoutExceptionが発生し、メッセージキューのバックアップが開始されることがあります。この並行性の問題を避けるために使用した別のデザインパターンがありますか?

+0

これは、信頼できる俳優が基づいている仮想俳優パターンについての以下の研究論文に基づいて考えるとわかっている動作です。 "アクターが以前の呼び出しを処理していた場合、 要求は、その要求の実行が 完了するまで、キューに入れられます.https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02 /Orleans-MSR-TR-2014-41.pdf – Baskar

+0

参照したい場合は、他のパターンもあります。 https://github.com/Huachao/azure-content/blob/master/articles/service-fabric/service-fabric-reliable-actors-patterns-introduction.md – Baskar

+0

ありがとう、私はhttpsで他のパターンを見てきました://github.com/Huachao/azure-content/blob/master/articles/service-fabric/service-fabric-reliable-actors-patterns-introduction.mdしかし、私は私がどのように変化するかについて私の頭を包んでいるようには思えないアンチパターンセクションのコメントに基づいて分散パターン計算のような別のパターンを使用する私の設計では、このパターンが有益かもしれないと述べています。 –

答えて

0

問題は、Actor(など)を呼び出すActorを呼び出すActorによって発生します。この呼び出しの間、すべてのアクタは実行中にロックされたままです(単一エントリ)。チェーン内のアクターの1人がメッセージの処理に時間がかかると、チェーン全体(上向き)が遅くなります。

イベントドリブンアーキテクチャを使用すると、アクター間の依存関係を削減できます。単に変更をブローカに公開し、処理を待つことなく、依存関係のチェーンを1つ(ブローカ)に減らします。 pub-subアプローチのossの例はhereです。 nugetでも利用できます。

+0

ありがとう、それは私が問題を引き起こしていたと予想したものです。私はオスを見て、私はすぐに質問があります。各ブローカーアクターは、単一のメッセージタイプのみを処理しますか?したがって、5つのメッセージタイプがある場合、5つのブローカーアクターが必要になります。 –

+0

すべてのメッセージ・タイプの結果、1つのBrokerActorインスタンスになります。ただし、ブローカーアクタの代わりにブローカサービスを使用することをお勧めします。すべてのメッセージタイプに1つのブローカサービス(xレプリカ)を使用できます。 – LoekD

+0

メッセージのシリアル化を解除してJson.NETを支援するために使用できるJsonConverterを渡すか、設定する方法はありますか?私のメッセージの中には現在これが必要です。 Thanks –

関連する問題