Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

47
Tobias Joch, 11. Mai 2007 Performanter, hochskalierbarer Web 2.0-Dienst in Ruby Realisierbar oder nur ein nettes Märchen?

description

Ein neues Zeitalter ist angebrochen: Web2.0. Investoren geben viel Geld aus für Web2.0-Dienste. Ein rasanter Wettlauf um User-Generated Content hat begonnen und es ist kein Ende in Sicht. MySpace, Flickr, YouTube, Wikipedia, unzählige Blogs oder etwa Podcasting ist heute von jung bis alt vielen ein Begriff und wird oft auch im Alltag genutzt. Zeit spielt eine große Rolle bei der Planung und Konzeption eines neuen Web2.0-Dienstes. Deshalb findet man neben den üblichen nicht funktionalen Anforderungen wie Hochskalierbarkeit und Ausfallsicherheit auch Forderungen hinsichtlich immer kürzerer Implementierungszeiten. Neue Frameworks entstehen wie Sand am Meer und jedes verspricht dem Interessenten beim Faktor Time to Market das Beste zu sein. Eines der populärsten Frameworks dieser Art ist sicherlich Ruby on Rails.

Transcript of Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Page 1: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Tobias Joch, 11. Mai 2007

Performanter, hochskalierbarerWeb 2.0-Dienst in Ruby

Realisierbar oder nur ein nettes Märchen?

Page 2: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Referent:

Tobias Joch, ComBOTS

Titel des Vortrags:Performanter, hochskalierbarer Web2.0-Dienst in Ruby –Realisierbar oder nur ein nettes Märchen

Stichworte:Ruby on Rails,RoR,Ruby,Web2.0, ComBOTS

Vorstellung des Referenten:Tobias Joch ist der Informatik wegen 1998 aus dem schönen Odenwald nach Karlsruhe gezogen.Während seinem Studium an der Hochschule Karlsruhe arbeitete er beim Steinbeis Transferzentrumund T-Systems International GmbH bevor er im Sommer 2004 zur WEB.DE AG wechselte. Zurzeitverantwortet Tobias Joch bei ComBOTS die Softwareentwicklung der Geschäftssysteme.

URLs:http://www.ruby-lang.orghttp://www.rubyonrails.orghttp://www.flickr.comhttp://www.myspace.comhttp://www.youtube.comhttps://shop.combots.comhttp://de.wikipedia.org/wiki/Web_2

Zielgruppen:1. Entwickler2. Systemarchitekten3. Projektmanager

Page 3: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

AbstractEin neues Zeitalter ist angebrochen: Web2.0. Investoren geben viel Geld aus fürWeb2.0- Dienste. Ein rasanter Wettlauf um User-Generated Content hat begonnen undes ist kein Ende in Sicht. MySpace, Flickr, YouTube, Wikipedia, unzählige Blogs oderetwa Podcasting ist heute von jung bis alt vielen ein Begriff und wird oft auch im Alttaggenutzt.

Zeit spielt eine große Rolle bei der Planung und Konzeption eines neuen Web2.0-Dienstes. Deshalb findet man neben den üblichen nicht funktionalen Anforderungen wieHochskalierbarkeit und Ausfallsicherheit auch Forderungen hinsichtlich immer kürzererImplementierungszeiten. Neue Frameworks entstehen wie Sand am Meer und jedesverspricht dem Interessenten beim Faktor Time to Market das Beste zu sein. Eines derpopulärsten Frameworks dieser Art ist sicherlich Ruby on Rails.

Im Verlauf des Vortrages werden einige Erfahrungsberichte beim Einsatz von Ruby onRails bei ComBOTS hinsichtlich Performance, Skalierbarkeit und Ausfallsicherheitpräsentiert. Am Ende bleibt nur noch die Frage: „Performanter, HochskalierbarerWeb2.0-Dienst in Ruby – Realisierbar oder nur ein nettes Märchen“

Page 4: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Agenda• Was ist Web 2.0• Was ist Ruby• Web-Server / Infrastruktur• Performance Probleme von …

• Ruby als Sprache• Ruby on Rails als Web-Framework

• Skalierung• Sessionhandling• Loadbalancing• Caching

• Fazit• Ausblick

Page 5: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

"Design Patterns and Business Modelsfor the Next Generation of Software" 1)

Was ist Web 2.0Kurze Definition

[Tim O'Reilly]

Page 6: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

• Zerplatzen der .com-Blase (Herbst 2001)

• Brainstorming (O'Reilly und MediaLive International, 2003)

• Dale Dougherty (O'Reilly Media VP)

• Konzept:• „Web 2.0“ als Wendepunkte im Web

• Geburt der 1. "Web 2.0 Konferenz"

Was ist Web 2.0

Page 7: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Was ist Web 2.0• Keine neue Version von Web-Standards

• URI, HTTP, HTML, …• Ansammlung von Prinzipien und Praktiken

• Das Web als Plattform• Die Nutzung kollektiver Intelligenz

• Wikipedia,

• Folksonomy (kollaborativer Kategorisierung)

• Verbesserte Nutzungsmöglichkeiten• Podcasts,• RSS-Feeds,• Social Software (IM, Blogs, Wikis, Bookmarking, Network

Services, …)• User generated content

• Web APIs, Web Services, Mashups

Page 8: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Web 2.0-ness

Web

Page 9: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Quelle: http://www.go2web20.net

Enorme Geschwindigkeit / Andauernder Beta-Phase

Page 10: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Wo stehen wir?

Page 11: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Tobias Joch, 11. Mai 2007

Performanter, hochskalierbarerWeb 2.0-Dienst in Ruby

Realisierbar oder nur ein nettes Märchen?

Page 12: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Was ist Ruby?

Quelle: http://www.ruby-lang.org/en/

Page 13: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

• Japan 1995• 100% OO• Perl, Smalltalk, Eiffel, Ada, and Lisp• Exceptions, GC, Threads,

CrossPlattform...• dynamisch typisiert• Introspection• Module• OSS, GPL oder eigene

Page 14: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

• Simple Syntax

Page 15: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

• Offene Klassen

Page 16: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

• Closures / Blocks

Page 17: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

• Closures / Blocks

Page 18: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

• Ruby Gem• Ruby Doc• Interactive Ruby (IRB)• Test::Unit

Page 19: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Wo stehen wir nun?

Page 20: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Tobias Joch, 11. Mai 2007

Performanter, hochskalierbarerWeb 2.0-Dienst in Ruby

Realisierbar oder nur ein nettes Märchen?

Page 21: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Was ist Ruby on Rails?• David Heinemeier Hansson

• 12 Core Entwickler• >100 aktiv Mitwirkende aus der Community

• Fullstack OSS Web-Framework• Aus bestehender Anwendung extrahiert

(37signals)

• Implementiert in Ruby

Page 22: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Philosophie• „…optimized for programmer happiness“• Convention over Configuration!

• Keine Komplexe Konfiguration• Kein XML für OR-Mapping• Anpassbar bei Bedarf

• Don´t repeat yourself! (DRY)• Testing on all Layers!

Page 23: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Features• Scaffolding• Rapid Prototyping• Model-View-Controller Architektur• OR-Mapper• DB-Schema Management• Configuration Management• Ajax Integration• Plugins

Page 24: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

MVC-Architektur

Page 25: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Webserver-Unterstützung• Betrieb von Rails-Applikationen via

• WEBrick• mongrel• Apache

• CGI, FCGI, SCGI,• mod_ruby• mod_proxy (Apache 2.2)

• lighttpd• CGI, FCGI

• …

Page 26: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Performance Probleme• Ruby als Sprache

• Interpretierte Skriptsprache• ~ 15x langsamer als Java?!• kein Byte-Code, kein JIT, AST wird direkt interpretiert• keine Optimierungen zur Übersetzungszeit

• RoR als Framework• Routing• ineffiziente Rails Helper-Methoden• Assoziationen• Ineffizienter DB-Zugriff• Langsamer Session Container

Page 27: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Probleme und Lösungen

• step by step …

Page 28: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Ineffizienter DB-Zugriff• ActiveRecord wurde entwickelt für MySQL• Oracle Adapter suboptimal

• keine prepared Statements• Spezielles tuning / workaround für Oracle

• prefetch_rows• cursor_sharing

• Model.find_by_sql• ggf. auch ActiveRecord umgehen

• direkt per OCI8.new(…)

Page 29: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

ActiveRecord• Verwendung von findern

• nur das laden, was auch wirklich benötigt wird!• :select, :limit, :offset

• Association Proxies nicht sehr effizient• Benötigte Assoziationen gleich mit laden!• :include (eager join)

• dynamische finder• mächtig aber auch langsamer

• MyModel.find_by_sql für• Transaktions Block verwenden

Page 30: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

ActiveRecord• Klassisches Database Engineering nicht

vergessen! ;)• Indexe• Query-Analyse• Views• …

Page 31: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

ActionView• Werden jedes mal neu interpretiert

• Vergleich zu JSPs• Caching, caching, caching

• ViewHelper (=Taglibs)• HTML verwenden anstelle von <% form_end %>• Plugin verwenden für pre-rendering

• AssetPacker• Merged und komprimiert JS und CSS

Page 32: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

ActionController• Filter sind mächtig, aber auch langsam• Instanzvariablen

• Pro Request eigene View- und Controller-Instanz• Instanzvariabeln werden in die View kopiert

• Eigener Request-Zyklus für Komponenten• Besser Partials

Page 33: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Logging

Page 34: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Was kommt jetzt?

Page 35: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Tobias Joch, 11. Mai 2007

Performanter, hochskalierbarerWeb 2.0-Dienst in Ruby

Realisierbar oder nur ein nettes Märchen?

Page 36: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Skalierungsmöglichkeiten• Sessionhandling• Loadbalancing• Caching• AJAX / Comet

Page 37: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Sessionhandling• Memory• File-System• Datenbank

• ActiveRecordStore• SQLSessionStore

• Memcached• DrbStore

Page 38: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Loadbalancing• Lokal per

• mod_proxy, mongrel_cluster, fcgi, …

• Mehrstufig• Abhängig vom Sessionhandling• Round-robin• Fastest• Stickiness

Page 39: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Loadbalancing

Web-Server

FastCGI

+ Ruby

1

2

3a 3b

FastCGI

+ Ruby

FastCGI

+ Ruby

DB memcached

mod_fcgi

Page 40: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Loadbalancing (stickiness)

Page 41: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Loadbalancing (round-robin)

Web-Server

FastCGI

+ Ruby

FastCGI

+ Ruby

FastCGI

+ Ruby

mod_fcgiWeb-Server

FastCGI

+ Ruby

FastCGI

+ Ruby

FastCGI

+ Ruby

DB memcached

mod_fcgi

Loadbalancer

Page 42: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Loadbalancing (round-robin)

Page 43: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Caching• Page

• Schnell, nur für komplett unpersonalisierte Seiten• Action

• Zweitschnellste Option• Komplette Rendering-Phase fällt weg• Prozess intensive Berechnungenintensive computations

• Fragement• Wenn oben Page und Action nicht funktioniert• Extended Fragment Cache Plugin

• Content Interpolation

• Model• acts_as_cached (Plugin)• CachedModel (Plugin)

• find(), update()

Page 44: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Caching-Optimierungen• Module für Apache

• mod_expires• LastModified

• mod_cache

• memcached

Page 45: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Fazit„Performanter, hochskalierbarer Web 2.0-Dienst in Ruby“

• Realisierbar oder nur ein nettes Märchen?• Und es geht doch?!• Sicherlich nicht für alle Einsatzgebiete• „Rails is great but still needs a lot of optimization“• Entwicklungsgeschwindigkeit vs. Hardware- und

Betriebskosten• Entwickler… ([email protected])

Page 46: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Tobias Joch, 11. Mai 2007

Fragen ?!

Page 47: Performanter, hochskalierbarer Web 2.0-Dienst in Ruby

Ausblick• Grails• JRuby