> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kameleoon.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 技術的考慮事項

> Kameleoon SDK がフィーチャーフラグ設定の更新、ゼロレイテンシバケッティング、ポーリングとストリーミングの違い、クライアントサイドとサーバーサイドの初期化をどのように処理するかを理解しましょう。

## フィーチャーフラグの設定とバケッティング

フィーチャーフラグの設定が更新されたり、オン/オフが切り替えられたりすると、SDK は **ポーリング** または **ストリーミング** のいずれかを使用して、Cloudflare Content Delivery Network (CDN) から更新された設定を取得できます。ポーリングはデフォルトのオプションで、ストリーミングはプレミアムオプションです。

Kameleoon SDK は **ゼロレイテンシポリシー** に準拠するよう設計されています。これは、SDK がユーザーをフィーチャーフラグでアクティブ化およびバケット化するために追加のリモートサーバー呼び出しを必要としないことを意味します。最速のリモートサーバー呼び出しでも、アプリケーションに最低 20 ms のレイテンシが追加され、いくつかの要因によりこの遅延は数百ミリ秒に増加したり、エンドユーザーの Web アプリケーションの読み込みを完全にブロックする可能性があります。この追加レイテンシを防ぐため、Kameleoon SDK は訪問者をローカルで実験に割り当てます。

<Warning>
  ユーザーのデバイスで動作するクライアントサイド SDK の場合、アプリはセッション開始時にアクティブなフィーチャーフラグ設定を取得する必要があります。これには関連するコールバックを伴うリモート呼び出しが必要で、SDK を使用するアプリケーションコードは、このコールバックの実行が完了するまで実験を実行したりフィーチャーフラグを適用したりできないことを意味します。
</Warning>

### ポーリング（デフォルト）

このモードでは、SDK は定期的な間隔（デフォルトでは 60 分ごと）に CDN にリクエストを送信し、最新の設定を取得します。この間隔は SDK 設定で `refresh_interval_minute`（または `refresh_interval`）パラメーターを使用してカスタマイズできます。

<Check>
  間隔が適度に開けられている場合、設定の更新は非常に少ないメモリとネットワークリソースしか消費しません。
</Check>

<Note>
  Web クライアントサイド SDK の場合、ポーリング戦略にはローカルキャッシングロジックが含まれます：

  1. **初期ロード**: Web ページが開かれると、SDK はまずキャッシュ（利用可能な場合）から設定をロードしようとします。
  2. **バックグラウンド更新**: `refresh_interval` が経過した場合、SDK は設定を更新するためにバックグラウンドリクエストを実行し、キャッシュをリフレッシュします。
  3. **キャッシュの有効性**: キャッシュされた設定は、最後の正常な更新から **1.5 時間** 有効と見なされます。訪問者がこの 1.5 時間以内にページを開く場合、キャッシュされたバージョンが使用されます。それ以外の場合、キャッシュは無視され、すぐに新しいリクエストが行われます。

  このキャッシング戦略により、ページ読み込みが高速化され、ネットワーク使用量が最小限に抑えられる一方で、設定は適度に新鮮に保たれます。

  たとえば、`refresh_interval` が 15 分に設定されており、ユーザーがフィーチャーフラグに公開されているとします。フィーチャーフラグが **10 分後** にオフにされ、同じユーザーが 20 分後に Web サイトに戻った場合：

  * SDK はまず **キャッシュから設定をロード** します（依然としてフラグがアクティブとして表示されます）。
  * 同時に **バックグラウンドリクエスト** を行って、更新された設定を取得しキャッシュをリフレッシュします。
  * この設計は **パフォーマンス** を優先し、ページの素早い読み込みを保証しながら、最新の設定と非同期に同期します。

  したがって、ユーザーが古い設定を見る可能性のある短い期間があるとしても（間隔次第）、SDK はバックグラウンドで素早く更新します。更新された設定は、訪問者が次にページを開いたときに適用されます。
</Note>

### ストリーミング（プレミアムオプション）

リアルタイムストリーミングモードにより、SDK は遅延なしで新しい設定を自動的に適用できます。ストリーミングが有効になっている場合、Kameleoon SDK は server-sent events (SSE) のおかげで、設定への変更をリアルタイムで通知されます。

**主な利点：**

* 設定を即座に更新します（次のポーリングサイクルを待つ必要がありません）。
* 短い間隔でのポーリングよりもネットワークトラフィックが少なくなります。ストリーミングは定期的なリクエストを送信しません。接続を一度開き、それを永続的に開いた状態に保ち、データを受信する準備が整います。

**利用可能性：**

* これはサブスクリプションが必要なプレミアムオプションです。Kameleoon アカウントでリアルタイムストリーミングをアクティブ化するには、カスタマーサクセスマネージャーに連絡するか、[support@kameleoon.com](mailto:support@kameleoon.com) にメールしてください。
* PHP SDK は技術的な制約のためストリーミングをサポートしていません。PHP SDK は現在、リクエスト間で永続化されないため、ノンブロッキング方式で設定の更新をリッスンできません。各リクエストは、応答を受け取るとすぐに自己破棄する新しい SDK インスタンスを作成します。
* リアルタイムストリーミングモードは現在、[サーバーレスエッジコンピューティングプラットフォーム](../implementation-and-deployment/serverless-edge-compute-starter-kits) と互換性がありません。
* その他の言語については、[SDK 互換性マトリックス](../../feature-experimentation/get-started/overview) で希望する言語の最小サポートバージョンをご確認ください。

## データストレージ

Kameleoon の SDK は、最適なパフォーマンスとユーザーエクスペリエンスのために設計されています。これを実現するため、SDK はリモートソースから取得する代わりに、訪問者データをサーバー上またはデバイス上で直接ローカルに管理します。

Kameleoon の実験およびフィーチャーフラグに関連するすべての訪問者データ（実験割り当て、セグメントデータ、`addData()` のようなメソッドで追加されたカスタムデータ、または `getRemoteVisitorData()` でサーバーから取得されたデータを含む）はローカルに保存されます。**このデータが保存される方法と寿命は、サーバーサイド SDK またはクライアントサイド SDK のどちらが使用されるかによって異なります。**

### サーバーサイド SDK

**サーバーサイド SDK の場合、訪問者データはサーバーの揮発性メモリ（RAM）に保存され**、実験およびフィーチャーフラグの評価に高速アクセスを提供します。データは、一意の `visitorCode` 値をキーとするマップとして整理されます。

* **セッションベースのストレージ:** データは、ユーザーのアクティブセッションの間のみメモリに保持されます。これはデフォルトでは、30 分間アクティビティ（ページビュー、クリックなど）がないと終了します。セッション中に収集されたすべてのデータは同時に期限切れになります。
  * **`session_duration` パラメーター**: セッション期間は、SDK 設定で `session_duration` パラメーターを使用して調整できます。このパラメーターにより、Kameleoon セッションをアプリケーションのサーバーサイド管理と整合させることができます。

<Warning>
  `session_duration` を増やすと、増加した訪問者データを保存するために SDK がより多くの RAM を割り当てる必要があります
</Warning>

* **サーバー再起動時のデータ損失:** データは RAM に保存されるため、アプリケーションサーバーが再起動すると失われます。通常、重要な訪問者データ（ユーザー ID や属性など）は永続データベースから取得され、新しいリクエスト時に訪問者に再割り当てされるため、データ損失は懸念事項ではありません。
* **以前の訪問からのデータ取得:** `getRemoteVisitorData()` メソッドを使用すると、訪問者の以前の訪問中に収集されたカスタムデータを取得できます。このメソッドは訪問者の最新のデータエントリを自動的に関連付けるため、`addData()` を再度呼び出す必要がありません。

### クライアントサイド SDK

**サーバーサイド SDK とは対照的に、クライアントサイド SDK はユーザーのデバイスにある永続的なローカルストレージを利用します。** このメカニズムにより、訪問者データはブラウザセッション、アプリの再起動、さらにはデバイスの再起動を通じて保持されます。具体的なストレージメカニズムはプラットフォームによって異なります：

* **iOS:** `UserDefaults`
* **Android:** `SharedPreferences`
* **JavaScript/TypeScript:** `LocalStorage`
  * **JS SDK 向けの注意:** `kameleoonVisitorCode` は、Kameleoon アプリケーションファイル（`engine.js`）とのシームレスなデータ継続性と通信を保証するため、Cookie 経由でも共有されます。
* **React Native:** `MMKV Storage`

グローバルな `session_duration` を使用するサーバーサイド SDK とは異なり、クライアントサイド SDK はすべてのデータに対してセッションベースの有効期限で動作しません。代わりに、`targetingDataCleanupInterval` または `data_expiration_interval_minute` を使用して、個々のデータの保存期間を制御します。

* **`targetingDataCleanupInterval`/`data_expiration_interval_minute`:** これらのパラメーターは、特定の各データエントリの個別の寿命を決定します。デフォルトでは、訪問間で一貫したユーザーエクスペリエンスを保証するため、データは無期限に保存されます（明示的にクリアされるまで）。個々のデータポイントを特定の時間後に有効期限切れにする必要がある場合は、このパラメーターを特定の分数に設定できます。
* **データの永続性:** この根本的な違いは、ユーザーがブラウザタブを閉じたり、サイトから離れたり、モバイルアプリケーションを閉じたりしても、データが永続することを意味します。
* **命名規則の根拠:** パラメーター用語の違い（`session_duration` 対 `data_expiration_interval_minute`）は、根本的なストレージの哲学を直接反映しています。`session_duration` は、サーバーサイドセッション内のすべてのデータの全体的な寿命を管理します。`data_expiration_interval_minute` は、クライアントに永続的に保存される特定の各データの寿命をきめ細かく制御できます。

## ドメインリスト

Kameleoon SDK は、SDK に特定のサービスを提供する一連の URI へのアクセスを必要とします。アクセスを制限していて、ドメインを明示的にホワイトリスト化する必要がある場合は、当社の SDK が以下のドメインに到達できるようにしてください：

| URL                                                                                         | 用途            |
| ------------------------------------------------------------------------------------------- | ------------- |
| `https://sdk-config.kameleoon.eu/<sitecode>`                                                | 設定ファイル        |
| `https://<sitecode>.kameleoon.io/sdk-config` / `https://client-config.kameleoon.com/mobile` | 設定ファイル（非推奨）   |
| `https://events.kameleoon.com:8110/sse`                                                     | リアルタイムストリーミング |
| `https://api.kameleoon.com/oauth/token`                                                     | 認証            |
| `https://eu-data.kameleoon.io`/ `https://na-data.kameleoon.io`                              | トラッキング        |

<Note>
  Kameleoon スクリプトのドメインはプロジェクトごとに異なる場合があります。プロジェクトは作成日に応じて `kameleoon.eu` または `kameleoon.io` のいずれかでホストされている場合があります。Kameleoon アプリのプロジェクトに表示されているドメインを使用していることを確認してください。
</Note>
