SlideShare a Scribd company logo
1 of 77
Download to read offline
ASYNCHRONOUS AND 

NON-BLOCKING I/O
WITH JRUBY
Joe Kutner
Joe Kutner
@codefinger
"Deploying with JRuby 9k"
"The Healthy Programmer"
SYNCHRONOUS WAIT (BLOCKING)
CLIENT SERVER DATABASE
BLOCKING

WAIT
BLOCKING IS BAD
▸ Each thread consumes resources
▸ Memory, Stack frames
▸ OS context switching
▸ GC has to walk the stack frames
▸ More $$$
ASYCHRONOUS WAIT (NON-BLOCKING)
CLIENT SERVER DATABASE
ASYNC

WAIT
MULTIPLE CLIENTS
CLIENT CLIENT SERVERCLIENT
MULTIPLE BACKING SERVICES
CLIENT SERVER DATABASE REDIS
TEXT
ASYNC IS GOOD
▸ Each request uses fewer resources
▸ Fewer threads
▸ Fewer servers
▸ Less $$$
TEXT
WHO'S DOING ASYNC
▸ Apple
▸ Google
▸ Twitter
▸ Facebook
▸ eBay
NETTY @ APPLE
https://speakerdeck.com/normanmaurer/connectivity
Ratpack
Netty
Sinatra
Rack
~=
Synchronous and Blocking (Sinatra)
REQUEST
REQUEST
REQUEST
REQUEST
REQUEST
EVENT 

LOOP
REQUEST
REQUEST
REQUEST
Asynchronous and Non-blocking (Ratpack)
Events
Event
result
Event

Loop
Event
handler
Event
emitters
PROMISES
promise = Blocking.get do
# execution segment
end

promise.then do |result|
# execution segment
end
PROMISES
promise = Blocking.get do
# execution segment
end
promise.then do |result|
# execution segment
end
EVENT

LOOP
EBAY SEARCH
A SYNTHETIC DEMO
EBAY
Search term(s)
CLIENT
SERVER
(RATPACK)
SYNCHRONOUS EXAMPLE
results = terms.map do |item|
url = rest_url(item)
response = Net ::HTTP.get(url)
JSON.parse(response)["Item"]
end.flatten
render(results)
SYNCHRONOUS WAIT (BLOCKING)
CLIENT SERVER EBAY
BLOCKING

WAIT
ASYNCHRONOUS EXAMPLE
results = []
terms.each do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url).then do |response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
end
Promise.value(results).then { |r| render(r) }
ASYNCHRONOUS EXAMPLE
results = []
terms.each do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url).then do |response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
end
Promise.value(results).then { |r| render(r) }
Promise
ASYNCHRONOUS EXAMPLE
results = []
terms.each do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url).then do |response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
end
Promise.value(results).then { |r| render(r) }
ASYNCHRONOUS EXAMPLE
results = []
terms.each do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url).then do |response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
end
Promise.value(results).then { |r| render(r) }
SYNCHRONOUS WAIT (BLOCKING)
CLIENT SERVER EBAY
ASYNCHRONOUS WAIT (NON-BLOCKING)
CLIENT SERVER EBAY
ASYNC, SERIAL
Events Event
handler
Event
emitters
EVENT 

LOOP
ASYNC, PARALLEL
EVENT 

LOOPEVENT 

LOOP
Events
Event
handler
Event
emitters
EVENT 

LOOPS
promises = terms.map do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url)
end
batch = ParallelBatch.of(promises)
results = Collections.synchronized_list([])
operation = batch.for_each do |i, response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
operation.then { render(results) }
promises = terms.map do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url)
end
batch = ParallelBatch.of(promises)
results = Collections.synchronized_list([])
operation = batch.for_each do |i, response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
operation.then { render(results) }
Promise
promises = terms.map do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url)
end
batch = ParallelBatch.of(promises)
results = Collections.synchronized_list([])
operation = batch.for_each do |i, response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
operation.then { render(results) }
promises = terms.map do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url)
end
batch = ParallelBatch.of(promises)
results = Collections.synchronized_list([])
operation = batch.for_each do |i, response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
operation.then { render(results) }
promises = terms.map do |item|
url = rest_url(item)
http_client = ctx.get(HttpClient.java_class)
http_client.get(url)
end
batch = ParallelBatch.of(promises)
results = Collections.synchronized_list([])
operation = batch.for_each do |i, response|
body = response.get_body.get_text
results << JSON.parse(body)["Item"]
end
operation.then { render(results) }
ASYNCHRONOUS WAIT (NON-BLOCKING)
CLIENT SERVER EBAY
ASYNCHRONOUS WAIT (NON-BLOCKING) AND PARALLEL
CLIENT SERVER EBAY
HOW TO ASSEMBLE A JRUBY + RATPACK APP
Gemfile
source 'https: //rubygems.org'
ruby '2.3.3', engine: 'jruby', engine_version: '9.1.12.0'
gem 'jbundler'
Jarfile
jar 'io.ratpack:ratpack-core', '1.4.6'
jar 'org.slf4j:slf4j-simple', '1.7.25'
INSTALL DEPENDENCIES
$ bundle install
$ jbundle install

...



jbundler runtime classpath:

------------------------

.../ratpack-core-1.4.6.jar

.../netty-common-4.1.6.Final.jar

...



jbundle complete !
lib/server.rb
require 'java'
require 'bundler/setup'
Bundler.require
java_import 'ratpack.server.RatpackServer'
RatpackServer.start do |b|
b.handlers do |chain|
chain.get("async") do |ctx|
# async request handling
end
chain.get("sync") do |ctx|
# sync request handling
end
end
end
RUN THE APP
$ bundle exec ruby lib/server.rb

[main] INFO ratpack.server.RatpackServer - Starting server ...

[main] INFO ratpack.server.RatpackServer - Building registry ...

[main] INFO ratpack.server.RatpackServer - Ratpack started ...
FIND IT ON GITHUB
https://github.com/jkutner/jruby-ratpack-async-demo
BOOKS EXAMPLE
A REAL-WORLD DEMO
BOOKSTORE OR LIBRARY MANAGEMENT APP
DB
HTTP
Local Inventory
isbndb.com
BOOK
Ruby object
RATPACK INTEGRATES WITH JAVA LIBRARIES
▸ RxJava
▸ compose & transform asynchronous operations

▸ Hystrix
▸ fault tolerance
▸ caching
▸ de-duping
▸ batching
Promise Observable~=
MAP(F)
TIMEOUT( )
ZIP
Jarfile
jar 'io.ratpack:ratpack-core', '1.4.6'
jar 'io.ratpack:ratpack-rx', '1.4.6'
jar 'io.ratpack:ratpack-hystrix', '1.4.6'
jar 'org.slf4j:slf4j-simple', '1.7.25'
lib/server.rb
RatpackServer.start do |b|
book_service = BookService.new
b.handlers do |chain|
chain.get do |ctx|
book_service.all(ctx).subscribe do |books|
render_erb(ctx, "index.html.erb", binding)
end
end
lib/server.rb
RatpackServer.start do |b|
book_service = BookService.new
b.handlers do |chain|
chain.get do |ctx|
book_service.all(ctx).subscribe do |books|
render_erb(ctx, "index.html.erb", binding)
end
end
Observable Subscription
lib/server.rb
RatpackServer.start do |b|
book_service = BookService.new
b.handlers do |chain|
chain.get do |ctx|
book_service.all(ctx).subscribe do |books|
render_erb(ctx, "index.html.erb", binding)
end
end
lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
Observable
lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end Observable
lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
Observable
lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
Observable
lib/book_service.rb
class BookService
def initialize
@db = BookDbCommands.new
@isbn_db = IsbnDbCommands.new
end
def all(ctx)
@db.all.flat_map do |row|
@isbn_db.get_book(ctx, row[:isbn]).map do |json|
row.merge(JSON.parse(json))
end
end.to_list
end
Observable
OBSERVABLES
▸ all: 

Observable that will emit items
▸ flat_map: 

Applies a function to each item, and returns an Observable
that emits items
▸ to_list: 

Returns an Observable that emits an Array of items
▸ subscribe: 

Returns a Subscription to the Observable
operation
OBSERVABLE
operation
OBSERVABLE
subsribe
OBSERVABLE
SUBSCRIPTION
lib/book_db_commands.rb
class BookDbCommands
def all(ctx)
s = HystrixObservableCommand ::Setter.
with_group_key(GROUP_KEY).
and_command_key(HystrixCommandKey ::Factory.as_key("getAll"))
Class.new(HystrixObservableCommand) do
def construct
RxRatpack.observe_each(Blocking.get {
DB["select isbn, quantity, price from books order by isbn"].all
})
end
def get_cache_key
"db-bookdb-all"
end
end.new(s).to_observable
end
lib/book_db_commands.rb
class BookDbCommands
def all(ctx)
s = HystrixObservableCommand ::Setter.
with_group_key(GROUP_KEY).
and_command_key(HystrixCommandKey ::Factory.as_key("getAll"))
Class.new(HystrixObservableCommand) do
def construct
RxRatpack.observe_each(Blocking.get {
DB["select isbn, quantity, price from books order by isbn"].all
})
end
def get_cache_key
"db-bookdb-all"
end
end.new(s).to_observable
end
lib/book_db_commands.rb
class BookDbCommands
def all(ctx)
s = HystrixObservableCommand ::Setter.
with_group_key(GROUP_KEY).
and_command_key(HystrixCommandKey ::Factory.as_key("getAll"))
Class.new(HystrixObservableCommand) do
def construct
RxRatpack.observe_each(Blocking.get {
DB["select isbn, quantity, price from books order by isbn"].all
})
end
def get_cache_key
"db-bookdb-all"
end
end.new(s).to_observable
end
lib/book_db_commands.rb
class BookDbCommands
def all(ctx)
s = HystrixObservableCommand ::Setter.
with_group_key(GROUP_KEY).
and_command_key(HystrixCommandKey ::Factory.as_key("getAll"))
Class.new(HystrixObservableCommand) do
def construct
RxRatpack.observe_each(Blocking.get {
DB["select isbn, quantity, price from books order by isbn"].all
})
end
def get_cache_key
"db-bookdb-all"
end
end.new(s).to_observable
end
FIND IT ON GITHUB
https://github.com/jkutner/jruby-ratpack-books-example
IN RUBY…
WAYS TO DO ASYNC
▸ Netty (via Ratpack)
▸ Servlet 3.1 Async (via Warbler)
▸ Vert.x
▸ EventMachine
TEXT
EVENTMACHINE
▸ Difficult to avoid callback hell
▸ Not integrated into your web framework
TEXT
WHY NOT ASYC?
▸ Bottleneck is often the DB
▸ Async is hard
▸ Non-deterministic
▸ Callback hell
▸ Error handling/propagation
LINKS
▸ http://jruby.org
▸ https://ratpack.io
▸ https://netty.io
▸ http://reactivex.io
▸ https://github.com/jkutner/jruby-ratpack-async-demo
▸ https://github.com/jkutner/jruby-ratpack-books-example
JOE KUTNER

@codefinger
THANKS!

More Related Content

What's hot

Developing Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containersDeveloping Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containersClaus Ibsen
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기NAVER D2
 
[오픈소스컨설팅] EFK Stack 소개와 설치 방법
[오픈소스컨설팅] EFK Stack 소개와 설치 방법[오픈소스컨설팅] EFK Stack 소개와 설치 방법
[오픈소스컨설팅] EFK Stack 소개와 설치 방법Open Source Consulting
 
Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...
Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...
Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...Shirshanka Das
 
Apache Camel in the belly of the Docker whale
Apache Camel in the belly of the Docker whaleApache Camel in the belly of the Docker whale
Apache Camel in the belly of the Docker whaleHenryk Konsek
 
Building GUI App with Electron and Lisp
Building GUI App with Electron and LispBuilding GUI App with Electron and Lisp
Building GUI App with Electron and Lispfukamachi
 
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...confluent
 
ApacheCon EU 2016 - Apache Camel the integration library
ApacheCon EU 2016 - Apache Camel the integration libraryApacheCon EU 2016 - Apache Camel the integration library
ApacheCon EU 2016 - Apache Camel the integration libraryClaus Ibsen
 
DjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling DisqusDjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling Disquszeeg
 
Presto in Treasure Data (presented at db tech showcase Sapporo 2015)
Presto in Treasure Data (presented at db tech showcase Sapporo 2015)Presto in Treasure Data (presented at db tech showcase Sapporo 2015)
Presto in Treasure Data (presented at db tech showcase Sapporo 2015)Mitsunori Komatsu
 
Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013
Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013
Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013Marcus Barczak
 
How to improve ELK log pipeline performance
How to improve ELK log pipeline performanceHow to improve ELK log pipeline performance
How to improve ELK log pipeline performanceSteven Shim
 
Empowering developers to deploy their own data stores
Empowering developers to deploy their own data storesEmpowering developers to deploy their own data stores
Empowering developers to deploy their own data storesTomas Doran
 
Developing Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containersDeveloping Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containersClaus Ibsen
 
Data Processing and Ruby in the World
Data Processing and Ruby in the WorldData Processing and Ruby in the World
Data Processing and Ruby in the WorldSATOSHI TAGOMORI
 
Openstack study-nova-02
Openstack study-nova-02Openstack study-nova-02
Openstack study-nova-02Jinho Shin
 
Troubleshooting RabbitMQ and services that use it
Troubleshooting RabbitMQ and services that use itTroubleshooting RabbitMQ and services that use it
Troubleshooting RabbitMQ and services that use itMichael Klishin
 
Writing a fast HTTP parser
Writing a fast HTTP parserWriting a fast HTTP parser
Writing a fast HTTP parserfukamachi
 

What's hot (20)

Developing Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containersDeveloping Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containers
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기
 
[오픈소스컨설팅] EFK Stack 소개와 설치 방법
[오픈소스컨설팅] EFK Stack 소개와 설치 방법[오픈소스컨설팅] EFK Stack 소개와 설치 방법
[오픈소스컨설팅] EFK Stack 소개와 설치 방법
 
Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...
Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...
Apache Gobblin: Bridging Batch and Streaming Data Integration. Big Data Meetu...
 
Apache Camel in the belly of the Docker whale
Apache Camel in the belly of the Docker whaleApache Camel in the belly of the Docker whale
Apache Camel in the belly of the Docker whale
 
Building GUI App with Electron and Lisp
Building GUI App with Electron and LispBuilding GUI App with Electron and Lisp
Building GUI App with Electron and Lisp
 
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...
Kafka Summit SF 2017 - One Day, One Data Hub, 100 Billion Messages: Kafka at ...
 
ApacheCon EU 2016 - Apache Camel the integration library
ApacheCon EU 2016 - Apache Camel the integration libraryApacheCon EU 2016 - Apache Camel the integration library
ApacheCon EU 2016 - Apache Camel the integration library
 
DjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling DisqusDjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling Disqus
 
Presto in Treasure Data (presented at db tech showcase Sapporo 2015)
Presto in Treasure Data (presented at db tech showcase Sapporo 2015)Presto in Treasure Data (presented at db tech showcase Sapporo 2015)
Presto in Treasure Data (presented at db tech showcase Sapporo 2015)
 
Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013
Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013
Integrating multiple CDN providers at Etsy - Velocity Europe (London) 2013
 
How to improve ELK log pipeline performance
How to improve ELK log pipeline performanceHow to improve ELK log pipeline performance
How to improve ELK log pipeline performance
 
Empowering developers to deploy their own data stores
Empowering developers to deploy their own data storesEmpowering developers to deploy their own data stores
Empowering developers to deploy their own data stores
 
Developing Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containersDeveloping Java based microservices ready for the world of containers
Developing Java based microservices ready for the world of containers
 
Data Processing and Ruby in the World
Data Processing and Ruby in the WorldData Processing and Ruby in the World
Data Processing and Ruby in the World
 
Openstack study-nova-02
Openstack study-nova-02Openstack study-nova-02
Openstack study-nova-02
 
Troubleshooting RabbitMQ and services that use it
Troubleshooting RabbitMQ and services that use itTroubleshooting RabbitMQ and services that use it
Troubleshooting RabbitMQ and services that use it
 
Scripting Embulk Plugins
Scripting Embulk PluginsScripting Embulk Plugins
Scripting Embulk Plugins
 
Writing a fast HTTP parser
Writing a fast HTTP parserWriting a fast HTTP parser
Writing a fast HTTP parser
 
Docker.io
Docker.ioDocker.io
Docker.io
 

Similar to Async and Non-blocking IO w/ JRuby

Torquebox OSCON Java 2011
Torquebox OSCON Java 2011Torquebox OSCON Java 2011
Torquebox OSCON Java 2011tobiascrawley
 
Complex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBoxComplex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBoxbobmcwhirter
 
OSGi ecosystems compared on Apache Karaf - Christian Schneider
OSGi ecosystems compared on Apache Karaf - Christian SchneiderOSGi ecosystems compared on Apache Karaf - Christian Schneider
OSGi ecosystems compared on Apache Karaf - Christian Schneidermfrancis
 
Avoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.jsAvoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.jscacois
 
Concurrency at the Database Layer
Concurrency at the Database Layer Concurrency at the Database Layer
Concurrency at the Database Layer mcwilson1
 
Building Go Web Apps
Building Go Web AppsBuilding Go Web Apps
Building Go Web AppsMark
 
Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...
Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...
Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...NETWAYS
 
Php assíncrono com_react_php
Php assíncrono com_react_phpPhp assíncrono com_react_php
Php assíncrono com_react_phpRenato Lucena
 
HTTPBuilder NG: Back From The Dead
HTTPBuilder NG: Back From The DeadHTTPBuilder NG: Back From The Dead
HTTPBuilder NG: Back From The Deadnoamt
 
Intro to Asynchronous Javascript
Intro to Asynchronous JavascriptIntro to Asynchronous Javascript
Intro to Asynchronous JavascriptGarrett Welson
 
Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java Baruch Sadogursky
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applicationsTom Croucher
 
Spring data iii
Spring data iiiSpring data iii
Spring data iii명철 강
 
Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Tino Isnich
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slidesharetomcopeland
 

Similar to Async and Non-blocking IO w/ JRuby (20)

Torquebox OSCON Java 2011
Torquebox OSCON Java 2011Torquebox OSCON Java 2011
Torquebox OSCON Java 2011
 
Complex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBoxComplex Made Simple: Sleep Better with TorqueBox
Complex Made Simple: Sleep Better with TorqueBox
 
OSGi ecosystems compared on Apache Karaf - Christian Schneider
OSGi ecosystems compared on Apache Karaf - Christian SchneiderOSGi ecosystems compared on Apache Karaf - Christian Schneider
OSGi ecosystems compared on Apache Karaf - Christian Schneider
 
Avoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.jsAvoiding Callback Hell with Async.js
Avoiding Callback Hell with Async.js
 
Concurrency at the Database Layer
Concurrency at the Database Layer Concurrency at the Database Layer
Concurrency at the Database Layer
 
Building Go Web Apps
Building Go Web AppsBuilding Go Web Apps
Building Go Web Apps
 
Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...
Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...
Open Source Backup Conference 2014: Migration from bacula to bareos, by Danie...
 
Php assíncrono com_react_php
Php assíncrono com_react_phpPhp assíncrono com_react_php
Php assíncrono com_react_php
 
London HUG 12/4
London HUG 12/4London HUG 12/4
London HUG 12/4
 
HTTPBuilder NG: Back From The Dead
HTTPBuilder NG: Back From The DeadHTTPBuilder NG: Back From The Dead
HTTPBuilder NG: Back From The Dead
 
Intro to Asynchronous Javascript
Intro to Asynchronous JavascriptIntro to Asynchronous Javascript
Intro to Asynchronous Javascript
 
RxSwift to Combine
RxSwift to CombineRxSwift to Combine
RxSwift to Combine
 
Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java Everything you wanted to know about writing async, concurrent http apps in java
Everything you wanted to know about writing async, concurrent http apps in java
 
JS everywhere 2011
JS everywhere 2011JS everywhere 2011
JS everywhere 2011
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
 
Spring data iii
Spring data iiiSpring data iii
Spring data iii
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshare
 
Riak with Rails
Riak with RailsRiak with Rails
Riak with Rails
 

More from Joe Kutner

Fantastic Buildpacks and Where to Find Them
Fantastic Buildpacks and Where to Find ThemFantastic Buildpacks and Where to Find Them
Fantastic Buildpacks and Where to Find ThemJoe Kutner
 
2019 Texas Star Party
2019 Texas Star Party2019 Texas Star Party
2019 Texas Star PartyJoe Kutner
 
10 Mistakes Hackers Want You to Make
10 Mistakes Hackers Want You to Make10 Mistakes Hackers Want You to Make
10 Mistakes Hackers Want You to MakeJoe Kutner
 
NASA Space Apps Expo
NASA Space Apps ExpoNASA Space Apps Expo
NASA Space Apps ExpoJoe Kutner
 
NASA Space Apps
NASA Space AppsNASA Space Apps
NASA Space AppsJoe Kutner
 
Why Heroku Loves JHipster
Why Heroku Loves JHipsterWhy Heroku Loves JHipster
Why Heroku Loves JHipsterJoe Kutner
 
What the Struts?
What the Struts?What the Struts?
What the Struts?Joe Kutner
 
Deploying JHipster Microservices
Deploying JHipster MicroservicesDeploying JHipster Microservices
Deploying JHipster MicroservicesJoe Kutner
 
Measuring doubles with 8&quot; neaf copy
Measuring doubles with 8&quot; neaf copyMeasuring doubles with 8&quot; neaf copy
Measuring doubles with 8&quot; neaf copyJoe Kutner
 
4 JVM Web Frameworks
4 JVM Web Frameworks4 JVM Web Frameworks
4 JVM Web FrameworksJoe Kutner
 
JavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor AppJavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor AppJoe Kutner
 
12-factor-jruby
12-factor-jruby12-factor-jruby
12-factor-jrubyJoe Kutner
 
12 Factor Scala
12 Factor Scala12 Factor Scala
12 Factor ScalaJoe Kutner
 
Programming JVM Bytecode with Jitescript
Programming JVM Bytecode with JitescriptProgramming JVM Bytecode with Jitescript
Programming JVM Bytecode with JitescriptJoe Kutner
 
Programming JVM Bytecode
Programming JVM BytecodeProgramming JVM Bytecode
Programming JVM BytecodeJoe Kutner
 
12 Factor App: Best Practices for JVM Deployment
12 Factor App: Best Practices for JVM Deployment12 Factor App: Best Practices for JVM Deployment
12 Factor App: Best Practices for JVM DeploymentJoe Kutner
 
Creating Scalable JVM/Java Apps on Heroku
Creating Scalable JVM/Java Apps on HerokuCreating Scalable JVM/Java Apps on Heroku
Creating Scalable JVM/Java Apps on HerokuJoe Kutner
 
DevLink: Healthy Programmer
DevLink: Healthy ProgrammerDevLink: Healthy Programmer
DevLink: Healthy ProgrammerJoe Kutner
 

More from Joe Kutner (20)

Fantastic Buildpacks and Where to Find Them
Fantastic Buildpacks and Where to Find ThemFantastic Buildpacks and Where to Find Them
Fantastic Buildpacks and Where to Find Them
 
2019 Texas Star Party
2019 Texas Star Party2019 Texas Star Party
2019 Texas Star Party
 
10 Mistakes Hackers Want You to Make
10 Mistakes Hackers Want You to Make10 Mistakes Hackers Want You to Make
10 Mistakes Hackers Want You to Make
 
NASA Space Apps Expo
NASA Space Apps ExpoNASA Space Apps Expo
NASA Space Apps Expo
 
NASA Space Apps
NASA Space AppsNASA Space Apps
NASA Space Apps
 
Why Heroku Loves JHipster
Why Heroku Loves JHipsterWhy Heroku Loves JHipster
Why Heroku Loves JHipster
 
What the Struts?
What the Struts?What the Struts?
What the Struts?
 
Deploying JHipster Microservices
Deploying JHipster MicroservicesDeploying JHipster Microservices
Deploying JHipster Microservices
 
Measuring doubles with 8&quot; neaf copy
Measuring doubles with 8&quot; neaf copyMeasuring doubles with 8&quot; neaf copy
Measuring doubles with 8&quot; neaf copy
 
4 JVM Web Frameworks
4 JVM Web Frameworks4 JVM Web Frameworks
4 JVM Web Frameworks
 
JavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor AppJavaOne 2015: 12 Factor App
JavaOne 2015: 12 Factor App
 
12-factor-jruby
12-factor-jruby12-factor-jruby
12-factor-jruby
 
Java 20
Java 20Java 20
Java 20
 
12 Factor Scala
12 Factor Scala12 Factor Scala
12 Factor Scala
 
Programming JVM Bytecode with Jitescript
Programming JVM Bytecode with JitescriptProgramming JVM Bytecode with Jitescript
Programming JVM Bytecode with Jitescript
 
jdays 2015
jdays 2015jdays 2015
jdays 2015
 
Programming JVM Bytecode
Programming JVM BytecodeProgramming JVM Bytecode
Programming JVM Bytecode
 
12 Factor App: Best Practices for JVM Deployment
12 Factor App: Best Practices for JVM Deployment12 Factor App: Best Practices for JVM Deployment
12 Factor App: Best Practices for JVM Deployment
 
Creating Scalable JVM/Java Apps on Heroku
Creating Scalable JVM/Java Apps on HerokuCreating Scalable JVM/Java Apps on Heroku
Creating Scalable JVM/Java Apps on Heroku
 
DevLink: Healthy Programmer
DevLink: Healthy ProgrammerDevLink: Healthy Programmer
DevLink: Healthy Programmer
 

Recently uploaded

Event-Driven Architecture Masterclass: Challenges in Stream Processing
Event-Driven Architecture Masterclass: Challenges in Stream ProcessingEvent-Driven Architecture Masterclass: Challenges in Stream Processing
Event-Driven Architecture Masterclass: Challenges in Stream ProcessingScyllaDB
 
Frisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdf
Frisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdfFrisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdf
Frisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdfAnubhavMangla3
 
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider  Progress from Awareness to Implementation.pptxTales from a Passkey Provider  Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider Progress from Awareness to Implementation.pptxFIDO Alliance
 
1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT
1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT
1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPTiSEO AI
 
ChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps ProductivityChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps ProductivityVictorSzoltysek
 
Syngulon - Selection technology May 2024.pdf
Syngulon - Selection technology May 2024.pdfSyngulon - Selection technology May 2024.pdf
Syngulon - Selection technology May 2024.pdfSyngulon
 
Intro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptxIntro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptxFIDO Alliance
 
Working together SRE & Platform Engineering
Working together SRE & Platform EngineeringWorking together SRE & Platform Engineering
Working together SRE & Platform EngineeringMarcus Vechiato
 
Long journey of Ruby Standard library at RubyKaigi 2024
Long journey of Ruby Standard library at RubyKaigi 2024Long journey of Ruby Standard library at RubyKaigi 2024
Long journey of Ruby Standard library at RubyKaigi 2024Hiroshi SHIBATA
 
(Explainable) Data-Centric AI: what are you explaininhg, and to whom?
(Explainable) Data-Centric AI: what are you explaininhg, and to whom?(Explainable) Data-Centric AI: what are you explaininhg, and to whom?
(Explainable) Data-Centric AI: what are you explaininhg, and to whom?Paolo Missier
 
UiPath manufacturing technology benefits and AI overview
UiPath manufacturing technology benefits and AI overviewUiPath manufacturing technology benefits and AI overview
UiPath manufacturing technology benefits and AI overviewDianaGray10
 
The Metaverse: Are We There Yet?
The  Metaverse:    Are   We  There  Yet?The  Metaverse:    Are   We  There  Yet?
The Metaverse: Are We There Yet?Mark Billinghurst
 
Introduction to FIDO Authentication and Passkeys.pptx
Introduction to FIDO Authentication and Passkeys.pptxIntroduction to FIDO Authentication and Passkeys.pptx
Introduction to FIDO Authentication and Passkeys.pptxFIDO Alliance
 
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...panagenda
 
How to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cfHow to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cfdanishmna97
 
ERP Contender Series: Acumatica vs. Sage Intacct
ERP Contender Series: Acumatica vs. Sage IntacctERP Contender Series: Acumatica vs. Sage Intacct
ERP Contender Series: Acumatica vs. Sage IntacctBrainSell Technologies
 
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...marcuskenyatta275
 
Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...
Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...
Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...ScyllaDB
 
State of the Smart Building Startup Landscape 2024!
State of the Smart Building Startup Landscape 2024!State of the Smart Building Startup Landscape 2024!
State of the Smart Building Startup Landscape 2024!Memoori
 

Recently uploaded (20)

Event-Driven Architecture Masterclass: Challenges in Stream Processing
Event-Driven Architecture Masterclass: Challenges in Stream ProcessingEvent-Driven Architecture Masterclass: Challenges in Stream Processing
Event-Driven Architecture Masterclass: Challenges in Stream Processing
 
Frisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdf
Frisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdfFrisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdf
Frisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdf
 
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider  Progress from Awareness to Implementation.pptxTales from a Passkey Provider  Progress from Awareness to Implementation.pptx
Tales from a Passkey Provider Progress from Awareness to Implementation.pptx
 
1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT
1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT
1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT
 
ChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps ProductivityChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps Productivity
 
Syngulon - Selection technology May 2024.pdf
Syngulon - Selection technology May 2024.pdfSyngulon - Selection technology May 2024.pdf
Syngulon - Selection technology May 2024.pdf
 
Intro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptxIntro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptx
 
Working together SRE & Platform Engineering
Working together SRE & Platform EngineeringWorking together SRE & Platform Engineering
Working together SRE & Platform Engineering
 
Long journey of Ruby Standard library at RubyKaigi 2024
Long journey of Ruby Standard library at RubyKaigi 2024Long journey of Ruby Standard library at RubyKaigi 2024
Long journey of Ruby Standard library at RubyKaigi 2024
 
(Explainable) Data-Centric AI: what are you explaininhg, and to whom?
(Explainable) Data-Centric AI: what are you explaininhg, and to whom?(Explainable) Data-Centric AI: what are you explaininhg, and to whom?
(Explainable) Data-Centric AI: what are you explaininhg, and to whom?
 
UiPath manufacturing technology benefits and AI overview
UiPath manufacturing technology benefits and AI overviewUiPath manufacturing technology benefits and AI overview
UiPath manufacturing technology benefits and AI overview
 
Overview of Hyperledger Foundation
Overview of Hyperledger FoundationOverview of Hyperledger Foundation
Overview of Hyperledger Foundation
 
The Metaverse: Are We There Yet?
The  Metaverse:    Are   We  There  Yet?The  Metaverse:    Are   We  There  Yet?
The Metaverse: Are We There Yet?
 
Introduction to FIDO Authentication and Passkeys.pptx
Introduction to FIDO Authentication and Passkeys.pptxIntroduction to FIDO Authentication and Passkeys.pptx
Introduction to FIDO Authentication and Passkeys.pptx
 
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
 
How to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cfHow to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cf
 
ERP Contender Series: Acumatica vs. Sage Intacct
ERP Contender Series: Acumatica vs. Sage IntacctERP Contender Series: Acumatica vs. Sage Intacct
ERP Contender Series: Acumatica vs. Sage Intacct
 
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
 
Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...
Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...
Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...
 
State of the Smart Building Startup Landscape 2024!
State of the Smart Building Startup Landscape 2024!State of the Smart Building Startup Landscape 2024!
State of the Smart Building Startup Landscape 2024!
 

Async and Non-blocking IO w/ JRuby