Akka.net演员无法处理低延迟消息?

时间:2017-09-06 13:27:40

标签: akka.net

我有这个工作流程:

  1. 父级内部的方法

            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);
        });
    
  2. 位置协调器内的方法接收来自#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);
                });
            }
        });
    
  3. 获取转发消息的子项内部的方法:

            Command<UpdatePositionCmd>(cmd =>
        {
            Console.Write($"\nCmd Qty: {cmd.Qty}");
            Qty += cmd.Qty;
        });
    
  4. 所以我的问题是:“告诉”之间的Thread.Sleep(30)我得到正确的输出:

    Cmd数量:150
    Cmd数量:250
    Cmd数量:133
    总数量:533

    但是我应该删除还是减少Thread.Sleep(30)我得到了这个混乱的结果,其中基本上它只读取最后一条消息但是三次:

    Cmd数量:133
    Cmd数量:133
    Cmd数量:133
    总数量:399

    请帮忙。谢谢!

1 个答案:

答案 0 :(得分:1)

A method inside parent收到一个UpdatePositionCmd实例,将其传递给协调器,然后更新这个相同的命令。由于在第一次处理完成后第二次发出命令,因此延迟时间不太明显。

您应为每次调用_positionCoordinatorActor.Tell创建一个新实例,并使UpdatePositionCmd不可变,这样您就不会无意中更改已经发送过的实例。