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

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

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

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

以前は、ストラクチャー設定の Webページにある自動セッション管理オプションを使っていました。サーバー上でセッションデータを保持できるのは便利でした。

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

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

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

スケーラブルWebセッションで作業する

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

スケーラブルWebセッションは、オブジェクトを介して扱います

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

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

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

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

blank

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

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

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

 

blank

 

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

営業担当者が 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.storage.myTop3
  -->
  <tr><th>Name</th><th>Total purchase</th></tr>
  <!--#4DLOOP ($i<$myTop3.length)-->
   <tr>
    <td ><!--#4DTEXT $myTop3[$i].name--></td>
    <td ><center><!--#4DTEXT $myTop3[$i].totalPurchase--></center></td>
   </tr>
   <!--#4DEVAL $i:=$i+1-->
  <!--#4DENDLOOP-->
</table>

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

blank

今後の展開

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

現在は、setPrivileges()関数を使って、ユーザーの情報をセッションに格納することができます。この関数は、権限に対してさらなるアクションを扱えるように将来のリリースで拡張される予定です。

var $indexUserId : 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:=ds.SalesPersons.query("userId = :1"; $userId).first()
$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> 

以下はその結果です:

blank

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

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

 

 

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