2016-06-02 9 views
2

サービスファブリックには、RunAsyncメソッドと2つのサービスコールの両方でステートフルなサービスが用意されています。サービスファブリックのReliableQueueのデッドロックやタイムアウトを防止できますか?

一つのサービスコール物事をデキューしようとする一方でReliableQueue

using(ITransaction tx = StateManager.CreateTransaction()) 
{ 
    await queue.EnqueueAsync(tx, message); 
    queueLength = await queue.GetCountAsync(tx); 
    await tx.CommitAsync(); 
} 

で何かRunAsyncをキューに入れることができます:

using(ITransaction tx = StateManager.CreateTransaction()) 
{ 
    await queue.TryDequeueAsync(tx); 
    queueLength = await queue.GetCountAsync(tx); 
    await tx.CommitAsync(); 
} 

GetCountAsyncは、デッドロックが発生するようですが、二つのトランザクションので、互いにブロックする。注文を入れ替えると助けになるでしょうか?最初に数えてデキュー/エンキューしますか?

答えて

1

これは、今日のReliableQueueが厳密なFIFOであり、一度に1つのリーダーまたはライターしか許可しないためです。あなたはおそらくデッドロックを見ていないでしょう、あなたはタイムアウトを見ています(そうでない場合は私を修正してください)。

  • トランザクションが長期間実行されないようにしてください。必要以上に長くキュー内の他の作業をブロックしていることを確認してください。
  • デフォルトのトランザクションタイムアウトを増やします(デフォルトは4秒です、あなたは別の値を渡すことができます)

並べ替え物事はどんな変化を起こすべきではありません。

1

2つの異なる場所で2つのトランザクションを実行すると、デッドロックが発生することはありません。デッドロックは、mutexのように動作します。トランザクション内でトランザクションを作成しているにも関わらず、その原因は何か。

おそらくそれは何が起こっているのですか?私はトランザクションTransactional、すなわちDoSomethingTransactionalAsyncを作成する関数の命名規則を最近開発しました。プライベートヘルパーの場合、通常はtxを1つとtxを作成する2つのバージョンを作成します。例えば

AddToProcessingQueueAsync(ITransaction tx, int num)AddToProcessingQueueTransactionalAsync(int num)

関連する問題