2016-06-29 3 views
1

Модель актера службы Fabric поддерживает только сообщение стиля «запрос-ответ», насколько я могу судить. Есть ли способ, которым я могу добиться общения с «огнем и забыть»? (Например: как «ask» vs «tell» messaging в Akka?)Пожар и забыть обмен сообщениями с актерами?

Я столкнулся с этим сообщением в блоге (http://mikhail.io/2016/01/fire-and-forget-in-service-fabric-actors/), но не уверен, что это будет иметь какие-либо негативные последствия или если есть рекомендуемый способ выполнения этого?

ответ

1

Имейте метод инициализации вашего актера, который семян все, что требуется для вашей задачи. Установите таймер и вернитесь из метода инициализации. Когда таймер срабатывает, выключите таймер и запустите свою логику «Огонь и забудьте» с гарантией, что ваша работа будет выполнена. Грубый образец ниже.

public class SomeActor : Actor, ISomeActor 
{ 
    private IActorTimer _sendTimer; 

    protected override async Task OnActivateAsync() 
    { 
     await base.OnActivateAsync(); 
    } 

    protected override async Task OnDeactivateAsync() 
    { 
     await this.ExecuteAgents(); 
     await base.OnDeactivateAsync(); 
    } 

    public Task Initialize() 
    { 
     if (_sendTimer == null) 
     { 
      //setup timer 
      _sendTimer = this.RegisterTimer((obj) => 
      { 
       return this.Execute(); 
      }, 
       null, 
       TimeSpan.FromSeconds(1), 
       TimeSpan.FromSeconds(30)); 
     } 
    } 

    private async Task ExecuteAgents() 
    { 
     this.UnegisterTimer(_sendTimer); 

     //Perform workload 
    } 
} 
+0

Скажите, что Initialize теперь берет строку как параметр, и несколько актеров вызовут этого актера. Затем, получив несколько вызовов одному и тому же актеру, нам нужно будет отслеживать несколько таймеров для каждого сделанного вызова? (Если я это правильно понимаю) –

+0

Это зависит от того, какое поведение вы хотите. Один из способов - использовать случайно сформированные идентификаторы, чтобы каждый раз получать новый экземпляр актера (проверка на наличие коллизий, если значение _sendTimer равно null). Вы также можете настроить реализацию на основе очереди вместо обработки столкновений, где, когда происходит столкновение, конкретный экземпляр актера просто выполняет две части работы, когда срабатывает время. –

+0

Эта диаграмма из документов SF объясняет многое. Просто обменять клиент, для службы diff-actor. http://i.stack.imgur.com/PeuKY.png –

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