1

Сценарий: statefull SF сервис сохранит свое состояние в нескольких надежных коллекциях. Statefull SF доступен через удаленный доступ.Когда и где лучше всего инициализировать надежную коллекцию?

Нужно ли «инициализировать» коллекции перед первым использованием (путем вызова StateManager.GetOrAddAsync)? Помогло бы ли оно снизить первый доступ к надежной коллекции или нет необходимости делать этот шаг?

Если это необходимо сделать, когда это подходящее время и место для этого? Самое разумное место прямо перед бесконечным циклом в RunAsync, но что, если метод, вызванный посредством удаленного доступа, будет вызываться до того, как коллекции будут инициализированы? Будет ли какое-либо ухудшение производительности в этом первом удаленном вызове (когда сбор будет инициализирован)?

Последняя вещь -> при работе с надежными коллекциями в порядке хранения ссылки на коллекцию в классе (например, во время запуска какого-либо экземпляра я получаю ссылку с помощью StateManager.GetOrAddAsync) и работает только с этой ссылкой или лучше вызвать StateManager.GetOrAddAsync перед каждым вызовом коллекции?

Спасибо за ответы!

ответ

0

Нужно ли «инициализировать» коллекции перед первым использованием (путем вызова StateManager.GetOrAddAsync)?

Да, но вам не нужно делать это, чтобы «разогревать» коллекцию. Вызовите этот метод, если вам действительно нужно получить некоторые данные или хотите что-то сохранить.

Что делать, если метод, вызванный посредством удаленного доступа, вызывается до того, как коллекции будут инициализированы?

Вот почему вам нужно сделать StateManager.GetOrAddAsync при каждом обращении к службе.

Есть ли будет любое ухудшение производительности в том, что первый вызов удаленного взаимодействия

Да. Но это будет незаметно.

при работе с надежными коллекциями это нормально держать ссылку на коллекцию в классе

Вы можете хранить ссылку на коллекцию в переменном внутри вызова метода. Вот пример:

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 reference vs. call GetOrAddAsync»: Сценарий: класс Wrapper вокруг надежной коллекции. Методы класса создают транзакцию, хранят/извлекают данные и фиксируют транзакцию. Достаточно получить ссылку на коллекцию в инициализации/построении обертки или я должен вызвать GetOrAddAsync во всех методах до создания транзакции и работы с коллекцией? Вы получаете состояние перед каждым добавлением/RetrievePost? – ElDiabloComputatore

+0

Прежде чем создавать транзакцию и работать с коллекцией, вы должны вызывать 'GetOrAddAsync' в каждом методе.Ну, конечно, вы можете сохранить его в переменной, но я не уверен, что он будет работать, например, когда одновременно вызываются несколько методов службы. Наверное, это сработает, но я бы не рекомендовал этот подход. Итак, да, вам нужно создать его при вызове метода каждой службы. Почему бы и нет? Это дешево, как черт по сравнению с другими операциями. Я получаю состояние при каждом вызове AddPost, только внутри самого метода. – cassandrad

Смежные вопросы