我是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的消息是由同一个参与者处理的。我希望有人能解释我在做什么错。
答案 0 :(得分:0)
这个想法是将具有相同密钥的消息转发到相同的路由。
因此,在您的代码示例中,可以确保所有EmployeeNumber
以相同字符结尾的消息都将由相同的Actor
处理,但是不能保证它们在消息之间平均分配Actors
。
如果您确实希望适当的Actor
有效地处理每条消息,则可以扩展抽象RoutingLogic
类并重写Routee Select(object message, Routee[] routees)
方法以将数字与其{{1 }}。