From 72003b91e460a2ea6135ba87e0674d5d22c63823 Mon Sep 17 00:00:00 2001 From: Andriy Plokhotnyuk Date: Mon, 15 Jan 2018 15:10:55 +0100 Subject: [PATCH] Update dependencies, switch to most efficient JSON serializer and tune JVM options (#3180) * Make ./setup.sh executable * Update dependencies and switch to most efficient JSON serializer * Tune JVM options * Fix JSON response --- frameworks/Scala/colossus/build.sbt | 8 +- frameworks/Scala/colossus/setup.sh | 2 +- .../src/main/scala/example/Main.scala | 86 ++++++++----------- 3 files changed, 43 insertions(+), 53 deletions(-) mode change 100644 => 100755 frameworks/Scala/colossus/setup.sh diff --git a/frameworks/Scala/colossus/build.sbt b/frameworks/Scala/colossus/build.sbt index 40922687f9a..b4567886c33 100644 --- a/frameworks/Scala/colossus/build.sbt +++ b/frameworks/Scala/colossus/build.sbt @@ -1,14 +1,14 @@ name := """colossus-example""" -version := "0.3.0" +version := "0.4.0" -scalaVersion := "2.11.7" +scalaVersion := "2.12.4" com.github.retronym.SbtOneJar.oneJarSettings mainClass in oneJar := Some("example.Main") libraryDependencies ++= Seq( - "com.tumblr" %% "colossus" % "0.7.1-RC1", - "org.json4s" %% "json4s-jackson" % "3.3.0" + "com.tumblr" %% "colossus" % "0.11.0-M4", + "com.github.plokhotnyuk.jsoniter-scala" %% "macros" % "0.3.4" ) diff --git a/frameworks/Scala/colossus/setup.sh b/frameworks/Scala/colossus/setup.sh old mode 100644 new mode 100755 index fa09e9763e5..9cf989d08b3 --- a/frameworks/Scala/colossus/setup.sh +++ b/frameworks/Scala/colossus/setup.sh @@ -4,4 +4,4 @@ fw_depends java sbt sbt 'oneJar' -batch -java -jar target/scala-2.11/colossus*one-jar.jar +java -server -Xms1g -Xmx1g -XX:NewSize=512m -XX:MaxNewSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=10 -XX:-UseBiasedLocking -XX:+AlwaysPreTouch -jar target/scala-2.12/colossus*one-jar.jar diff --git a/frameworks/Scala/colossus/src/main/scala/example/Main.scala b/frameworks/Scala/colossus/src/main/scala/example/Main.scala index 42d4fcfb2b5..d8d63bd3768 100644 --- a/frameworks/Scala/colossus/src/main/scala/example/Main.scala +++ b/frameworks/Scala/colossus/src/main/scala/example/Main.scala @@ -1,58 +1,48 @@ package example -import colossus._ -import colossus.core.{Initializer, Server, ServerRef, ServerSettings} -import colossus.service._ -import Callback.Implicits._ +import akka.actor.ActorSystem +import colossus.core._ import colossus.protocols.http._ +import colossus.service._ +import colossus.service.Callback.Implicits._ +import colossus.service.GenRequestHandler.PartialHandler +import colossus.util.DataSize +import com.github.plokhotnyuk.jsoniter_scala.core._ +import com.github.plokhotnyuk.jsoniter_scala.macros.JsonCodecMaker._ +import com.github.plokhotnyuk.jsoniter_scala.macros._ -import org.json4s._ -import org.json4s.jackson.JsonMethods._ -import org.json4s.JsonDSL._ - -object BenchmarkService { - - implicit object JsonBody extends HttpBodyEncoder[JValue] { - val jsonHeader = HttpHeader("Content-Type", "application/json") - def encode(json: JValue) = new HttpBody(compact(render(json)).getBytes("UTF-8"), Some(jsonHeader)) - } - - def json: JValue = ("message" -> "Hello, World!") - val plaintext = HttpBody("Hello, World!") - val serverHeader = HttpHeader("Server", "Colossus") - - def start(port: Int)(implicit io: IOSystem) { - - val serverConfig = ServerSettings( - port = port, - maxConnections = 16384, - tcpBacklogSize = Some(1024) - ) - val serviceConfig = ServiceConfig( - requestMetrics = false - ) - - Server.start("benchmark", serverConfig) { new Initializer(_) { - - val dateHeader = new DateHeader - val headers = HttpHeaders(serverHeader, dateHeader) - - def onConnect = ctx => new Service[Http](serviceConfig, ctx){ - def handle = { - case req if (req.head.url == "/plaintext") => req.ok(plaintext, headers) - case req if (req.head.url == "/json") => req.ok(json, headers) - } - } - }} - } - -} +import scala.concurrent.duration.Duration +case class Message(message: String) object Main extends App { + def toHttpBodyEncoder[T](codec: JsonCodec[T]): HttpBodyEncoder[T] = new HttpBodyEncoder[T] { + override def encode(data: T): HttpBody = new HttpBody(JsonWriter.write(codec, data)) - implicit val io_system = IOSystem() - - BenchmarkService.start(9007) + override def contentType: String = "application/json" + } + val serverConfig = ServerSettings( + port = 9007, + maxConnections = 16384, + tcpBacklogSize = Some(1024)) + val serviceConfig = ServiceConfig( + logErrors = false, + requestMetrics = false, + requestTimeout = Duration("1s"), + requestBufferSize = 65536, + maxRequestSize = DataSize(1024 * 1024)) + + implicit val actorSystem: ActorSystem = ActorSystem() + implicit val ioSystem: IOSystem = IOSystem() + implicit val messageEncoder: HttpBodyEncoder[Message] = toHttpBodyEncoder(make[Message](CodecMakerConfig())) + + HttpServer.start("Colossus", serverConfig)(initContext => new Initializer(initContext) { + override def onConnect: RequestHandlerFactory = serverContext => new RequestHandler(serverContext, serviceConfig) { + override def handle: PartialHandler[Http] = { + case req if req.head.url == "/plaintext" => req.ok("Hello, World!") + case req if req.head.url == "/json" => req.ok(Message("Hello, World!")) + } + } + }) }