4D 21 R4 では、新しいクォータ管理メカニズムにより、REST サーバーのリソースをこれまで以上に細かく制御できるようになりました。アプリケーションの規模が拡大するにつれ、Web アプリケーション、モバイルアプリ、サードパーティ製サービス、カスタム統合、さらにはMCPサーバーを介した AI 搭載ツールなど、多種多様なクライアントがデータを利用するようになります。
各クライアントは独自の方法で REST API とやり取りし、複雑さや頻度の異なるリクエストを生成します。あらゆる状況で最適なパフォーマンスを確保するためには、サーバーリソースの使用状況を適切に管理することが重要です。
クォータ、その必要性は?
4D RESTサーバーでは、効率性とナビゲーションを向上させるため、リクエストされたデータをエンティティセットとしてメモリに格納することができます。
適切に設計されたアプリケーションでは、これらのエンティティセットは不要になった時点で解放されます。しかし、大規模で多様なエコシステムでは、クライアントの挙動や、割り当てられたリソースがすべて適切に解放されるかどうかを常に予測できるとは限りません。
クォータがない場合、単一のセッションにおけるエンティティセットの非効率的な管理が、他のユーザーのパフォーマンスに影響を与える可能性があります。
そのため、4D 21 R4では、エンティティセットのセッションクォータが導入されました。わずか数行のコードで、リソース制限を定義し、メモリ使用量を適切に管理し、サーバーを過剰な消費から保護し、すべてのユーザーに対して一貫した可用性を確保することができます。
その結果、より耐障害性の高い REST サーバーが実現し、管理が容易になり、増え続ける利用者に対してデータを公開する際の信頼性も高まります。
現在の REST セッションのクォータを設定する
Session コマンドは、REST セッションを表すオブジェクトを返します。このオブジェクトには quotas objectプロパティ(4D.QuotaManager クラスのインスタンス)を含みます。
例
以下は、Session.quotas オブジェクトの例です。
{
"nbEntitySets": 100,
"maxEntitySetTimeout": 420,
"defaultEntitySetTimeout": 300,
"currentValues": {}
}
このオブジェクトは、現在のセッション のクォータを設定するために使用できる以下のプロパティを公開しています:
– nbEntitySets: メモリ内に保持できるエンティティセットの最大数
–>エンティティセットの数が多すぎると、メモリを過剰に消費し、RESTサーバーのパフォーマンスに影響を与える可能性があります。このプロパティを使用すると、現在のセッションにおいてメモリに同時に格納できるエンティティセットの数を制限できます。
– defaultEntitySetTimeout:エンティティセットに対して許可されるデフォルトの非アクティブタイムアウト。
–>このプロパティを調整することで、指定された期間以上未使用のままのエンティティセットが自動的に解放されるため、メモリの過剰な使用を防ぐことができます。
– maxEntitySetTimeout: エンティティセットの最大非アクティブタイムアウト
–>このプロパティを調整することで、非アクティブタイムアウトが過度に長いエンティティセットが作成されるのを防ぐことができます。
さらに、 currentValues プロパティには、 nbEntitySets属性も提供しており、これはセッションに対して現在メモリ内に保持されているエンティティセットの数を示します。
注:値が「Undefined」の場合、クォータは適用されず、REST サーバーはデフォルトの挙動に従います。
エンティティセットの数を制限する
これを行うには、 nbEntitySets プロパティを更新します。
Session.quotas.nbEntitySets:=100
以下の例では、セッションのメモリ内のエンティティセット数が最大 100 に制限されており、すでに 100 のエンティティセットが作成されています:
{
"nbEntitySets": 100,
"currentValues": {
"nbEntitySets": 100
}
}
次にエンティティセットを作成しようとすると、メモリ内に100個のエンティティセットが残っている限り、エラーが返されます:
{
"__ERROR": [
{
"message": "Max number of entitysets has been reached for this session.",
"componentSignature": "dbmg",
"errCode": 2017
}
]
}
より具体的な例
forceLoginモードは、認証されていないセッションでのエンティティセットの作成を防止することで、最初の保護層を提供します。ただし、認証後であっても、特定のユーザーロールが作成できるエンティティセットの数をさらに制限 したい場合があります。
以下の例では、forceLoginモードが有効になっています。
「 Guest」 ロールを持つユーザーは 、 最大100個のエンティティセットに制限されます。
exposed Function authentify($credentials : Object) : Boolean
var $result:=False
Session.clearPrivileges()
If ($credentials.identifier="Guest")
Session.setPrivileges("")
Session.quotas.nbEntitySets:=100
$result:=True
Else
// Authenticate other users
// ...
Session.quotas.nbEntitySets:=200
$result:=True
End if
return $result
もちろん、forceLogin モードを使用しない場合でも、Session コマンドを使用して同様の方法でクォータを適用できます。
エンティティセットのデフォルトの非アクティブタイムアウトを設定する
デフォルトでは、 エンティティセットの 非アクティブタイムアウトは 2 時間 です 。 defaultEntitySetTimeout プロパティ(単位:秒)を更新することで変更できます。
Session.quotas.defaultEntitySetTimeout:=300 // 5 minutes
次のようなリクエストによって作成されたエンティティセットは、
/rest/People?$filter='ID>=1'&$method=entityset
は、その期間中に使用されない場合(つまり、リクエストで非アクティブタイムアウトが明示的に指定されていない場合)、5分後に自動的に解放されます。
エンティティセットの最大非アクティブタイムアウトを設定する
エンティティセットに許可される最大非アクティブタイムアウトは、maxEntitySetTimeout プロパティ(単位:秒)を更新することで、エンティティセットに許容される最大非アクティブタイムアウトを定義できます。
Session.quotas.maxEntitySetTimeout:=420 // 7 minutes
この制限を超える非アクティブタイムアウトでエンティティセットが作成された場合、自動的に 420 秒に制限されます。
たとえば、次のリクエストの場合:
/rest/People?$filter=ID>=4&$method=entityset&$timeout=600
要求された 600 秒のタイムアウトは無視されるため、エンティティセットは 420 秒後に解放されます。
添付のHDIをお試しいただき、今すぐアプリケーションの堅牢性を向上させてください!
現在、この投稿へのコメント機能は利用できません。