lundi 3 octobre 2011

Sinatra 1.3.0 is out ! and it streams


Bonjour tout le monde,


Pour ce mois d'Octobre la communauté Ruby nous fera beaucoup de beaux cadeaux ! Et ça a déjà commencé avec l'équipe Sinatra qui fait une "double" release : en sortant deux versions de sinatra : 1.2.7 et la 1.3.0.

Les nouveautés !

I - Sinatra-contrib

Sinatra a un très grand nombre d'extensions ( plugins ) et certaines ( tels que sinatra-content-for et sinatra-reloader) sont très utilisées. Ce qui a poussé l'équipe Sinatra à décider de les incorporer dans le "core" de sinatra et en faire un "third party component". Et de ce fait nous avons une grande partie des helpers de Rails disponibles et qui fonctionnent de la même maniére. YOUPI !!!

II - "Sinatra recipes"

Zachary Scott a (enfin) lancé son projet "Recipes". C'est en effet un ensemble de techniques, d'astuces et d'applications réalisées par les amoureux de Sinatra.

III - Streaming 

La version "vanilla" ressemble à ça : 


get '/' do
  stream do |out|
    out << "Ce sera vraiment ... -\n"
    sleep 0.5
    out << " (vous attendez toujours ? :)) \n"
    sleep 1
    out << "- SUPER !\n"
  end
end


La chose la plus cool dans cette abstraction est que cette fonctionnalité (streaming) n'est pas spécifique à un serveur Rack particulier ! Et oui ça marche partout ! Que votre serveur soit du type "evented" ( Ebb, Rainbows, thin) ou "sequential" (Unicorn, Mogrel ou passenger).
Pour le moment le seul serveur à ne pas utiliser est WEBrick! Et ne me demandez pas pourquoi :)


Un truc super intéressant : si vous utilisez un serveur "evented" ( thin par exemple ) vous pourrez garder la connexion active et avoir facilement un "messaging service" et de facto votre applicatoin devient plus rapide.


set :server, :thin
connections = []

get '/' do
  # garder la connexion active
  stream(:keep_open) { |out| connections << out }
end

post '/' do
  # Envoyer un message à tous les canaux (connexions) ouverts 
  connections.each { |out| out << params[:message] << "\n" }
  "message envoyé "
end


NB : Tout cela est fait sans l'utilisation des "Fibers". Ce qui permet d'éviter de saturer la stack.


Il est à noter aussi que l'ajout du PATCH HTTP permettra d'accéler certains requêtes ( mise à jour surtout). Merci à l'équipe GitHub.


patch '/' do
  # ... modifier une ressource devient facile, rapide et toujours secure
end


Les tests sont toujours les mêmes :)


Bonne semaine !



Aucun commentaire:

Enregistrer un commentaire