Akka.Net为什么我的游泳池演员没有根据负载放大或缩小

时间:2016-08-29 11:28:18

标签: akka.net akka.net-cluster

我正在尝试构建一个可以使用以下配置根据工作负载向上/向下扩展的actor系统。

  akka {
        actor {
          serializers {
            wire = "Akka.Serialization.WireSerializer, Akka.Serialization.Wire"
          }
          serialization-bindings {
            "System.Object" = wire
          }              
        deployment {
          /analysis {
            router = round-robin-pool
            routees.paths = ["/user/analysis"]
            resizer {
                enabled = on
                lower-bound = 1
                upper-bound = 20
            }
          }
        }
        }
      }

在我的主循环中,我创建了3000条消息并推送给演员进行处理

        var runAnalysisProps = Props.Create<RunAnalysisActor>().WithRouter(FromConfig.Instance);
        //var runAnalysisProps = Props.Create<RunAnalysisActor>().WithRouter(new RoundRobinPool(0, new DefaultResizer(lower:1, upper: 10 ))); **This do not help either **
        var analysisRef = RunAnalysisActorSystem.ActorOf(runAnalysisProps, "analysis");

        Logger.LogMessage("Started Posting all messages", ConsoleColor.Blue);
        for (int i = 0; i < 3000; i++)
        {
            analysisRef.Tell(new AnalysisMessage(100 + i, $"FIC{100+ i}", $"c:\\temp\\fic{100 + i}.dat"));

        }
        Logger.LogMessage("Completed posting all messages", ConsoleColor.Blue);

我们在上面的for循环中看到了什么错误 对我来说,看起来它将所有消息发送到一个actor ref而不是路由器。

我的ReceiveActor是非常简单的日志记录应用程序

public RunAnalysisActor()
        {
            Receive<AnalysisMessage>((message)=> {
                Logger.LogMessage($"Analysis Started => Id: {message.AnalysisId}, Loop: {message.LoopName}, File:{message.FilePath}");
                var waitTime = rnd.Next(5) * 100;
                //Logger.LogMessage($"Waiting => {waitTime}");
                Thread.Sleep(10);
                Logger.LogMessage($"Analysis Completed=> AId: {message.AnalysisId}, Loop: {message.LoopName}, File:{message.FilePath}");

            });
        }

我还覆盖了AroundPreStartPostStop,以查看有多少演员被启动和停止。但是我看到,当应用程序启动时,它只创建lower-bound或最少2个actor,我希望这会根据pressure-threshold默认值1创建更多的actor,但我看到它的当没有任何要处理的消息时,它不会发生,也不会缩小。

有人可以帮我理解我在这里做错了什么。 - 谢谢

更新1:

我想我找出了实际问题。在发布消息时,我需要更改逻辑以附加路径到我的部署配置routees.paths = ["/user/analysis"],并使用Ask函数来使用analysisRef.Ask<Routees>来获取正确的引用。

        RunAnalysisActorSystem.Scheduler.Advanced.ScheduleRepeatedly(
            TimeSpan.FromMilliseconds(500),
            TimeSpan.FromMilliseconds(500),
            () => {
                if (analysisRef.Ask<Routees>(new GetRoutees()).Result.Members.Any())
                {
                    var i = rand.Next();
                    analysisRef.Tell(new AnalysisMessage(100 + i, $"FIC{100 + i}", $"c:\\temp\\fic{100 + i}.dat"));
                }
            }
        );

0 个答案:

没有答案