Skalierbare Sitzungen für fortgeschrittene Webanwendungen

Heutzutage sind Webanwendungen unverzichtbare moderne Werkzeuge. Da die Rechner und Prozessoren immer leistungsfähiger werden, müssen Ihre Webanwendungen ständig den Leistungsanforderungen entsprechen. Aus diesem Grund bietet der 4D Web Server mit 4D v18 R6 eine neue Art von Websession: die skalierbare Websession.

Lassen Sie uns mehr darüber erfahren!

HDI: Skalierbare Websitzungen

Bisher waren Sie an die Option Automatische Sitzungsverwaltung auf der Seite Web der Struktureinstellungen gewöhnt. Es war bequem, die Sitzungsdaten auf dem Server am Leben zu erhalten.

Der 4D Web Server ist zwar präemptiv und kann alle verfügbaren Kerne nutzen, um Web-Prozesse zu beantworten, aber jede Sitzung (die den Browser eines Endanwenders repräsentiert) wurde über einen einzigen Prozess abgewickelt, so dass mehrere Anfragen, die gleichzeitig von diesem Browser kamen, nacheinander bearbeitet wurden.

Jetzt sind skalierbare Websitzungen in der Lage, mehrere Prozesse im präemptiven Modus zu verarbeiten. Das bedeutet, dass skalierbare Websitzungen mehrere User-Agent-Anfragen gleichzeitig bearbeiten können. Dies verbessert die Leistung erheblich.

Und das ist noch nicht alles! Diese neuen skalierbaren Websitzungen können Daten zwischen diesen Prozessen austauschen.

Arbeiten mit skalierbaren Websitzungen

Sie möchten mit den neuen skalierbaren Websitzungen arbeiten? Nichts könnte einfacher sein. Aktivieren Sie einfach die neuen Web-Einstellungen und starten Sie Ihren Webserver.

Skalierbare Websitzungen werden über ein Objekt verwaltet

Sobald Sie die Einstellung aktiviert haben, können Sie die Sitzung über ein Objekt verwalten. Der Befehl new Session Befehl gibt dieses Objekt zurück.

Es ist in jedem Webprozess verfügbar, der durch 4D Tags, 4D Aktionen, REST Funktionen (ORDA Data Model Classes) und Datenbankmethoden wie On Web Authentication / On Web Connection ausgelöst wird.

Dank dieses Objekts können Sie viele Aspekte Ihrer Web-Sitzung steuern.

Hier ist ein Beispiel dafür, was Sie im Debugger sehen werden:

blank

Daten zwischen Prozessen austauschen

Dieses Session Objekt verfügt über eine storage Eigenschaft, die ein gemeinsames Objekt ist. In dieser Eigenschaft können Sie alle Daten speichern, die Sie zwischen den vom Benutzeragenten kommenden Anforderungen an die Sitzung gemeinsam nutzen möchten. storage Eigenschaft speichern.

Beispiel

In diesem Beispiel handelt es sich um eine CRM-Anwendung. Jeder Vertriebsmitarbeiter verwaltet sein eigenes Kundenportfolio. Die Datenbank enthält zwei verknüpfte Datenklassen: Customers und SalesPersons (ein Verkäufer hat mehrere Kunden).

blank

Angenommen, Ihr Webserver wird auf Ihrem Rechner(IP) über einen HTTPS-Port(Port) gestartet.

Wenn die URL IP:port/4DACTION/authenticate?userId=1 von einem Verkäufer in einem Webbrowser eingegeben wird, wird die Methode authenticate aufgerufen.

Die drei wichtigsten Kunden des Verkäufers werden in der Sitzung gespeichert. Hier ist der Code der Methode authenticate:


var
$indexUserId : Integer
var $userId: Integer
var $info : Object
var $userTop3 : cs.CustomersSelection
var $sales : cs.SalesPersonsEntity
ARRAY TEXT($anames; 0)
ARRAY TEXT ($avalues; 0)

WEB GET VARIABLES
($anames; $avalues)
$indexUserId :=Find in array($anames; "userId")
$userId :=Num($avalues{$indexUserId})
$sales :=ds.SalesPersons.query("userId = :1"; $userId).first()
If ($sales#Null)
Use (Session.storage)
If (Session.storage.myTop3=Null)
$userTop3 :=$sales.customers.orderBy("totalPurchase desc").slice(0; 3)
Session .storage.myTop3:=$userTop3
End if
End use

end if
WEB SEND HTTP REDIRECT ("/sessionStorage.shtml")

Die ersten drei sind für jede Anfrage des User Agents zugänglich (z. B. in einer SHTML-Seite):

<center><h3>Ihre Top 3 Kunden</h3></center>
<table class="table">
<!--#4DCODE
$i:=0
$myTop3:=Session.storage.myTop3
-->
<tr><th>Name</th><th>Gesamtkauf</th></tr>
<!--#4DLOOP ($i<$myTop3.length)-->
<tr>
<td ><!--#4DTEXT $myTop3[$i].name--></td>
<td ><center><!--#4DTEXT $myTop3[$i].gesamtEinkauf--></center></td>
</tr>
<!--#4DEVAL $i:=$i+1-->
<!--#4DENDLOOP-->
</table>

Und hier ist das Ergebnis:

blank

Kommende Aktionen mit der Sitzung

Für die Zukunft arbeiten wir an einer genauen Verwaltung der Privilegien. So dass Sie in der Lage sein werden, Zugriff + Operationen auf Daten entsprechend den Privilegien zu gewähren.

Im Moment können Sie dank der Funktion setPrivileges() die Benutzerinformationen in die Sitzung eingeben. Diese Funktion wird in einer zukünftigen Version erweitert werden, um mehr Aktionen für Privilegien zu handhaben.

Beispiel

var $indexUserId dsSalesPersonsquery $userId: Integer
var $userId : Integer
var $sales : cs.SalesPersonsEntity
var $info : Object
ARRAY TEXT ($anames; 0)
ARRAY TEXT ($avalues; 0)
WEB GET VARIABLES ($anames; $avalues)
$indexUserId :=Find in array($anames; "userId")
$userId :=Num($avalues{$indexUserId})
$sales := xml-ph-0035@deepl.ifirst()
$info :=New object()
$info .userName:=$sales.firstname+""+$sales.lastname

Session .setPrivileges($info)

So können Sie Ihre Webseiten anpassen, indem Sie etwas wie das Folgende hinzufügen:

<center>
<h3>
Hallo <!--#4DEVAL Choose(Session.userName # ""; Session.userName; "nobody")-->
</h3>
</center>

Hier ist das Ergebnis:

blank

Wie Sie vielleicht im Screenshot des Debuggers bemerkt haben, werden skalierbare Web-Sitzungen nach 60 Minuten Inaktivität (d. h., es werden keine Anfragen an die Sitzung gestellt) geschlossen (Timeout).

Laden Sie das HDI herunter, um mehr zu erfahren, und beteiligen Sie sich an der Diskussion im 4D Forum!

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert ist seit 2017 als Product Owner im 4D Produktteam tätig. Als Product Owner ist sie für das Schreiben der User Stories und deren Umsetzung in funktionale Spezifikationen zuständig. Ihre Aufgabe ist es auch, sicherzustellen, dass die Implementierung der Funktionen den Anforderungen des Kunden entspricht. Marie-Sophie ist Absolventin der ESIGELEC Ingenieurschule und begann ihre Karriere als Ingenieurin bei IBM im Jahr 1995. Sie nahm an verschiedenen Projekten teil (Wartungs- oder Build-Projekte) und arbeitete als Cobol-Entwicklerin. Dann arbeitete sie als UML-Designerin und Java-Entwicklerin. In letzter Zeit bestand ihre Hauptaufgabe darin, funktionale Anforderungen zu analysieren und zu schreiben sowie Geschäfts- und Entwicklungsteams zu koordinieren.