RubyOnRails: Keine 2 Anfragen gleichzeitg möglich?

OP #2995357
Hallo,

bei meine Versuchen mit Ruby On Rails stolpere ich immer wieder. Ich 
dachte eigentlich, daß ein Webserver mehrere Anfragen parallel 
abarbeiten kann. Ich verwende "thin" als Entwicklungsserver.

Nun wollte ich mal ein bißchen mit den Transaktionen herumprobieren. 
Dazu habe ich zwei Funktionen erstellt, die den gleichen/zwei 
verschiedene User Datensatz(e) editieren, wobei die erste Funktion 10s 
schläft.
Aber solange die ersten Funktion (change) schläft, passiert überhaupt 
nichts. Selbst statische Seiten werden erst ausgegeben, wenn "change" 
den 10 Sekündigen Schlaft hinter sich hat.

Ist das so gewollt? Nun dachte ich, daß thin/WEBrick in der Lage sind 2 
unterschiedliche Anfragen gleichzeitig Auszuführen, andernfalls machen 
Transaktionen wenig Sinn. Und was nützt einem ein Multiprozessersystem 
als Server?

Es mag ja bei Standardanfragen egal sein, aber wenn man umfangreiche 
Bilder dynamisch auf dem Server erzeugt oder sehr komplexe Suchabfragen 
startet, sollte so etwas nicht passieren.
1
  def change
2
    #User.transaction do
3
      @user = User.where('id = ?', params[:id]).first
4
      
5
      sleep 10 
6
      
7
      @user.name = @user.name + "v"
8
      @user.save
9
       
10
      render :text => @user.name
11
      #redirect_to :action => "show", :id => params[:id]
12
    #end
13
  end
14
  
15
  def change2
16
    #User.transaction do
17
      @user = User.where('id = ?', params[:id]).first
18
      
19

20
      
21
      @user.name = @user.name + "x"
22
      @user.save
23

24
      render :text => @user.name
25
       
26
      #redirect_to :action => "show", :id => params[:id]
27
    #end
28
  end
Gast #2995435
thin allein ist soweit ich weiß nur ein single-threaded webserver. 
Entweder du baust einen Mongrel Unterbau drunter oder etwas zeitgemäßer 
(was ich persönlich auch bevorzuge selbst im dev modus): Phusion 
Passenger + nginx

Den konfigurierst du dann so, dass er mehrere Instanzen ausführt die 
mehrere Requests annehmen können

Aber ein einzlener thin nur im dev mode führt erstmal nur einen request 
aus.

Darüberhinaus sind Transaktionen nur die halbe Wahrheit, das sorgt nur 
dafür das entweder alles oder nichts ausgeführt wird. Um Atomarizität 
und Konsistenz zu erhalten musst du auch locking einsetzen, sonst kann 
dir trotz transaktionen durchaus sowas passieren:

value = 10

trans_0 read value
trans_1 read value
trans_0 write value = 0, führe einmalige aktion aus if value = 10
trans_1 write value = 0, führe einmalige aktion aus if value = 10

in diesem szenario wurde also trotz transaktionen die einmalige aktion 
zweimal ausgeführt, weil die transaktionen ungünstig verzahnt waren. 
Verhindern kannst du das in dem man auf value vorher ein Lock erstellt 
hätte an dem andere aktionen hätten warten müssen bis die Transaktion 
die das Lock hat es wieder freigibt. Das durfte ich auch auf die mehr 
oder weniger schmerzvolle Weise lernen ;)
OP #2995637
Passenger habe ich auch gerade ausprobieren wollen, nur irgendwie paßt 
mal wieder keine Anleitung wie man es installiert. Kommt aber in den 
nächsten Tagen bestimmt noch dran.

Weißt Du zufällig eine Seite, die die Passenger Installation für ein 
Rails 3 Projekt beschreibt? Alle meine Versuche sind bisher gescheitert.
Gast #2995670
Passenger ist die Rails Middleware und dazwischen brauchst noch einen 
Webserver (ich bevorzuge Nginx):

http://www.modrails.com/documentation/Users%20guide%20Nginx.html
https://gist.github.com/1109699

Mit den beiden Sachen hats auf meinem VServer geklappt und auch lokal. 
Im Nginx habe ich dann für meine lokalen dev Projekte einfach immer auf 
die domain

<projektname>.local

gemappt, sowies hier auch gemacht wird auch wenn dort apache verwendet 
wird:

http://railscasts.com/episodes/122-passenger-in-development

railscasts ist pflicht für jeden Rails developer ;)

Das Erstsetup von dem ganzen Kram hat mich auch fast 3 Tage gekostet, 
aber jetzt bin ich soweit zufrieden. Auch wenn ich Inf bin, war ich noch 
nie ein Fan von diesem ganzen Konfigurationsscheiß

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.