Archive for the ‘nio’ Category
Python, Java NIO => JTornado
Desde o últmimo post parei com Scala. 0.o
Devido a um problema com as versões da linguagem (incompatibilidade binária e mudanças na estratégia de Collections para aumentar a compatibilidade com o Java), muito se especulou sobre a estabilidade da linguagem e muitas discussões acirradas (vejam os tweets entre @jboner e @codemonkeyism. Por este motivo tirei férias de Scala e mergulhei profundamente em Python.
Fui surpreendido com uma linguagem extremamente madura, poderosa e completa. Foi tão apaixonante quanto Scala. Como já desejava construir algo no GAE usando python, não perdi tempo e criei o Twittograph (@twittograph), o que deve ser em breve a nova maneira de pedir autógrafos aos seus ídolos.
Então estudei muito (não só Python): Eventlet, Twisted, Tornado, Linux Epoll, Python Select, Python Fabric, fiz Gists, Avro, Boost e Java NIO, clojure. Devo com certeza ter esquecido algo. Não dá pra comentar de cada um destes ou o post ficaria bastante extenso. Fica a dica: Python, Tornado e Clojure. Usem.
Passei a usar o Python Fabric no dia-a-dia, e usei o Tornado para construir o Twittograph. Como vocês podem perceber eu estava navegando pra todos os lados ao mesmo tempo, e as chances de ficar parado eram grandes, até que @abraaoisvi me alertou que eu deveria focar. Foi então que @rafaelfelini – até então recém apaixonado por python – sugeriu “construir” uma versão do Tornado em Java.
Assim nasce o JTornado. Construído em conjunto com o Rafael. Tá, o nome não é lá essa criatividade. Pensamos em Cyclone, Transtornado, Huracan, etc. Bom, deixa JTornado mesmo.
Se você quer praticidade, precisa conhecer o Tornado, feito pelo Facebook (link acima). Mas se você quer esta mesma praticidade em Java e sabe que Java para Web != Servlet. Conheça o JTornado. O JTornado pode ser visto como um framework web com um servidor de alta performance embutido, ou um servidor de alta performance com um framework web embutido. Este é um direcionamento que ainda vamos discutir.
O próprio @felipejcruz, criador do easy_tornado já se mostrou a favor do foco num framework para aplicações assíncronas de rede, que eventualmente oferece um framework web. Vamos ver!
Logo logo devo postar os percalços enfrentados para usar Java NIO e ao mesmo tempo usar low-level concurrency, leia-se threads. Como foi construir um server baseado em processos (Tornado) utilizando a JVM que nos limita neste aspecto. E muito mais. Devo escrever sobre algumas boas práticas – que acreditamos que sejam boas – para o uso de NIO aliado à alta performance com threads.
Veja algumas discussões no Stackoverflow.com durante este tempo:
- Selector.select(timeout) x Selector.selectNow()
- NIO Best Practices – SelectableChannel and InterestOps
Como não pode faltar código num post, segue uma micro app usando o JTornado, mas escrita em Clojure:
;Starts an JTornado HTTP Server and a sample RequestHandler. ; Bit verbose due to compilation directives. Recommendation is to generate ; a set of macros to hide this. (ns org.ctornadoweb ; Compiled and implements a static main method to start the server (:import (org.jtornadoweb HttpServer) (org.jtornadoweb.Web$Application) (org.jtornadoweb.Web$RequestHandler)) (:gen-class :prefix "server-")) (gen-class :name org.ctornadoweb.MyHandler :extends org.jtornadoweb.Web$RequestHandler :prefix "do-") (defn do-get [this] "Handles the HTTP GET method" (.write "hello clojure")) (defn do-post [this] "Handles the HTTP POST method" (.write (.getArgument "name" "default" false))) (defn server-main [] "main method" (.listen (org.jtornadoweb.HttpServer. (.add (org.jtornadoweb.Web$Application.) "/" org.ctornadoweb.MyHandler) false nil false) 8089)) ;use (compile 'org.ctornadoweb)
Basta fazer um curl http://localhost:8089 e tudo funcionará 🙂
Aguarde o próximopost para informações completas de Java NIO e JTornado. 😉
Update: Desde que a versão Scala 2.8.0 final foi liberada, retomei os estudos e meu interesse pela linguagem continua. A propósito, o único motivo para o JTornado ser construído em Java é ganhar tempo, pois os colaboradores se sentem mais a vontade com Java. Provavelmente algumas funcionalidades podem ser escritas em Scala ou até mesmo Clojure.