Helo guys.

I'm new with Scala and Akka. I'm trying to build a small payment 
authorization service using Scala + Akka + Spray.
I've started to write a small piece of code with just one operation and I 
wanted to validate the code and the performance. I'm using ab to test it 
and I'm having trouble to get a good performance, right now having only 7 
transactions per second which I think is very slow. 

I'm pretty sure I'm doing something wrong, so I wanted to ask you guys if 
you see something wrong with my code. 
Here are the details:


GatewayKernel:

class RestInterface extends HttpServiceActor {

  import context.dispatcher
  import akka.pattern.{ask, pipe}
  
  implicit val timeout = Timeout(10 seconds)
  val authActor = context.actorOf(Props[LoginActor])

  def receive = runRoute {
    pathPrefix("api") {
      path("login") {
        post { 
          detach() {
            entity(as[Login]) { login => requestContext =>
              val responderActor = createAuthResponder(requestContext)
              authActor.ask(login) pipeTo responderActor
            }
          }
        }
      }
    }~
    pathPrefix("api") {        // just for testing
      path("ping") {
        get { 
          complete { "pong" }
        }
      }
    }
  }

  def createAuthResponder(requestContext:RequestContext) = {
      context.actorOf(Props(new AuthProcessor(requestContext, authActor)))
  }
  
}



And the definition for LoginActor is very simple:


class LoginActor extends Actor with ActorLogging {


  def receive = {

    case Login(username, password, terminalId, device_serial) => { 

        sender ! handleLogin(username, password, terminalId, device_serial)

    }

  }



  def handleLogin(username: String, password: String, terminalId: Int, 
device_serial: Option[String]) {

    dbo withSession { implicit session =>

      val userInfo = tableTerminalUser.filter(

          tu => tu.userName === username && tu.terminalId === terminalId).
map(

              tu => (tu.passHash, tu.status, tu.expires)).run.headOption


      if ( !userInfo.isEmpty ) {

        // Check user status

        val status = userInfo.get._2

        if (status != 1) {      // TODO: Move somewhere else

          sender ! new ResponseError(-1001, "User account is inactive")

        }

        else{

          // Check password

          val passHash = userInfo.get._1

          

          if (PasswordUtil.validatePassword(password, passHash)) {

            sender ! new LoginOkResponse(0, "a23bce005432a394")

          }

          else {

            sender ! new ResponseError(-1001, "Invalid user name or 
password")

          }

        }

      }

      else {

        sender ! new ResponseError(-1000, "Invalid user name or password")

      }

    }

  }

}


I'm also using Slick to db access.
As you can see it's very simple.

Here is what you can see with ab:

Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Finished 500 requests


Server Software:
Server Hostname:        localhost
Server Port:            5000

Document Path:          /api/login
Document Length:        50 bytes

Concurrency Level:      20
Time taken for tests:   106.394 seconds
Complete requests:      500
Failed requests:        0
Write errors:           0
Total transferred:      86500 bytes
Total POSTed:           113000
HTML transferred:       25000 bytes
Requests per second:    4.70 [#/sec] (mean)
Time per request:       4255.766 [ms] (mean)
Time per request:       212.788 [ms] (mean, across all concurrent requests)
Transfer rate:          0.79 [Kbytes/sec] received
                        1.04 kb/s sent
                        1.83 kb/s total

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.4      0       4
Processing:   364 4180 724.1   4219    5432
Waiting:      363 4180 724.1   4219    5432
Total:        367 4180 723.9   4219    5432

Percentage of the requests served within a certain time (ms)
  50%   4219
  66%   4531
  75%   4749
  80%   4822
  90%   5099
  95%   5194
  98%   5238
  99%   5402
 100%   5432 (longest request)


In this case less than 7 TPS.
Thanks for your help.


Regards.



-- 
>>>>>>>>>>      Read the docs: http://akka.io/docs/
>>>>>>>>>>      Check the FAQ: 
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>>      Search the archives: https://groups.google.com/group/akka-user
--- 
You received this message because you are subscribed to the Google Groups "Akka 
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to