Forum: PC-Programmierung RubyOnRails: Keine 2 Anfragen gleichzeitg möglich?


von Be B. (bebo)


Lesenswert?

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

von D. I. (Gast)


Lesenswert?

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 ;)

von Be B. (bebo)


Lesenswert?

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.

von D. I. (Gast)


Lesenswert?

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ß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.