Advanced Usage
Asynchronous Concurrency
Lately, the Ruby community has become fascinated by asynchronous and concurrent web servers, the newest of which is called Goliath. This can be advantageous for your application especially if you have a lot of traffic and slow IO or Database calls (like HTTP calls to external APIs) since this substantially increases the number of clients your application can serve per process.
This guide is dedicated to documenting how to achieve non-blocking, asynchronous requests while still using Sinatra and Padrino. For a more detailed guide be sure to checkout the Sinatra Synchrony docs.
Setup
Add the gem to you Gemfile:
# Gemfile
gem "sinatra-synchrony"
And then add the synchrony library to your Padrino application:
# app/app.rb
require 'sinatra/synchrony'
class DemoApp < Padrino::Application
register Sinatra::Synchrony
end
And that is really all you need for the basics. Also, you may want to take a look at Rubinius or JRuby ruby runtimes.
Benchmarks
Added to Gemfile:
# Gemfile
gem "rest-client"
gem "sinatra-synchrony"
gem "faraday"
And the benchmark app:
# app/app.rb
require 'sinatra/synchrony'
require 'rest-client'
require 'faraday'
Faraday.default_adapter = :em_synchrony
class DemoApp < Padrino::Application
register Sinatra::Synchrony
get '/' do
Faraday.get 'http://google.com'
end
end
And results with ab
:
$ ab -c 100 -n 100 http://127.0.0.1:9292/
...
Time taken for tests: 0.256 seconds
For a perspective, this operation took 33 seconds without this extension in thin.
last updated: 2022-02-22
comments powered by Disqus