2. Clojure Web Development
$ lein new compojure myapp
$ lein ring server
Congratulations, you now have a Clojure
web application listening on port 3000!
6. Setup
$ lein immutant install
Downloading http://repository-projectodd.forge.cloudbees.com/release/org/immutant/immutant-dist/1.0.0/immutant-dist-1.0.0-slim.zip
done!
Extracting /var/folders/jw/p379vgcn62q51q4_95xm1v6m0000gp/T/lein-immutant-8041099c-b2c5-4342-ac81-9e3986dfcbd2/immutant-dist-1.0.0-slim.zip
Extracted /Users/norman/.immutant/releases/immutant-1.0.0-slim
Linking /Users/norman/.immutant/current to /Users/norman/.immutant/releases/immutant-1.0.0-slim
The following versions of Immutant are installed to /Users/norman/.immutant
(* is currently active via /Users/norman/.immutant/current):
* 1.0.0 (type: slim)
7. Setup
$ lein immutant deploy
Deployed myapp to /Users/norman/.immutant/current/jboss/standalone/deployments/myapp.clj
8. Setup
$ lein immutant run
Starting Immutant: /Users/norman/.immutant/current/jboss/bin/standalone.sh
=========================================================================
JBoss Bootstrap Environment
JBOSS_HOME: /Users/norman/.immutant/current/jboss
JAVA: java
JAVA_OPTS: -server -XX:+UseCompressedOops -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -
Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true
=========================================================================
16:13:01,823 INFO [org.jboss.modules] (main) JBoss Modules version 1.2.0.CR1
16:13:02,294 INFO [org.jboss.msc] (main) JBoss MSC version 1.0.4.GA
16:13:02,344 INFO [org.jboss.as] (MSC service thread 1-6) JBAS015899: JBoss AS 7.2.x.slim.incremental.6 "Janus" starting
...
...
...
16:13:12,534 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: JBoss AS 7.2.x.slim.incremental.6 "Janus" started
in 10969ms - Started 128 of 175 services (46 services are passive or on-demand)
9. Setup
$ lein immutant run --clustered
...
...
16:17:44,573 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: JBoss AS 7.2.x.slim.incremental.6 "Janus" started
in 10170ms - Started 130 of 223 services (92 services are passive or on-demand)
12. Housekeeping
$ lein immutant list
The following applications are deployed to /Users/norman/.immutant/current:
blue-app.clj (status: deployed)
red-app.clj (status: deployed)
18. immutant.web
+ works with non-ring apps (eg. Pedestal)
+ control over virtual hosts and context paths
+ can dynamically start/stop endpoints
+ minimal changes to your code, framework agnostic
22. + integrates well with Clojure database things
+ XA transactions are tricky and hard to test
+ Most apps use many non-XA resources
+ database config can be external and shared
immutant.xa
+ All the immutant services are XA
25. immutant.cache
+ Really easy to use
+ Interface isn’t very Clojure-like, needs abstraction
+ Should a data grid be deployed along side app?
+ Infinispan does much more than caching
30. + Also supports CRON-like scheduling syntax
+ Can be used for ad-hoc jobs
+ Not easy to see what jobs are scheduled/running
+ Jobs can be on all nodes or just one
immutant.jobs
34. PI Game Demo
+ EDN api to get state and send actions
+ Game state saved in persistent cache
+ Clojurescript front end, Clojure back end
+
+
+ Player actions are sent to guess queue
Singleton daemon creates one listener per cluster
Demo uses two immutant nodes with nginx in front
35. But...
• Works out of the box
• It’s good Clojure - not “Clojure 2
Enterprise Edition”
• Best solution for multiple applications
• Best solution when you want to work
with Java or Ruby apps
• JBoss is production tested
• Responsive dev team
• Are these the services you
would have chosen?
• It’s one big blob, not lots of
composable blocks
• Does it fit your application
architecture?
• Does it fit your ops strategy?
Yes
36. • App was ring/jetty - using our own custom startup
• Wanted to split our APIs out and modularize app instead of
deploying as a monolithic app
• Wanted to be able to support rolling updates across nodes
• Liked the idea of being able to bring mature clustering, caching
and messaging into the app almost for free
Immutant at Threatgrid
37. • Transition to Immutant was very fast and required only minor
changes to our customized startup code
• We ran into a few small issues, but the Immutant dev team had
almost immediate fixes/workarounds.
• Transitional codebase still supports running outside Immutant,
so we haven’t been able to leverage some features
• Ops team strongly prefers individual services that can be
managed independently - Immutant is one big ball
• Our web nodes and data nodes scale separately - Immutant
seems to prefer a more homogenous deployment
• Immutant a la carte would really hit a sweet spot
And.... we’re still deciding