2015-04-06 24 views
8

Zacząłem grać z Actor model, w szczególności z Akka.NET. Ogólnie myślę, że mam dobry pomysł, o co w tym wszystkim chodzi, ale oczywiście diabeł tkwi w szczegółach. Myślałem o przyjęciu Akka.NET w już istniejącej bazie kodu, dlatego chciałbym oszacować, jak wiele z istniejących abstrakcji można zachować. Pomysł polegał na tym, że niektóre konkretne interfejsy wysokiego poziomu mogły być przechowywane, a niektóre implementacje adapterów byłyby napisane tak, aby bezproblemowo przechodzić tam iz powrotem między światem aktorów a użytkownikami istniejących interfejsów, ale nie jestem pewien, czy to jest zalecane i co rodzaje konkretnych problemów, z którymi powinienem się zmierzyć.Aktorzy i pakowacze Akka.NET (potencjalnie z Rx)

Trivial przykład:

public interface IGetSet<in TK, TV> 
{ 
    TV Get(TK key); 
    void Set(TK key, TV value); 
} 

public class GetSet<TK, TV> : IGetSet<TK, TV> 
{ 
    private readonly ActorRef _getSetActor; 

    public GetSet(ActorRefFactory system) 
    { 
     _getSetActor = system.ActorOf(Props.Create(() => new GetSetActor())); 
    } 

    public TV Get(TK key) 
    { 
     var x = _getSetActor.Ask<TV>(new GetSetActor.Get(key)); 
     return x.Result; //blocking, I know, it's just an example 
    } 

    public void Set(TK key, TV value) 
    { 
     _getSetActor.Tell(new GetSetActor.Set(key, value)); 
    } 

    class GetSetActor : ReceiveActor 
    { 
     readonly Dictionary<TK, TV> _values = new Dictionary<TK, TV>(); 

     public class Get 
     { 
      public Get(TK key) { Key = key; } 
      public TK Key { get; private set; } 
     } 

     public class Set 
     { 
      public Set(TK key, TV value) { Key = key; Value = value; } 
      public TK Key { get; private set; } 
      public TV Value { get; private set; } 
     } 

     public GetSetActor() 
     { 
      Receive<Get>(g => Sender.Tell(_values[g.Key], Self)); 
      Receive<Set>(g => _values[g.Key] = g.Value); 
     } 
    } 
} 

... 

var gs = new GetSet<string, int>(ActorSystem.Create("Wasp")); 
gs.Set("a", 42); 
var i = gs.Get("a"); 

W tym przypadku interfejs IGetSet pochodzi z tradycyjnego świata, a jego realizacja pozwala nam przejść tam iz powrotem z aktorów światowych. Starałem się być miły z aktorami, których nigdy nie używa się w sposób inny niż przekazywanie wiadomości, więc ogólnie to (banalne, oczywiście) ćwiczenie wygląda obiecująco, ale chciałbym wiedzieć, czy jest coś więcej, na co powinienem zwrócić uwagę od samego początku 1.

Czytałem o unikaniu dodatkowego nie asynchronicznego kodu asynchronicznego, zamykającego klapy na stanie aktorów, to jasne i nie robię tego, ale może jest coś, czego nie widzę. Ostatecznym celem jest wykorzystanie tego wzorca dość obszernie, aż do punktu, w którym napisałbym zorientowane aktorom implementacje Rx-a ISubject (które BTW już zrobiłem i było to łatwe, ale znowu nie jestem pewien, czy poświęcałem wystarczająco dużo uwagi powinien).

Przeczytałem też trochę o Typed Actors, ale nie jestem ekspertem od Scala, więc może nie rozumiem wszystkich szczegółów z próbek kodu i nie jestem pewien, czy są one już dostępne w Akka.NET (doc page is a 404)

Odpowiedz

6

To wygląda dobrze. Należy wziąć pod uwagę, że aktorzy mają domyślną gwarancję na dostawę "co najwyżej", więc powinieneś wziąć pod uwagę, że podczas komunikacji z twoim aktorem możesz nie otrzymać odpowiedzi. (Awaria sieci, zdealizowane zdalne węzły itp.)

W systemie lokalnym bardzo mało prawdopodobne jest zagubienie wiadomości, ale teoretycznie system aktorski może ulec awarii, jeśli ktoś zrobi z nim coś zbyt dzika, a tym samym aktorzy umierają.

Tak więc, komunikując się z aktorem przy użyciu Ask lepiej być bezpiecznym i zapewnić limit czasu i obsługiwać ten wyjątek, zamiast blokować/czekać na zawsze.

Program Async/Await obsługiwany jest od ostatniego wydania wersji wstępnej (pre 1.0). Nie jest to jednak zalecane podejście. lepiej trzymać się z PipeTo i jawnie.

Inną rzeczą, która może stać się niepewna, jest to, że w twoim przykładzie traktujesz aktora jako magazyn wartości kluczowych, co jest w porządku. A twoje wiadomości są również niezmienne, co również jest dobre. Ale jeśli właściwość Klucz lub Wartość to typy ref, a ludzie mogą mutować te z zewnątrz, np. konsumenci IGetSet, które mogą spowodować problemy RC wewnątrz aktora jako aktora może odczytać te wartości, gdy inny wątek jest ich mutacji ..

ActorSystems są dość drogie, starają się unikać kręci się wiele systemów, dążyć do jednego systemu na proces.

Poza tym dobrze jest iść.

+0

Wielkie dzięki, będę zwracać uwagę na twoje sugestie i pójść na to :) Jeśli masz jeszcze jedną minutę, jaki jest obecny plan z Wpisanymi Aktorami? Czy będą dostępne w wersji 1.0? – Wasp

+0

TypedAktory wciąż tam są, nie są jednak takie same jak w JVM, pisane aktorzy w JVM są trochę podobne do aktorów w Orleanie w strukturze. Wpisani aktorzy w Akka.NET są bardziej podobni do obsługi poleceń CQRS .. ale tak, nadal są wspierani –

+0

Dobrze wiedzieć i dobrze pracować :) – Wasp