2016-12-06 14 views
1

시나리오 : statefull SF 서비스는 신뢰할 수있는 여러 컬렉션에 상태를 저장합니다. Statefull SF는 원격을 통해 사용할 수 있습니다.신뢰할 수있는 컬렉션을 초기화하는 가장 좋은 시점은 언제입니까?

StateManager.GetOrAddAsync를 호출하여 처음 사용하기 전에 컬렉션을 "초기화"해야합니까? 신뢰할 수있는 컬렉션에 대한 첫 번째 액세스를 낮추는 데 도움이 되나요? 아니면이 단계를 수행 할 필요가 없습니까?

이 초기화를 수행하는 것이 좋은 경우 적절한시기와 장소는 언제입니까? 가장 합리적인 장소는 RunAsync의 무한 루프 바로 직전이지만 컬렉션이 초기화되기 전에 remoting을 통해 호출되는 메서드가 호출되는 경우 어떻게해야합니까? 첫 번째 원격 호출에서 성능이 저하 될 것입니까 (컬렉션을 초기화 할 때)?

마지막으로 신뢰할 수있는 컬렉션을 작업 할 때 클래스의 컬렉션에 대한 참조를 유지하는 것이 좋습니다 (예 : 일부 인스턴스를 시작할 때 StateManager.GetOrAddAsync를 사용하여 참조를 가져옵니다).이 참조만으로 작업하거나 콜을 호출하기 전에 StateManager.GetOrAddAsync를 호출합니까?

답변 해 주셔서 감사합니다.

답변

0

StateManager.GetOrAddAsync를 호출하여 처음 사용하기 전에 컬렉션을 "초기화"해야합니까?

예, 그렇지만 컬렉션을 "워밍업"할 필요는 없습니다. 실제로 일부 데이터를 검색해야하거나 저장하려는 경우 해당 메소드를 호출하십시오.

콜렉션이 초기화되기 전에 via remoting이라는 메서드가 호출되면 어떻게 될까요?

서비스를받을 때마다 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

감사 : 다음은 그 예입니다! "Hold 참조와 GetOrAddAsync 호출"에 조금 추가되었습니다. 시나리오 : 안정적인 수집을 중심으로하는 래퍼 클래스입니다. 클래스 메소드는 트랜잭션을 작성하고 데이터를 저장/검색하며 트랜잭션을 커밋합니다. 래퍼 초기화/생성에서 컬렉션에 대한 참조를 얻는 것으로 충분합니다. 또는 트랜잭션을 만들고 컬렉션으로 작업하기 전에 모든 메서드에서 GetOrAddAsync를 호출해야합니까? 모든 AddPost/RetrievePost 앞에 상태가 표시됩니까? – ElDiabloComputatore

+0

트랜잭션을 생성하고 콜렉션을 사용하기 전에 모든 메소드에서'GetOrAddAsync'를 호출해야합니다.음, 물론 변수에 저장할 수는 있지만, 예를 들어 여러 서비스의 메소드가 동시에 호출 될 때 작동하는지 확신 할 수 없습니다. 아마 작동 할 것이지만 나는이 방법을 추천하지 않을 것이다. 그래서, 모든 서비스의 메소드 호출에서 생성해야합니다. 왜, 어쨌든? 그것은 다른 작업과 비교하여 지옥처럼 싸다. AddPost를 호출 할 때마다 메소드 자체 안에 상태가 표시됩니다. – cassandrad