Akka .Net演员分离

时间:2018-11-30 17:12:50

标签: c# .net akka.net

我是Akka.Net的新手,我想创建10个actor,它们将基于消息的ID处理我的消息,即ActorA仅处理ID以0结尾的消息,ActorB消息以1结尾的消息以我为例,ID只是一个名为EmployeeNumber的字符串属性。以下是我所做的。 消息类别:

public class Message : IConsistentHashable
{
    public string EmployeeNumber { get; set; }
    public string MessageText { get; set; }
    public object ConsistentHashKey => EmployeeNumber.Last().ToString();

    public override string ToString()
    {
        return $"{EmployeeNumber} : {MessageText}";
    }
}

演员班:

 public class ProcessingActor : UntypedActor
{
    protected override void OnReceive(object message)
    {            
        var output = message as Message;
        if (output == null)
        {
            return;
        }
        Console.WriteLine($"I'm actor {Context.Self.Path}, I received message: {message}");
    }
}

主类:

tatic void Main(string[] args)
    {
        using (ActorSystem system = ActorSystem.Create("system"))
        {
            Props processingActorProps = Props.Create<ProcessingActor>().WithRouter(new ConsistentHashingPool(10));
            IActorRef processingActor = system.ActorOf(processingActorProps, "ProcessingActorsPool");

            var messages = GetSomeMessages();
            foreach (Message message in messages)
            {
                processingActor.Tell(message);
                Thread.Sleep(100);
            }
        }

        Console.ReadKey();
    }

GetSomeMessages()方法仅返回包含10条硬编码消息的列表。问题是我的解决方案无法正常工作,我预计将有10位参与者 处理我的消息,但我可以看到,雇员编号为12345和12340的消息是由同一个参与者处理的。我希望有人能解释我在做什么错。

1 个答案:

答案 0 :(得分:0)

the docs for Routers阅读,

  

这个想法是将具有相同密钥的消息转发到相同的路由。

因此,在您的代码示例中,可以确保所有EmployeeNumber以相同字符结尾的消息都将由相同的Actor处理,但是不能保证它们在消息之间平均分配Actors

如果您确实希望适当的Actor有效地处理每条消息,则可以扩展抽象RoutingLogic类并重写Routee Select(object message, Routee[] routees)方法以将数字与其{{1 }}。