Sessões escaláveis para aplicações web avançadas

Tradução automática de Deepl

Hoje em dia, as aplicações web são ferramentas modernas essenciais. À medida que as máquinas e os processadores se tornam cada vez mais potentes, as suas aplicações web devem satisfazer constantemente os requisitos de desempenho. É por isso que com 4D v18 R6, o Servidor Web 4D oferece um novo tipo de sessão web: a sessão web escalável.

Vamos descobrir mais!

HDI: as sessões web escaláveis

Anteriormente, estava habituado à opção de gestão automática de sessões na página Web das Configurações de Estrutura. Era conveniente manter os dados da sessão vivos no servidor.

Enquanto o Servidor Web 4D é preventivo e pode tirar partido de todos os núcleos disponíveis para responder a processos web, cada sessão (representando o browser de um utilizador final) era tratada através de um único processo, pelo que vários pedidos vindos de uma só vez deste browser eram tratados sequencialmente, um após o outro

Agora, as sessões web escaláveis são capazes de lidar com vários processos em modo preventivo. Isto significa que as sessões web escaláveis podem tratar de vários pedidos de agentes de utilizadores ao mesmo tempo. Isto melhora muito o desempenho.

E isso não é tudo! Estas novas sessões escaláveis da web podem partilhar dados entre estes processos.

trabalhar com sessões escaláveis da web

Quer trabalhar com novas sessões web escaláveis? Nada poderia ser mais simples. Basta activar as novas definições da web e iniciar o seu servidor web.

As sessões escaláveis da web são tratadas através de um objecto

Uma vez activada a configuração, é possível tratar da sessão através de um objecto. A nova Session devolve este objecto.

Está disponível em qualquer processo web desencadeado por etiquetas 4D, acções 4D, funções REST (ORDA Data Model Classes), e métodos de bases de dados tais como On Web Authentication / On Web Connection.

Graças a este objecto, pode tratar de muitos aspectos da sua sessão na Web.

Aqui está um exemplo do que poderá ver no depurador:

blank

partilhar dados entre processos

Este Session objecto vem com um storage propriedade que é um objecto partilhado. Pode armazenar quaisquer dados que queira partilhar entre pedidos provenientes do agente do utilizador na sessão no storage propriedade.

exemplo

Neste exemplo, temos uma aplicação CRM. Cada vendedor gere a sua própria carteira de clientes. A base de dados contém dois dataclasses interligados: Customers and SalesPersons (um vendedor tem vários clientes).

blank

Digamos que o seu servidor web é iniciado na sua máquina(IP) usando uma porta HTTPS(porto).

Quando o URL IP:port/4DACTION/authenticate?userId=1 é introduzido num navegador web por um vendedor, o método authenticate é chamado.

Os três principais clientes do vendedor são armazenados na sessão. Aqui está o código do método 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 End if

end if (0; 3)
Session .storage.myTop3. :=$userTop3

End use
WEB SEND HTTP REDIRECT ("/sessionStorage.shtml")

A seguir, estes três primeiros são acessíveis por qualquer pedido proveniente do agente do utilizador (por exemplo, numa página SHTML):

<center><<h3>Seu top 3 clientes</h3></center>
<classe de tabela="tabela">
<!--#4DCODE
$i:=0
$myTop3:=Sessão
.storage.myTop3
-->
<tr>>th>>Nome</th>>th>>Total compra</th></tr>
<!--#4DLOOP ($i<$myTop3
. comprimento)-->
<tr>
<td ><<!--#4DTEXT $myTop3[$i].name--></td>
<td ><center><!--#4DTEXT $myTop3[$i].totalPurchase--></center></td>
</tr>
<!--#4DEVAL $i:=$i+1-->
<!--#4DENDLOOP-->
</table>

E aqui está o resultado:

blank

próximas acções com a sessão

Estamos a trabalhar numa gestão precisa de privilégios para o futuro. Para que possa conceder acesso + operações sobre dados de acordo com privilégios.

Para já, pode colocar a informação do utilizador na sessão graças à função setPrivileges(). Esta função será melhorada para lidar com mais acções para privilégios numa versão futura.

exemplo

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

Session .setPrivileges($info)

Assim, pode personalizar as suas páginas web acrescentando algo do género:

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

Aqui está o resultado:

blank

Como deve ter notado na captura de ecrã do depurador, as sessões escaláveis da web fecham (timeout) após 60 minutos de inactividade (ou seja, nenhum pedido solicita a sessão).

Descarregue o HDI acima para descobrir mais e junte-se à discussão no fórum 4D!

Avatar
• Proprietário do produto - Marie-Sophie Landrieu -Yvert entrou ao time 4D Product como Proprietária do Produto em 2017. Como tal, está a cargo de escrever as histórias dos usuários e depois traduzi-las em especificações funcionais. Seu papel também é garantir que a implementação da funcionalidade entregue cumpra com as necessidades do cliente. Marie-sophie se formou na Escola de Engenharia de ESIGELEC e começou sua carreira como engenheira da IBM em 1995. Participou em vários projetos (de manutenção e criação) e trabalhou como desenvolvedora de Cobol. Depois trabalhou como designer de UML e desenvolvedora de Java. Suas principais funções foram analisar e redigir requisitos funcionais, coordenar os times de negócio e de desenvolvimento.