Clojure
ClojureDay 6

clojure web関連キャッチアップ 2014冬

More than 1 year has passed since last update.

はじめに

広めで薄い内容ですが、お付き合いください。

clojure関連で話題になったWeb関連のライブラリなどを上げていきます。
今後、具体出来な紹介記事を書くかもしれません。

カンファレンス紹介

まずは、今年あった大きなClojrueイベントで発表された資料をまとめてみました。
英語が苦手でも、図入りのスライドなどから雰囲気を読み取ってもらえるといいと思います。

EuroClojure 2014

毎年6月後半ごろに開催されるヨーロッパのオンリーイベント

今年のEuroClojureは実践的な発表がかなり多く、また他のイベントでも同じ発表しているようですので、感想記とスライドをひと通りみてみるといいとおもいます。

感想記

EuroClojure 2014, Krakow
https://gist.github.com/philandstuff/299cda371c7e74b03f18

slides

https://www.google.co.jp/search?q=euroclojure+2014+site:slideshare.net

videos

http://vimeo.com/euroclojure/videos/sort:date/format:detail

一部を紹介

自分が面白いとおもったセッションを紹介します。

Schema & Swagger - making your Clojure web APIs more awesome

http://www.slideshare.net/metosin/euroclojure2014-schema-swagger-making-your-clojure-web-apis-more-awesome

compojureをベースにしたWEB APIを作る話。
入出力の型にPrismaticのSchemaを使うことで、
APIのドキュメントは、Swagger UIを使って自動生成して、実際に叩いて試すことも出来る。

動作しているところに一見の価値があるので、実際に、動かしてみよう。
動作デモ1(ソース)
https://immense-inlet-2435.herokuapp.com/index.html
動作デモ2(ソース)
https://infinite-wave-1738.herokuapp.com/index.html
Github
https://github.com/metosin/compojure-api

Clojure at a post office

http://www.slideshare.net/colinlogaan/clojure-at-a-post-office-36333973

オーストラリア郵政公社のスマホアプリのバックエンドをhttp-kitと非同期APIで構築したはなし。
同時利用者が30万人、秒間5000弱のリクエストのWEB APIサービスが、EC2 C1 Mediumインスタンス(8core/メモリ7GB)で動いている。
設計がCQRS(命令と問い合わせを分けている)なので、APIが非同期になっている。
イベントストアはCassandraを使っている。

Using Clojure for Sentiment Analysis of the Twittersphere

http://www.slideshare.net/garycrawford/using-clojure-for-sentiment-analysis-of-the-twittersphere-euroclojur

tweetを集めて、解析するはなし。
ringサーバでtweetを受信する仕組みと、保存する仕組みと解析する仕組みがある。
LMAX Disrupter経由で非同期にバッファリングして保存している。

Reactive data visualisations with Om

http://www.slideshare.net/annapawlicka/reactive-data-visualisations-with-om

Omを使ったビジュアライゼーションの話。
実際にどんなことをしてるか説明している。

ちなみに、下記のclojure/conjの発表資料には、「avoid pie chart」というスライドがあったり、websocket使う場合、開発環境にchestnutを使う話もある。

Om nom nom nom
http://www.slideshare.net/annapawlicka/om-nom-nom-nom

デモアプリをためしてよう。
デモ http://evening-citadel-3933.herokuapp.com/
github https://github.com/annapawlicka/pumpkin

Strange Loop 2014

毎年9月後半ごろにセントルイスで開催されるイベント。
Alex Millerさんが発起人の明日のソフトウエア技術に関する発表が主。
2日間同時5セッションの発表のうちで1セッション程度clojure関連の発表がある。

今年の発表では、JVMでいかに実装を高速化するかという話やclojureでの、RPC(finagle-clojure)・非同期連携(Onyx)などについての発表があった。
上記のEuroClojure2014の項で取り上げたようなサービスを作りたい人に参考になると思う。

感想記

http://seancorfield.github.io/blog/2014/09/25/the-strange-loop-2014/

slides

https://github.com/strangeloop/StrangeLoop2014/tree/master/slides/sessions

Videos

https://www.youtube.com/channel/UC_QIfHvN9auy2CoOdSfMWDw/videos

Clojure West 2014

3月後半ごろにアメリカ西海岸で行われるclojureオンリーイベント
Clojure/conjと同じくclojure開発コアメンバーが結集しているCognitect主催なので、半年交互に東海岸と西海岸となる。

Videos

https://www.youtube.com/playlist?list=PLZdCLR02grLp__wRg5OTavVj4wefg69hM

Clojure/conj 2014

世界中のclojure開発者を集めるconj
毎年11月後半に行われるclojureのトップカンファレンス
今後もアメリカ東海岸での開催とおもわれる。

Videos

https://www.youtube.com/playlist?list=PLZdCLR02grLoc322bYirANEso3mmzvCiI

ライブラリ紹介

webサーバ

ringを使って、lein ringでjetty上で起動したり、lein ring warなどでservletコンテナファイルを作成できますが、非同期APIを使う場合には、http-kitやalephなどを使うことになります。

12月のベンチマークによると、nginx-clojure、ring-undertow, immutant2, alephなどが特別に速いようです。
https://github.com/ptaoussanis/clojure-web-server-benchmarks

nginx-clojureは、nginxのバックエンドとして動く仕組み。
ring-undertowは、JBoss WildFlyのweb subsystemであるundertowを使ったringモジュール。
immutant2は、JBoss WildFlyベースのClojure向けAPサーバでring-undertowと同じくringベースの起動かwarでWildFlyに配備します。
この後少しimmutant2の紹介を続けます。

immutant2

この春ベータ版が公開され開発が続いてます。
http://immutant.org/news/2014/04/28/getting-started-with-2x/

immutant2を使った場合、WildFlyのと同じく、メッセージング(HornetQ)、キャッシュ(Infinispan)、トランザクション(Narayana)、ジョブスケジュール(Quartz)、ロギングなどJBossアプリケーションの昨日を利用することが出来ますが、webサーバのみ利用できるため、実際に使うかどうかは好みになると思います。

ドキュメントは、cloudbeesのCIサーバ上にあります。
https://projectodd.ci.cloudbees.com/job/immutant2-incremental/lastSuccessfulBuild/artifact/target/apidocs/index.html

webフレームワーク

immutant2のドキュメントでも触れられていますが、Compojure、LuminusCaribouなどが認知されているWebフレームワークです。

Luminus

noirというWebフレームワークがディスコンした後、noirをライブラリ化して再構成したwebフレームワークです。

構成

下記のように、Compojure/Ring、Hiccupに、SelmerというDjangoライクなテンプレート、libnoir、ActiveRecordのKormaという構成になっています。
http://www.luminusweb.net/api

libnoir

中心になるlibnoirは、
lib noirは、cookie、session、io(静的ファイルのレスポンス用)、リクエスト、ヘッダやリダイレクト、コンテンツ形式を扱うレスポンス、バリデーションライブラリのセットです。
http://yogthos.github.io/lib-noir/index.html

Caribou

Caribouは、新しいフルスタック指向のWebフレームワークです。clojureエコシステムでは、あまり受け入れられないことが多いのですがどうなるでしょうか。

http://caribou.github.io/caribou/docs/components.html

Schema & Swagger (Compojure-API)

https://github.com/metosin/compojure-api

EuroClojureのSchema & Swaggerを参考にしてください。
Metosinという会社では、SchemaやSwaggerを使うためのライブラリの他に、HTTPレスポンスなどのライブラリも作っています。

RPC

バックエンドをREST/HTTPを優先で組み立てていても、
すべてのサービスを非同期HTTPで捌き切れない場合の構成として、下記のスライドのような「HTTP - RPC - Resource」の構成を取りたいときにRPCが必要になる。
Finagle-Based Microservices at SoundCloud
http://www.slideshare.net/pcalcado/finaglebased-microservices-at-soundcloud

RPCサービスとして実装が必要になった時は、JVMのReactorやFinagleなどを使うことが多い。

clojure-finagle

https://github.com/finagle/finagle-clojure

サンプルのようにThriftのインターフェイスを定義してやると、clojureで、finagleサーバとクライアントの実装が書ける。

strangeloop 2014で発表があったので、参考にしてほしい。
Highly Concurrent Services with Finagle & Clojure
https://www.youtube.com/watch?v=-woCYVaMBsg

その他

JVMの世界では、アプリケーション内部の非同期メッセージングにLMAX Disruptorを使った実装が増えている。

spirngのチームでも、LMAX Disruptorを使ったReactorという非同期ライブラリにReactive Streamsを実装したという発表をしており開発者も増えている。

clojureでも、stormやstrengeloop 2014で発表のあった分散データプロセッサのOnyx
などに使われている。

おわりに

取り留めもない感じになってしまいましたが、今回はこのへんで。
MQTTや分散処理系の話などもまとめる機会があるといいのですが。

最後まで付き合いいただき有り難うございます。
来週の記事でまたお会いしましょう。