高度なWebアプリケーションに対応したスケーラブルなセッション

Deeplからの自動翻訳

今日、Webアプリケーションは必要不可欠な現代ツールです。マシンとプロセッサーがより強力になるにつれ、Webアプリケーションは常にパフォーマンス要件を満たす必要があります。4D v18 R6で、4D Web Serverが新しいタイプのWebセッションを提供するのはこのためです。

では、詳しく見ていきましょう。

HDI:スケーラブルWebセッション

以前は、構造設定のウェブページにある自動セッション管理オプションに慣れていました。サーバー上でセッションデータを生かすことができ、便利でした。

4DのWebサーバーはプリエンプティブで、利用可能なすべてのコアを活用してWebプロセスに答えることができますが、各セッション(エンドユーザーからのブラウザを表す)は単一のプロセスで処理されるため、このブラウザから一度に来る複数のリクエストは、次々と順次処理されることになりました

しかし、スケーラブルWebセッションは、複数のプロセスをプリエンプティブモードで処理できるようになりました。つまり、スケーラブルWebセッションは、複数のユーザーエージェントのリクエストを同時に処理することができるのです。これにより、パフォーマンスが大幅に向上します。

そして、それだけではありません!この新しいスケーラブル Web セッションは、 これらのプロセス間でデータを共有することができます。

スケーラブルなウェブ・セッションで作業する

新しいスケーラブル・ウェブ・セッションを使いたいですか?これほど簡単なことはありません。新しい Web 設定を有効にして、Web サーバを起動するだけです。

スケーラブル・ウェブ・セッションは、オブジェクトを通じて処理されます。

この設定を有効にすると、オブジェクトを通してセッションを処理することができます。new Sessionコマンドはこのオブジェクトを返します。

4Dタグ4DアクションREST関数(ORDAデータモデルクラス)On Web Authentication/On Web ConnectionなどのデータベースメソッドによってトリガーされるすべてのWebプロセスで利用可能です。

このオブジェクトのおかげで、ウェブセッションの多くの側面を扱うことができます。

以下は、デバッガで見ることのできる例です。

blank

プロセス間でデータを共有する

この Sessionオブジェクトには storageプロパティが付属しており、これは共有オブジェクトです。セッション上のユーザエージェントから来るリクエストの間で共有したいデータは、この storageプロパティに格納できます。

この例では、CRM アプリケーションがあります。各営業担当者は自分の顧客ポートフォリオを管理します。データベースには、リンクされた 2 つのデータクラスが含まれています。CustomersSalesPersons(一人の営業担当者が複数の顧客を持つ) です。

blank

あなたのマシン(IP)で、HTTPSポート(port)を使ってWebサーバーを起動したとします。

営業担当者がウェブブラウザでIP:port/4DACTION/authenticate?userId=1というURLを入力すると、authenticate メソッドが呼び出されます。

営業担当者の上位3名の顧客がセッションに保存されます。以下は、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")

次に、この上位3つは、ユーザーエージェントから来るどのようなリクエストでも(例えば、SHTMLページで)アクセスできるようになっています。

<center><h3>Your top 3 customers</h3></center>
<table class="table">
<!--#4DCODE
$i:=0
$myTop3:=Session.Stor
age.myTop3 <!--#4DCODE><!--#4DCODE><!--#4DCODE><!--#4DCODE><!storage.myTop3
-->
<tr><th>Name</th><th>Total purchase</th></tr>
<!--#4DLOOP ($i<$myTop3.Leng
th) –> <! length)-->
<tr>
<td ><!--#4DTEXT $myTop3[$i].name--></td>
<td ><center><!--#4DTEXT $myTop3[$i].NAME--></td> <td ><!--#4DTEXT $myTop3[$i].totalPurchase--></center></td>
</tr>
<!--#4DEVAL $i:=$i+1-->
<!--#4DENDLOOP-->
</table> <!

そして、その結果がこちらです。

blank

セッションを使った今後のアクション

私たちは、将来のために正確な権限管理に取り組んでいます。そうすれば、特権に応じてデータへのアクセス+操作を許可することができるようになります。

今のところ、setPrivileges()関数のおかげで、ユーザーの情報をセッションに入れることができます。この関数は、将来のリリースで、権限に対するより多くのアクションを扱えるように拡張される予定です。

var $indexUserId
ARRAY TEXTdsSalesPersonsquery $userId:Integer
var $userId :Integer
var $sales :cs.SalesPersonsEntityvar $info :Object
($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)

つまり、このようなものを追加することで、Webページをカスタマイズすることができるのです。

<center>
<h3>
Hello <!--#4DEVAL Choose(Session.userName# "";Session.userName; "nobody")-->
</h3>
</center>
このように、Webページをカスタマイズすることができます。

以下はその結果です。

blank

デバッガーのスクリーンショットで気づいたかもしれませんが、スケーラブルな Web セッションは 60 分間非アクティブ (つまり、セッションを要求するリクエストがない) になると終了 (タイムアウト) します。

上記のHDIをダウンロードして、4Dフォーラムでの議論に参加してください。

Avatar
- プロダクトオーナー - Marie-Sophie Landrieu-Yvertは、2017年にプロダクトオーナーとして4Dプロダクトチームに参加しました。プロダクトオーナーとして、彼女はユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換する役割を担っています。また彼女の役割は、実装された機能が顧客のニーズを満たしているかどうかを確認することでもあります。彼女は1995年にESIGELEC Engineering Schoolを卒業し、IBMでエンジニアとしてのキャリアをスタートさせました。様々なプロジェクト(保守や新規のプロジェクト)に参加し、Cobolのデベロッパーとして働きました。その後、UMLデザイナーおよびJavaデベロッパーとして勤務。最近は、機能要件の分析・記述、ビジネスチームと開発チームの調整などを主に担当しています。