簡體   English   中英

Akka.NET演員和包裝器(可能與Rx)

[英]Akka.NET actors and wrappers (potentially with Rx)

我開始玩Actor模型 ,尤其是Akka.NET 總的來說,我認為我對所有內容都有一個很好的了解,但當然魔鬼在細節上。 我在考慮在現有的代碼庫中采用Akka.NET,因此我想估計可以保留多少現有的抽象。 我們的想法是可以保留一些特定的高級接口,並且可以編寫一些適配器實現以在演員世界和現有接口的用戶之間無縫地來回傳遞,但是我不確定是否推薦了這些接口我應該面對的具體問題類型。

瑣碎的例子:

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");

在這種情況下, IGetSet接口來自傳統世界 ,它的實現讓我們可以與演員世界來回轉換。 我試圖與演員很好,從來沒有使用過與消息傳遞不同的方式,所以整體來說這個(當然是微不足道的)練習看起來很有希望,但是我想知道從那天開始我還有什么需要注意的。 1。

我一直在閱讀關於避免額外的基於非演員的異步代碼對演員的狀態進行封閉,這很清楚而且我沒有這樣做,但也許還有更多我看不到的東西。 我的最終目標是非常廣泛地使用這種模式,直到我會編寫Rx的ISubject演員導向實現(我已經做過BTW,這很容易,但我再也不確定我是否對所有我都給予足夠的重視應該)。

我也讀過一些關於Typed Actors的內容 ,但我不是Scala專家,所以也許我沒有抓住代碼示例中的所有細節,而且我不確定它們是否已經在Akka.NET中可用( doc page is一個404

這看起來不錯。 您應該考慮的是,默認情況下,演員有“最多一次”的交付保證,因此,您應該考慮到與您的演員溝通時可能無法獲得回復。 (網絡故障,崩潰的遠程節點等)

在本地系統中,消息不太可能丟失,但從理論上講,如果某人做了過於狂野的事情,演員系統可能會崩潰,從而演員死亡。

因此,當使用Ask與演員進行通信時,最好是安全並提供超時並處理該異常而不是永久阻止/等待。

從最新的預發布位(1.0之前版本)開始支持Async / Await。 然而,這不是推薦的方法。 更好地堅持使用PipeTo並明確。

另一件可以獲得iffy的事情是,因為在你的例子中你將actor視為Key Value商店,這很好。 而且你的消息也是不可變的,這也很好。 但是如果Key或Value屬性是ref類型,並且人們可以從外部改變那些,例如IGetSet的消費者可能導致actor內部的RC問題,因為當另一個線程正在改變它們時,actor可能會讀取這些值。

ActorSystems也非常昂貴,盡量避免使用多個系統,每個進程的目標是一個系統。

除此之外,你很高興。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM