Akka.net演员可以';无法处理低延迟消息?

Akka.net演员可以';无法处理低延迟消息?,akka.net,Akka.net,我有这样的工作流程: 父级内部的方法 Receive<UpdatePositionCmd>(cmd => { cmd.Qty = 150; cmd.Price = 100; _positionCoordinatorActor.Tell(cmd); Thread.Sleep(30); cmd.Qty = 250; cmd.Pr

我有这样的工作流程:

  • 父级内部的方法

            Receive<UpdatePositionCmd>(cmd =>
        {                
            cmd.Qty = 150;
            cmd.Price = 100;
            _positionCoordinatorActor.Tell(cmd);
    
            Thread.Sleep(30);
    
            cmd.Qty = 250;
            cmd.Price = 200;
            _positionCoordinatorActor.Tell(cmd);
    
            Thread.Sleep(30);
    
            cmd.Qty = 133;
            cmd.Price = 300;
            _positionCoordinatorActor.Tell(cmd);
        });
    
    Receive(cmd=>
    {                
    指令数量=150;
    指令价格=100;
    _位置协调器Tell(cmd);
    睡眠(30);
    指令数量=250;
    指令价格=200;
    _位置协调器Tell(cmd);
    睡眠(30);
    指令数量=133;
    指令价格=300;
    _位置协调器Tell(cmd);
    });
    
  • 位置协调器内的方法,该方法接收来自#1的消息,找到合适的子级并转发消息:

            Command<UpdatePositionCmd>(cmd =>
        {
            var child = LookupChild(cmd.PositionName);
            if (child != ActorRefs.Nobody)
            {
                child.Tell(cmd);
            }
            else
            {
                var @event = new PositionUpdatedEvent(cmd);
    
                Persist(@event, positionUpdatedEvent =>
                {
                    var childActor = Context.ActorOf(Props.Create(() => new PositionActor()), cmd.PositionName);
                    childActor.Tell(cmd);
                });
            }
        });
    
    命令(cmd=>
    {
    var child=LookupChild(cmd.PositionName);
    if(child!=ActorRefs.Nobody)
    {
    child.Tell(cmd);
    }
    其他的
    {
    var@event=new positionUpdateEvent(cmd);
    持久化(@event,positionUpdateEvent=>
    {
    var childActor=Context.ActorOf(Props.Create(()=>newpositionactor()),cmd.PositionName);
    儿童演员.Tell(cmd);
    });
    }
    });
    
  • 获取转发消息的子级中的方法:

            Command<UpdatePositionCmd>(cmd =>
        {
            Console.Write($"\nCmd Qty: {cmd.Qty}");
            Qty += cmd.Qty;
        });
    
    命令(cmd=>
    {
    写入($“\nCmd数量:{cmd.Qty}”);
    数量+=指令数量;
    });
    
  • 所以我的问题是:使用
    线程.Sleep(30)
    在“告诉”之间,我得到了正确的输出:

    指令数量:150
    指令数量:250
    指令数量:133
    总数:533

    但是我是否应该删除或减少
    线程。Sleep(30)
    我得到了一个混乱的结果,它基本上只读取最后一条消息,但读取了三次:

    指令数量:133
    指令数量:133
    指令数量:133
    总数:399


    请帮忙。谢谢大家!

    父对象中的方法
    接收一个
    UpdatePositionCmd
    实例,将其传递给协调器,然后更新这个相同的命令。有了延迟,这就不那么明显了,因为命令是在第一次处理完成后第二次发出的

    您应该为每个调用
    \u positionCoordinator.Tell
    创建一个新实例,并使
    UpdatePositionCmd
    不可变,这样您就不会无意中更改已发送的实例