【发布时间】:2015-06-10 23:29:27
【问题描述】:
我开始使用Actor model,尤其是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 的面向演员的实现(顺便说一句,我已经这样做了,这很容易,但我不确定我是否足够关注我应该)。
我还阅读了一些关于 Typed Actors 的信息,但我不是 Scala 专家,所以我可能没有掌握代码示例中的所有细节,而且我不确定它们是否已经在 Akka.NET 中可用(doc page is a 404)
【问题讨论】:
标签: c# system.reactive actor akka.net