Browse Source

Update Clojure/Reitit (#4953)

* Update Clojure/Reitit

* Update Porsas & db urls

* Tune JVM opts
Tommi Reiman 6 years ago
parent
commit
cee5227890

+ 56 - 222
frameworks/Clojure/reitit/benchmark_config.json

@@ -1,226 +1,60 @@
 {
 {
   "framework": "reitit",
   "framework": "reitit",
-  "tests": [
-    {
-      "default": {
-        "json_url": "/json",
-        "plaintext_url": "/plaintext",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "Micro",
-        "database": "None",
-        "framework": "reitit",
-        "language": "Clojure",
-        "flavor": "None",
-        "orm": "Raw",
-        "platform": "Undertow",
-        "webserver": "None",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "reitit",
-        "notes": "",
-        "versus": "Undertow"
-      }
-    },
-    {
-      "jdbc16": {
-        "db_url": "/db",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "Micro",
-        "database": "Postgres",
-        "framework": "reitit",
-        "language": "Clojure",
-        "flavor": "None",
-        "orm": "Raw",
-        "platform": "Undertow",
-        "webserver": "None",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "reitit-reactive",
-        "notes": "",
-        "versus": "Undertow"
-      }
-    },
-    {
-      "jdbc32": {
-        "db_url": "/db",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "Micro",
-        "database": "Postgres",
-        "framework": "reitit",
-        "language": "Clojure",
-        "flavor": "None",
-        "orm": "Raw",
-        "platform": "Undertow",
-        "webserver": "None",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "reitit-reactive",
-        "notes": "",
-        "versus": "Undertow"
-      }
-    },
-    {
-      "jdbc64": {
-        "db_url": "/db",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "Micro",
-        "database": "Postgres",
-        "framework": "reitit",
-        "language": "Clojure",
-        "flavor": "None",
-        "orm": "Raw",
-        "platform": "Undertow",
-        "webserver": "None",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "reitit-reactive",
-        "notes": "",
-        "versus": "Undertow"
-      }
-    },
-    {
-      "jdbc128": {
-        "db_url": "/db",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "Micro",
-        "database": "Postgres",
-        "framework": "reitit",
-        "language": "Clojure",
-        "flavor": "None",
-        "orm": "Raw",
-        "platform": "Undertow",
-        "webserver": "None",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "reitit-reactive",
-        "notes": "",
-        "versus": "Undertow"
-      }
-    },
-    {
-      "jdbc256": {
-        "db_url": "/db",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "Micro",
-        "database": "Postgres",
-        "framework": "reitit",
-        "language": "Clojure",
-        "flavor": "None",
-        "orm": "Raw",
-        "platform": "Undertow",
-        "webserver": "None",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "reitit-reactive",
-        "notes": "",
-        "versus": "Undertow"
-      }
-    },
-    {
-      "async16": {
-        "db_url": "/db",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "Micro",
-        "database": "Postgres",
-        "framework": "reitit",
-        "language": "Clojure",
-        "flavor": "None",
-        "orm": "Raw",
-        "platform": "Undertow",
-        "webserver": "None",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "reitit-reactive",
-        "notes": "",
-        "versus": "Undertow"
-      }
-    },
-    {
-      "async32": {
-        "db_url": "/db",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "Micro",
-        "database": "Postgres",
-        "framework": "reitit",
-        "language": "Clojure",
-        "flavor": "None",
-        "orm": "Raw",
-        "platform": "Undertow",
-        "webserver": "None",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "reitit-reactive",
-        "notes": "",
-        "versus": "Undertow"
-      }
-    },
-    {
-      "async64": {
-        "db_url": "/db",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "Micro",
-        "database": "Postgres",
-        "framework": "reitit",
-        "language": "Clojure",
-        "flavor": "None",
-        "orm": "Raw",
-        "platform": "Undertow",
-        "webserver": "None",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "reitit-reactive",
-        "notes": "",
-        "versus": "Undertow"
-      }
-    },
-    {
-      "async128": {
-        "db_url": "/db",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "Micro",
-        "database": "Postgres",
-        "framework": "reitit",
-        "language": "Clojure",
-        "flavor": "None",
-        "orm": "Raw",
-        "platform": "Undertow",
-        "webserver": "None",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "reitit-reactive",
-        "notes": "",
-        "versus": "Undertow"
-      }
-    },
-    {
-      "async256": {
-        "db_url": "/db",
-        "port": 8080,
-        "approach": "Realistic",
-        "classification": "Micro",
-        "database": "Postgres",
-        "framework": "reitit",
-        "language": "Clojure",
-        "flavor": "None",
-        "orm": "Raw",
-        "platform": "Undertow",
-        "webserver": "None",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "reitit-reactive",
-        "notes": "",
-        "versus": "Undertow"
-      }
+  "tests": [{
+    "default": {
+      "json_url": "/json",
+      "plaintext_url": "/plaintext",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "None",
+      "framework": "None",
+      "language": "Java",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "Undertow",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "reitit",
+      "notes": "",
+      "versus": ""
+    },
+    "jdbc": {
+      "db_url": "/db",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "Postgres",
+      "framework": "None",
+      "language": "Java",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "Undertow",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "reitit-jdbc",
+      "notes": "",
+      "versus": ""
+    },
+    "async": {
+      "db_url": "/db",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "Postgres",
+      "framework": "None",
+      "language": "Java",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "Undertow",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "reitit-async",
+      "notes": "",
+      "versus": ""
     }
     }
-  ]
+  }]
 }
 }

+ 2 - 2
frameworks/Clojure/reitit/project.clj

@@ -1,8 +1,8 @@
 (defproject hello "reitit"
 (defproject hello "reitit"
   :description "pohjavirta, reitit, jsonista & porsas"
   :description "pohjavirta, reitit, jsonista & porsas"
   :dependencies [[org.clojure/clojure "1.10.1"]
   :dependencies [[org.clojure/clojure "1.10.1"]
-                 [metosin/pohjavirta "0.0.1-alpha3"]
-                 [metosin/porsas "0.0.1-alpha12"]
+                 [metosin/pohjavirta "0.0.1-alpha4"]
+                 [metosin/porsas "0.0.1-alpha13"]
                  [metosin/jsonista "0.2.3"]
                  [metosin/jsonista "0.2.3"]
                  [metosin/reitit "0.3.9"]
                  [metosin/reitit "0.3.9"]
                  [hikari-cp "2.8.0"]]
                  [hikari-cp "2.8.0"]]

+ 1 - 1
frameworks/Clojure/reitit/reitit-async128.dockerfile → frameworks/Clojure/reitit/reitit-async.dockerfile

@@ -3,4 +3,4 @@ WORKDIR /reitit
 COPY src src
 COPY src src
 COPY project.clj project.clj
 COPY project.clj project.clj
 RUN lein uberjar
 RUN lein uberjar
-CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dvertx.disableMetrics=true", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-jar", "target/hello-reitit-standalone.jar", "async", "128"]
+CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dvertx.disableMetrics=true", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-XX:+UseStringDeduplication", "-Djava.net.preferIPv4Stack=true", "-jar", "target/hello-reitit-standalone.jar", "async"]

+ 0 - 6
frameworks/Clojure/reitit/reitit-async16.dockerfile

@@ -1,6 +0,0 @@
-FROM clojure:lein-2.8.1
-WORKDIR /reitit
-COPY src src
-COPY project.clj project.clj
-RUN lein uberjar
-CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dvertx.disableMetrics=true", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-jar", "target/hello-reitit-standalone.jar", "async", "16"]

+ 0 - 6
frameworks/Clojure/reitit/reitit-async256.dockerfile

@@ -1,6 +0,0 @@
-FROM clojure:lein-2.8.1
-WORKDIR /reitit
-COPY src src
-COPY project.clj project.clj
-RUN lein uberjar
-CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dvertx.disableMetrics=true", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-jar", "target/hello-reitit-standalone.jar", "async", "256"]

+ 0 - 6
frameworks/Clojure/reitit/reitit-async32.dockerfile

@@ -1,6 +0,0 @@
-FROM clojure:lein-2.8.1
-WORKDIR /reitit
-COPY src src
-COPY project.clj project.clj
-RUN lein uberjar
-CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dvertx.disableMetrics=true", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-jar", "target/hello-reitit-standalone.jar", "async", "32"]

+ 0 - 6
frameworks/Clojure/reitit/reitit-async64.dockerfile

@@ -1,6 +0,0 @@
-FROM clojure:lein-2.8.1
-WORKDIR /reitit
-COPY src src
-COPY project.clj project.clj
-RUN lein uberjar
-CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dvertx.disableMetrics=true", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-jar", "target/hello-reitit-standalone.jar", "async", "64"]

+ 1 - 1
frameworks/Clojure/reitit/reitit-jdbc16.dockerfile → frameworks/Clojure/reitit/reitit-jdbc.dockerfile

@@ -3,4 +3,4 @@ WORKDIR /reitit
 COPY src src
 COPY src src
 COPY project.clj project.clj
 COPY project.clj project.clj
 RUN lein uberjar
 RUN lein uberjar
-CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-jar", "target/hello-reitit-standalone.jar", "sync", "16"]
+CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-XX:+UseStringDeduplication", "-Djava.net.preferIPv4Stack=true", "-jar", "target/hello-reitit-standalone.jar", "sync"]

+ 0 - 6
frameworks/Clojure/reitit/reitit-jdbc128.dockerfile

@@ -1,6 +0,0 @@
-FROM clojure:lein-2.8.1
-WORKDIR /reitit
-COPY src src
-COPY project.clj project.clj
-RUN lein uberjar
-CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-jar", "target/hello-reitit-standalone.jar", "sync", "128"]

+ 0 - 6
frameworks/Clojure/reitit/reitit-jdbc256.dockerfile

@@ -1,6 +0,0 @@
-FROM clojure:lein-2.8.1
-WORKDIR /reitit
-COPY src src
-COPY project.clj project.clj
-RUN lein uberjar
-CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-jar", "target/hello-reitit-standalone.jar", "sync", "256"]

+ 0 - 6
frameworks/Clojure/reitit/reitit-jdbc32.dockerfile

@@ -1,6 +0,0 @@
-FROM clojure:lein-2.8.1
-WORKDIR /reitit
-COPY src src
-COPY project.clj project.clj
-RUN lein uberjar
-CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-jar", "target/hello-reitit-standalone.jar", "sync", "32"]

+ 0 - 6
frameworks/Clojure/reitit/reitit-jdbc64.dockerfile

@@ -1,6 +0,0 @@
-FROM clojure:lein-2.8.1
-WORKDIR /reitit
-COPY src src
-COPY project.clj project.clj
-RUN lein uberjar
-CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-jar", "target/hello-reitit-standalone.jar", "sync", "64"]

+ 0 - 6
frameworks/Clojure/reitit/reitit-reactive.dockerfile

@@ -1,6 +0,0 @@
-FROM clojure:lein-2.8.1
-WORKDIR /reitit
-COPY src src
-COPY project.clj project.clj
-RUN lein uberjar
-CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dvertx.disableMetrics=true", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-jar", "target/hello-reitit-standalone.jar", "async"]

+ 1 - 1
frameworks/Clojure/reitit/reitit.dockerfile

@@ -3,4 +3,4 @@ WORKDIR /reitit
 COPY src src
 COPY src src
 COPY project.clj project.clj
 COPY project.clj project.clj
 RUN lein uberjar
 RUN lein uberjar
-CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dvertx.disableMetrics=true", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-jar", "target/hello-reitit-standalone.jar"]
+CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dvertx.disableMetrics=true", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-XX:+UseStringDeduplication", "-Djava.net.preferIPv4Stack=true", "-jar", "target/hello-reitit-standalone.jar"]

+ 52 - 33
frameworks/Clojure/reitit/src/hello/handler.clj

@@ -1,17 +1,31 @@
 (ns hello.handler
 (ns hello.handler
   (:require [pohjavirta.server :as server]
   (:require [pohjavirta.server :as server]
-            [pohjavirta.async :as a]
+            [pohjavirta.exchange :as exchange]
             [hikari-cp.core :as hikari]
             [hikari-cp.core :as hikari]
             [reitit.ring :as ring]
             [reitit.ring :as ring]
-            [porsas.core :as p]
-            [porsas.async :as pa]
+            [porsas.jdbc :as jdbc]
+            [porsas.async :as async]
             [jsonista.core :as j])
             [jsonista.core :as j])
-  (:import (java.util.concurrent ThreadLocalRandom))
+  (:import (java.util.concurrent ThreadLocalRandom)
+           (java.util.function Supplier)
+           (clojure.lang IDeref))
   (:gen-class))
   (:gen-class))
 
 
+;;
+;; utils
+;;
+
 (defn random []
 (defn random []
   (unchecked-inc (.nextInt (ThreadLocalRandom/current) 10000)))
   (unchecked-inc (.nextInt (ThreadLocalRandom/current) 10000)))
 
 
+(defmacro thread-local [& body]
+  `(let [tl# (ThreadLocal/withInitial (reify Supplier (get [_] ~@body)))]
+     (reify IDeref (deref [_] (.get tl#)))))
+
+;;
+;; handlers
+;;
+
 (defn plain-text-handler [_]
 (defn plain-text-handler [_]
   {:status 200
   {:status 200
    :headers {"Content-Type" "text/plain"}
    :headers {"Content-Type" "text/plain"}
@@ -24,48 +38,53 @@
 
 
 (defn sync-db-handler [mapper pool]
 (defn sync-db-handler [mapper pool]
   (fn [_]
   (fn [_]
-    (let [world (with-open [con (p/get-connection pool)]
-                  (p/query-one mapper con ["SELECT id, randomnumber from WORLD where id=?" (random)]))]
+    (let [world (with-open [con (jdbc/get-connection pool)]
+                  (jdbc/query-one mapper con ["SELECT id, randomnumber from WORLD where id=?" (random)]))]
       {:status 200
       {:status 200
        :headers {"Content-Type" "application/json"}
        :headers {"Content-Type" "application/json"}
        :body (j/write-value-as-bytes world)})))
        :body (j/write-value-as-bytes world)})))
 
 
-(defn async-db-handler [mapper pool]
+(defn async-db-handler [mapper pool-ref]
   (fn [_]
   (fn [_]
-    (-> (pa/query-one mapper pool ["SELECT id, randomnumber from WORLD where id=$1" (random)])
-        (pa/then (fn [world]
-                   {:status 200
-                    :headers {"Content-Type" "application/json"}
-                    :body (j/write-value-as-bytes world)})))))
+    (-> (async/query-one mapper @pool-ref ["SELECT id, randomnumber from WORLD where id=$1" (random)])
+        (async/then (fn [world]
+                      {:status 200
+                       :headers {"Content-Type" "application/json"}
+                       :body (j/write-value-as-bytes world)})))))
+
+;;
+;; server
+;;
 
 
-(defn -main [& [mode ?size]]
+(defn -main [& [mode]]
   (let [cpus (.availableProcessors (Runtime/getRuntime))
   (let [cpus (.availableProcessors (Runtime/getRuntime))
-        size (try (Integer/parseInt ?size) (catch Exception _ (* 2 cpus)))
-        db-handler (cond 
-                     ;; reactive pg-client 
+        db-handler (cond
+                     ;; reactive pg-client in NIO-pool
                      (= mode "async")
                      (= mode "async")
                      (async-db-handler
                      (async-db-handler
-                       (pa/data-mapper {:row (pa/rs->compiled-record)})
-                       (pa/pool
-                         {:uri "postgresql://tfb-database:5432/hello_world"
-                          :user "benchmarkdbuser"
-                          :password "benchmarkdbpass"
-                          :size size}))
-                     ;; jdbc
+                       (async/context {:row (async/rs->compiled-record)})
+                       ;; thread local pool provider
+                       (thread-local
+                         (async/pool
+                           {:uri "postgresql://tfb-database:5432/hello_world"
+                            :user "benchmarkdbuser"
+                            :password "benchmarkdbpass"
+                            :size 1})))
+                     ;; jdbc in worker-pool
                      (= mode "sync")
                      (= mode "sync")
-                     (sync-db-handler
-                       (p/data-mapper {:row (p/rs->compiled-record)})
-                       (hikari/make-datasource
-                         {:jdbc-url "jdbc:postgresql://tfb-database:5432/hello_world"
-                          :username "benchmarkdbuser"
-                          :password "benchmarkdbpass"
-                          :maximum-pool-size size}))
+                     (exchange/dispatch
+                       (sync-db-handler
+                         (jdbc/context {:row (jdbc/rs->compiled-record)})
+                         (hikari/make-datasource
+                           {:jdbc-url "jdbc:postgresql://tfb-database:5432/hello_world"
+                            :username "benchmarkdbuser"
+                            :password "benchmarkdbpass"
+                            :maximum-pool-size (* 8 cpus)})))
                      ;; none
                      ;; none
                      :else (constantly nil))]
                      :else (constantly nil))]
-    (println "Starting" mode "server, with pool-size" size)
     (-> (ring/ring-handler
     (-> (ring/ring-handler
           (ring/router
           (ring/router
-            [["/plaintext" (server/constantly plain-text-handler)]
+            [["/plaintext" (exchange/constantly plain-text-handler)]
              ["/json" json-handler]
              ["/json" json-handler]
              ["/db" db-handler]])
              ["/db" db-handler]])
           (ring/create-default-handler)
           (ring/create-default-handler)
@@ -75,5 +94,5 @@
           {:port 8080
           {:port 8080
            :host "0.0.0.0"
            :host "0.0.0.0"
            :io-threads (* 2 cpus)
            :io-threads (* 2 cpus)
-           :worker-threads 256})
+           :worker-threads (* 8 cpus)})
         (server/start))))
         (server/start))))