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)
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
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 –
Dobrze wiedzieć i dobrze pracować :) – Wasp