clojure web development

13

Click here to load reader

Upload: hong-jiang

Post on 14-Jun-2015

3.322 views

Category:

Technology


2 download

DESCRIPTION

Slides for a talk given at the first China Clojure Users meeting.

TRANSCRIPT

Page 1: Clojure Web Development

Clojure Web Development

OnyCloud江宏

Page 2: Clojure Web Development

Example - Trakrhttps://trakrapp.com/

Web-based project management system

A product created for our own needs

Requirements

Feature-complete for software devs

Modern friendly UI

Affordable

Page 3: Clojure Web Development

Demo

Page 4: Clojure Web Development

Architecture

JavaScriptApp

(Backbone.js)

HTTP Server

(Clojure)

MongoDB(Log & Cache)

PostgresQL

JSON

Page 5: Clojure Web Development

HTTP Server Structure

Ring Middleware Handlers

The Compojure Framework

Page 6: Clojure Web Development

Routes

Mapping: Request -> Handler:

(defroutes app-routes (context "/users" [] (GET "/new" [] accounts/show-signup) (POST "/" [email] (accounts/new email)))

;; GET /users/new -> accounts/show-signup;; POST /users/ -> accounts/new

Page 7: Clojure Web Development

Handlers

Request in, response out.

(defn say-hello [req] (let [name (-> req :params :name)] {:status 200 :body (str “Hello ” name “!”)}

Page 8: Clojure Web Development

Middleware

Transform: Handler -> New Handler

(defn wrap-failsafe [handler] (fn [request] (try (handler request) (catch Exception e (.printStackTrace e) {:status 500 :body "An error occured."}))))

Page 9: Clojure Web Development

Testing

Unit testing with clojure.test and clojure.contrib.mock

Integration testing using Watir

Demo

Page 10: Clojure Web Development

Performance

No optimization tricks (type hints, transients, etc.)

Average latency ~ 70ms

Long tail

Database performance can be improved (indices).

Page 11: Clojure Web Development

Lessons Learned

Good:

High productivity

Easy to test (dynamic binding)

Relatively easy learning curve

Page 12: Clojure Web Development

Lessons Learned

Bad:

Ugly stacktraces.

Exposes too much Java class hierarchy.

PersistentMap, PersistentStructMap, struct_map ...

(contains? (transient #{:a}) :a)

Page 13: Clojure Web Development

Thank You