2016-12-06 41 views
1

場景:statefull SF服務會將其狀態存儲在多個可靠的集合中。有狀態SF可通過遠程訪問。何時何地最好初始化可靠的集合?

我需要在第一次使用前通過調用StateManager.GetOrAddAsync來「初始化」集合嗎?它是否有助於降低第一次獲得可靠的收集或不需要執行此步驟?

如果建議做這個init,什麼時候是合適的時間和地點去做? 最合理的地方是在RunAsync無盡循環之前,但是如果通過遠程調用的方法在集合被初始化之前會被調用?在第一次遠程呼叫(收集將要初始化時)中是否會出現性能下降?

最後一件事 - 當使用可靠的集合時,可以在類中保存對集合的引用(例如,在某些實例啓動過程中,我將通過使用StateManager.GetOrAddAsync獲取引用),並且僅與此引用一起工作,或者更適合每次調用收集之前調用StateManager.GetOrAddAsync?

感謝您的回答!

回答

0

我需要在第一次使用前通過調用StateManager.GetOrAddAsync來「初始化」集合嗎?

是的,但你不必這樣做「熱身」收集。如果您確實需要檢索某些數據或想要存儲某些內容,請調用該方法。

如果通過遠程調用方法在集合被初始化之前調用,該怎麼辦?

這就是爲什麼你需要在每次打電話給服務時都要做StateManager.GetOrAddAsync

是否有將是任何性能惡化,首先遠程調用

是。但它會不明顯。

與可靠的集工作,如果是OK的

類來保存參考收集

你可以抓住一個方法調用中的變量集合的引用。這裏是一個例子:

public async Task AddPost(Guid userId, PostId postId) 
    { 
     try 
     { 
      var state = await StateManager.GetOrAddAsync<IReliableDictionary<Guid, List<PostId>>>(StateName); 

      using (var tx = StateManager.CreateTransaction()) 
      { 
       await state.AddOrUpdateAsync(
        tx, 
        userId, 
        addValue: new List<PostId> {postId}, 
        updateValueFactory: (usrId, oldPostsList) => 
        { 
         oldPostsList.Insert(0, postId); 
         return oldPostsList; 
        } 
       ); 

       await tx.CommitAsync(); 
      } 
     } 
     catch (TimeoutException) 
     { 
      PostsLogger.Singleton.LogWarning("Add post timeout"); 
      throw; 
     } 
     catch (Exception ex) 
     { 
      PostsLogger.Singleton.LogException(sb.ToString(), ex); 
      throw; 
     } 
    } 
+0

謝謝你的回答! 「保持引用與調用GetOrAddAsync」稍有不同: 場景:圍繞可靠收集的包裝類。類方法創建事務,存儲/檢索數據和提交事務。 在創建事務和使用集合之前,在包裝器初始化/構造中獲取對集合的引用是足夠的還是應該在每個方法中調用GetOrAddAsync? 你是否在每個AddPost/RetrievePost之前獲得狀態? – ElDiabloComputatore

+0

在創建事務和使用集合之前,您應該在每種方法中調用'GetOrAddAsync'。那麼,當然你可以將它存儲在一個變量中,但我不確定它會起作用,例如,當同時調用多個服務的方法時。可能它會工作,但我不會推薦這種方法。所以,是的,你需要在每個服務的方法調用中創建它。畢竟,爲什麼不呢?與其他操作相比,它比較便宜。我在每次調用AddPost時都會得到狀態,就在方法本身內部。 – cassandrad