Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Netty with JRuby (French)

Netty with JRuby (French)

Nicolas Mérouze

February 04, 2013
Tweet

More Decks by Nicolas Mérouze

Other Decks in Programming

Transcript

  1. JRuby ? • Implémentation Ruby sur la JVM • Meilleures

    performances pour une implémentation Ruby
  2. Netty ? • "Netty is an asynchronous event-driven network application

    framework" • Définition similaire à Node.js • Vert.x (Node.js polyglote) utilise Netty
  3. Exploiter la JVM "We can reliably take on Java process

    up to 990K open connections" High performance network programming on the JVM OSCON 2012, Urban Airship
  4. Architecture de Netty • Channels • Pipelines • Handlers •

    Pas de callbacks pour des applications simples
  5. Executors Channel ch = ...; ChannelPipeline p = ch.pipeline(); EventExecutor

    e1 = new DefaultEventExecutor(16); EventExecutor e2 = new DefaultEventExecutor(8); p.addLast(new MyProtocolCodec()); p.addLast(e1, new MyDatabaseAccessingHandler()); p.addLast(e2, new MyHardDiskAccessingHandler());
  6. Handlers ≈ Callbacks DatabaseConnectionHandler == openDbConnection(function() {}) JsonDecoderHandler == JSON.parse('json',

    function() {}) JsonEncoderHandler == JSON.stringify('json', function() {}) FileReadHandler == fs.writeFile('file.txt', 'content', function() {}) FileWriteHandler == fs.readFile('file.txt', function() {})
  7. Handlers Railsisés class UsersController < ActionController::Base before_filter :find_user # ReadDbHandler

    respond_to :json # JsonEncoderHandler def update @user.update_attributes(params[:user]) respond_with @user end # UserUpdateHandler end
  8. Ruby, Rack, Thin run Proc.new { body = 'Hello World!'

    [200, { 'Content-Length' => body.length.to_s }, body] }
  9. Node.js var http = require('http'); http.createServer(function (req, res) { res.writeHead(200,

    { 'Content-Type': 'text/plain' }); res.end('Hello World!'); }).listen(8082);
  10. Node.js, Connect.js var connect = require('connect') , http = require('http');

    var app = connect() .use(function(req, res){ res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello World!\n'); }) .listen(8081);
  11. JRuby, Netty require 'netty' class HelloWorldHandler < Netty::Handler::HttpInbound def message_received(ctx,

    e) res.write_head(200, 'Content-Type' => 'text/plain') res.end('Hello World!') end end Netty::HttpServer.new.add(HelloWorldHandler).listen(1337)
  12. JRuby, Netty, Rack require 'netty' class HelloWorldHandler < Netty::Handler::Rack def

    app ::Rack::Builder.new do run Proc.new { [200, { "Content-Type" => "text/ html" }, "Hello World!"] } end end end Netty::HttpServer.new.add(HelloWorldHandler).listen(8080)
  13. Facile ! Ou pas... • Netty, c’est du Java pour

    Javaistes • Wrapper Ruby obligatoire !
  14. Katamari (մ) • Simplification de Netty écrite en Java •

    Juste la partie HTTP • Bindings pour d’autres langages: Ruby, Javascript, Python... • Différent de Vert.x
  15. Outils • MBA Core i7 (2 cores) 2Ghz, 8GB RAM

    • httperf --num-conns=10 --rate=10 --num- calls=10000
  16. Node.js • Node.js ~14000 req/s • Connect.js ~9500 req/s •

    Node.js/Cluster ~24000 req/s • Connect.js/Cluster ~17000 req/s
  17. Netty • JRuby ~18000 req/s • JRuby/Rack ~11000 req/s •

    Katamari ~50000 req/s • Katamari/JRuby ~40000 req/s
  18. Résumé • Katamari ~50000 req/s • Katamari/JRuby ~40000 req/s •

    Node.js/Cluster ~24000 req/s • Netty/JRuby~18000 req/s • Go ~17000 req/s • Connect.js/Cluster ~17000 req/s • Node.js ~14000 req/s • Netty/JRuby/Rack ~11000 req/s • Connect.js ~9500 req/s • Ruby/Thin ~9500 req/s
  19. Utile • Java est performant • Netty est performant •

    JRuby est lent face à Java. Katamari pour réduire l’écart • Node.js n’est pas si performant que ça
  20. Inutile • N’exploite pas les capacités des frameworks • Thin

    sur un seul core • Benchmarck sur ma machine • Peu de RAM disponible • InvokeDynamic est buggé
  21. Code • Porter les middlewares Rack et Connect.js • Améliorer

    l’API • Possibilité de lier les handlers à des routes
  22. Netty is awesome ! • Asynchrone • Peu de callbacks

    • Threads sans peine • Fonctionne avec l’éco-système existant • Performance