命中次数超过总请求数

时间:2019-10-01 13:08:12

标签: scala concurrency akka akka-http wrk

所以我开始学习Scala和Akka演员Akka-Http。我试图使用Akka Http实现一个简单的点击计数器,该计数器计算本地主机页面上的每个点击。我使用wrk工具运行10个具有100个连接的线程,此后计数与总请求数不匹配(见wrk)。

这是我的代码:


object WebServer3 {

  var number: Int = 0


  final case class Inc()
  class ActorClass extends Actor with ActorLogging {

    def receive = {
      case Inc => number = number + 1
    }
  }


  def main(args: Array[String]) {
    implicit val system = ActorSystem("my-system")
    implicit val materializer = ActorMaterializer()
    implicit val executionContext = system.dispatcher

    val actor1 = system.actorOf(Props[ActorClass], "SimpleActor")
    val route =
      path("Counter") {

        get {
          actor1 ! Inc
         complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, s"<h1>You visited $number times</h1>"))
        }
      }

    val bindingFuture = Http().bindAndHandle(route, "localhost", 8080)
    println(s"Server online at http://localhost:8080/\nPress RETURN to stop...")
    StdIn.readLine() // let it run until user presses return
    bindingFuture
      .flatMap(_.unbind()) // trigger unbinding from the port
      .onComplete(_ => system.terminate()) // and shutdown when done
  }
}

请原谅我不成熟/不熟悉的编码技能。我仍在学习,我知道这与并发有关。但是我还没有找到解决方案。请帮忙。

edit#1:我也尝试过AtomicInteger。那没有帮助。 edit#2:我也尝试了完整的akka​​-http方式,并请求并等待。那也没有帮助。

1 个答案:

答案 0 :(得分:0)

您的代码几乎没有问题。

您要定义案例类// ... some code StringWriterWithEncoding sw = new StringWriterWithEncoding(); CsvWriter cw = new CsvWriter(sw); using (CsvWriter csv = new CsvWriter(sw)) { csv.Configuration.RegisterClassMap<HistorySearchModelCsvHelperMap>(); csv.Configuration.CultureInfo = CultureInfo.InvariantCulture; csv.WriteRecords(csvModelHelperList); } return Request.CreateResponse(HttpStatusCode.OK, sw.ToString()); // response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/vnd.ms-excel"); return response; ,但要发送伴随对象final case class Inc()。不过,您仍然匹配了伴随对象actor1 ! Inc,并且代码可以正常工作。但这不应该这样。

其他问题,我们正在参与者边界之外存储,修改和检索case Inc =>。我认为这就是为什么您计数错误。角色只能更改内部状态。

我通过引入ask pattern修改了您的代码,以便可以从actor中检索值。

var number: Int = 0