Wenn Sie eine Rails 3 App mit mehreren Webdynos auf Heroku ausführen,
Kurz gesagt ja - Sitzungen funktionieren über mehrere Web-Dynos.
Sitzungen funktionieren über Web-Dynpros hinweg - weil Rail's Design der Sitzungsunterstützung dies zulässt. Wenn überhaupt, ist das Web-Dyno-Modell genau wie Rail's horizontal skaliert werden sollte.
1. Jedes Mal, wenn Sie die App aufrufen, verbinden Sie sich normalerweise mit einem anderen Web-Dyno?
Basierend auf der Dokumentation von heroku:
Das Routing-Mesh ist dafür verantwortlich, den Standort der Web-Dynos Ihrer Anwendung innerhalb der Dyno-Mannigfaltigkeit zu bestimmen und die HTTP-Anfrage an eines dieser Dynos weiterzuleiten. Die Dyno-Auswahl wird mit einem Zufallsauswahl-Algorithmus durchgeführt.
Die Auswahl des Dynos ist zufällig ... aber bei diesem Dyno muss Ihre Anwendung installiert sein. Wenn Sie also mehr als einen Prüfpunkt haben, können Sie sich möglicherweise mit einem anderen Prüfpunkt verbinden (was wichtig ist, da dies den Lastenausgleich und die hohe Verfügbarkeit erleichtert).
2. Können Sitzungen über verschiedene Web-Dynpros hinweg funktionieren?
Ja. Die meisten Webstapel unterstützen Sitzungen folgendermaßen:
Auf diese Weise können Sitzungen unterstützt werden, da jede eingehende HTTP-Anfrage die Sitzungs-ID hat, auf die der Web-Dyno bei der Bearbeitung Ihrer Anfrage zugreifen kann.
3. Funktioniert es für verschiedene Rails-Sitzungsspeicher (ActionDispatch :: Session :: CookieStore, ActiveRecord :: SessionStore und ActionDispatch :: Session :: CacheStore)
ActionDispatch :: Session :: CookieStore Ja. Der Cookie-Speicher speichert verschlüsselte Sitzungsdaten als Cookie. Ihr Browser sendet also alle Sitzungsdaten (verschlüsselt) zurück an den Host, die dann zur Verwendung in Ihrer App entschlüsselt werden.
ActiveRecord :: SessionStore Ja. Der Cookie-Speicher speichert verschlüsselte Sitzungsdaten in einer Datenbanktabelle. Eine ID wird dann als Cookie zugewiesen. Daher sendet Ihr Browser die ID an den Host, der dann zum Laden der Sitzungsdaten aus der Datenbank verwendet wird. Da alle Webdynos eine Verbindung zur DB haben, wird dies auch unterstützt.
ActionDispatch :: Session :: CacheStore Ja, aber Sie benötigen einen Cache-Speicherdienst (zB MemCache-Addon). Der Cookie-Speicher speichert verschlüsselte Sitzungsdaten in einem Cache-Speicher (Memcache), bei dem es sich um einen gemeinsam genutzten Dienst über alle Web-Dynpros handelt. Eine ID wird dann als Cookie zugewiesen. Ihr Browser sendet also die ID an den Host, der dann zum Laden von Sitzungsdaten aus dem Cache-Speicher (memcache) verwendet wird.
Ich glaube nicht, dass Heroku sich bemüht, aufeinanderfolgende Anfragen an denselben Web-Dyno zu senden. Ich könnte mich irren und sie machen etwas Anstrengung, aber selbst wenn sie es tun, ist es wahrscheinlich nicht so zuverlässig, dass man sich auf das Sitzungsmanagement verlassen kann.
ActionDispatch :: Session :: CookieStore wird jedoch definitiv funktionieren, da die Daten in einem verschlüsselten clientseitigen Cookie gespeichert werden. ActiveRecord :: SessionStore funktioniert, da die Daten in der Datenbank gespeichert sind, die vermutlich von allen Web-Dynos gemeinsam genutzt wird. ActiveDispatch :: Session :: CacheStore sollte funktionieren, wenn Sie einen MemCached-Server verwenden, der für alle Clients freigegeben ist, oder einen ähnlichen gemeinsam genutzten Cache.
Das einzige, was nicht funktioniert, ist eine Art dateibasierter Sitzungsspeicher auf dem lokalen Dateisystem, und Situationen wie mehrere Heroku-Dynos sind genau der Grund, warum diese Art von Sitzungsspeicher in modernen Webanwendungen nicht üblich ist.
>Tags und Links ruby-on-rails-3 multithreading ruby-on-rails session heroku