Rails kann alles vieles. Und, zu den vielen Sachen die es kann, gehört auch das Ausliefern von Dateien. Diese Problematik erledigt das Framework in der Regel zwar ganz gut, aber sobald die Größe der Dateien zunimmt kann es mitunter zu merkwürdigem Fehlverhalten und Downloadfehlern kommen.

Eine Ursache dafür ist Rubys Gargabe Collector. Da Rails die Dateien, bevor es sie ausliefert, in den Speicher lädt, greift er ganz gerne mal dazwischen und sorgt für Unruhe im Speicherwald. Es scheint mir allerdings generell recht fragwürdig 100 Mb in den Speicher zu laden. Es muss also eine andere Lösung her.

Im Normalfall besteht ein Railsstack aus mehreren Mongrel Instanzen und einem lokalen Proxy der die Anfragen auf diese Instanzen verteilt. Sind mehrere App Server im Einsatz wird noch ein weiterer Proxy/Loadbalancer benötigt, der die Requests auf die einzelnen Server verteilt. Es bietet sich also an, die Dateien direkt durch den jeweiligen lokalen Proxy (i.R. Nginx, Lighty, Pound oder Apache) ausliefern zu lassen.

Um das zu erreichen, lassen wir Rails anstatt der eigentlichen Datei einen modifizierten, internen Header in die Antwort zum Client einsetzen. Diese wird vom Proxy erkannt und veranlasst ihn dann eine Datei aus einem definierten Ort zu verschicken. Dieser interne Header wird in der Regel vom Proxy aus den Headern entfernt, bevor die Antwort an den externen Client weitergereicht wird.

Am Beispiel Nginx könnte der Code dafür so aussehen:

1
2
3
4
5
6
7
8
9
10

case RAILS_ENV
when 'production'
  response.headers['X-Accel-Redirect'] = "/protected/" + File.basename(file.path)
  response.headers['Content-Disposition'] = "attachment; filename=file.tar"
  render :nothing => true
else
  # Directly send in development env
  send_data(file.read, :filename => File.basename(file.path))
end

 

Die Konfiguration des Nginx ist recht einfach:

1
2
3
4
5

location /protected/ {
  internal;
  alias /path/to/file/directory/;
}

 

In ‘Multi-Server’ Umgebungen sollte man darauf achten, dass Downloads nicht durch den First-Proxy geleitet werden, sondern direkt auf den jeweiligen App-Server. So lässt es sich vermeiden, dass der Loadbalancer die längeren Anfragen/Antworten als Timeouts deutet und die Verbindung kappt.

Neu: Hoe 1.3.0

15. August 2007

Hoe ist eine Sammlung von Tools zur Unterstützung von Ruby Projekten. Es generiert alle grundlegenden Rake Tasks die in den verschiedenen Projektzyklen benötigt werden: RDoc, Testing, Verpacken und Veröffentlichen.

Mehr Informationen

Zugegeben, die Überschrift klingt ein wenig merkwürdig. Dennoch hat sie eine Bedeutung. Laut Evans Data verlor Windows im vergangen Jahr 12% (auf 64,8%) an Entwicklern, die ihre Arbeit auf Microsoft Plattformen fokussieren. Im gleichen Zeitraum konnte Linux 34 Prozent (auf 11,8%) dazu gewinnen.

Die gleiche Studie untersuchte auch die Beliebtheit von Skriptsprachen. Demnach hat Javascript drei mal mehr Entwickler als PHP, Ruby oder Python. Allerdings prognostizieren die Marktforscher von Evans Data, dass Ruby im kommenden Jahr um 50% zulegen wird.

Das YouTube Gem bildet ein Interface zur REST Api von YouTube. Mit der Bibliothek lassen sich Videoinformationen aus dem System auslesen. So kann man z.B. mit

videos = youtube.featured_videos

die Top Videos auslesen, oder nach bestimmten Tags suchen mit:

videos = youtube.videos_by_tag('heel toe technique')

Das Gem installiert sich via sudo gem install youtube

Wer mehr wissen will, findet Informationen auf der Projektseite oder im Blog des Entwicklers.

Gute Artikel über Ruby und die Integration in das Innenleben von Windows findet man selten. Dieser hier ist so einer. Es wird beschrieben wie sich mittels Ruby die angeschlossenen USB Geräte eines Windowssystems auslesen lasse

Die Bibliothek Festival TTS for Ruby machts möglich. Sie steht als Gem für Ruby und als Plugin für Rails zum Download zur Verfügung. Das Projekt verwendet zur Laufzeit die nativen Bibliotheken festival und lame.

Die Installation auf einem Ubuntu Linux gestaltet sich sehr einfach. Hinweise dazu finden sich auf der Projektseite.

Im Ruby sprechen die Texte mit "Hello Ruby".to_speech.
Für die Verwendung unter Rails wird der ViewHelper
<%= text_to_flash_player "Talk me!" %> verwendet.

Die zu 100% auf purem Java basierende Laufzeitumgebung für Ruby, JRuby, wurde in der Version 1.0 veröffentlicht. Viele Neues gibt es nicht, da seit der Version 0.9x hauptsächlich an unterschiedlichen Inkompatibilitätsproblemen gearbeitet wurden.

JRuby 1.0 steht hier zum Download bereit.

Jobs per Feed

11. Juni 2007

Das Job Board railsjobs.de bietet nun auch einen Feed für aktuelle Angebote. Vielleicht findet der Eine oder Andere so eine neue Heimat?

Feed bei railsjobs.de abonnieren