
example.com をEdgeOneに接続していると仮定します。ユーザーのIPアドレスのハッシュ値に基づいて、リクエストを常に対応するオリジンサーバーへルーティングすることを期待します。ユーザーがどこにいても、同じユーザーのリクエストが常に同じオリジンサーバーへルーティングされることを確保し、キャッシュ効率の最適化、セッション管理の簡素化、CLBの実現、パーソナライズされたサービスの提供に役立ち、データ処理の法令遵守を確保します。X-Forwarded-For-Origin:originGroup1。シンガポールのオリジンサーバーへ転送する必要があるIPに対して、エッジ関数を通じてオリジンリクエストヘッダーを追加します:X-Forwarded-For-Origin:originGroup2。// クライアントIPアドレスに基づいて、異なるオリジンサーバーグループへ戻ります。つまり、IPアドレスが変わらない場合、同じクライアントは同じオリジンサーバーへ戻ります。const ORIGIN_GROUPS = ["originGroup1", "originGroup2"];// 仮想ノード数を定義します。オリジンサーバーグループ(ORIGIN_GROUPS)が多い場合は、仮想ノード数を低く調整することをお勧めします。const VIRTUAL_NODES_PER_GROUP = 15;const ORIGIN_HEADER_NAME = 'X-Forwarded-For-Origin';let virtualNodesHashesCache = null;// 関数の呼び出し回数を追跡するためにグローバル変数を定義します。addEventListener("fetch", (event) => {handleRequest(event.request);});async function handleRequest(request) {// EO-Client-IPヘッダーを使用してクライアントIPを取得します。const ip = request.headers.get("EO-Client-IP") || "";// キャッシュに仮想ノードハッシュ値がない場合は、仮想ノードハッシュ値を生成します。if (!virtualNodesHashesCache) {virtualNodesHashesCache = await generateVirtualNodesHashes();}const group = await findSourceGroupForIp(ip,virtualNodesHashesCache.hashes,virtualNodesHashesCache.mapping);console.log(`Group: ${group}`);request.headers.set(ORIGIN_HEADER_NAME, group)return;}// 仮想ノードのハッシュ値を生成します。async function generateVirtualNodesHashes() {const virtualNodesHashes = {};for (let group in ORIGIN_GROUPS) {for (let i = 0; i < VIRTUAL_NODES_PER_GROUP; i++) {const virtualNodeIdentifier = `${group}-VN${i}`;const hash = await md5(virtualNodeIdentifier);if (!virtualNodesHashes[hash]) {virtualNodesHashes[hash] = group;}}}const hashes = Object.keys(virtualNodesHashes).sort();return { hashes, mapping: virtualNodesHashes }; // ソート済みのハッシュ値配列とマッピングを返します。}// クライアントIPを仮想ノードにマッピングし、対応するオリジンサーバーグループを見つけます。async function findSourceGroupForIp(ip, hashes, mapping) {// md5関数を使用してIPのハッシュ値を計算します。const ipHash = await md5(ip);let closestHash = hashes.find((hash) => hash > ipHash) || hashes[0];// 見つかった仮想ノードハッシュ値に基づいて、仮想ノードハッシュテーブルから対応するオリジンサーバーグループ名を取得します。const selectedGroupName = mapping[closestHash];const selectedGroupIPs = ORIGIN_GROUPS[selectedGroupName];// クライアントIP、ハッシュ値、最も近い仮想ノードハッシュ値、選択されたオリジンサーバーグループ名を表示するログを出力します。console.log(`IP: ${ip}, Hash: ${ipHash}, Closest Hash: ${closestHash}, Selected Group: ${selectedGroupName}`);// 選択されたオリジンサーバーグループ名を返します。return selectedGroupIPs;}function bufferToHex(arr) {return Array.prototype.map.call(arr, (x) => (x >= 16 ? x.toString(16) : "0" + x.toString(16))).join("");}async function md5(text) {const buffer = await crypto.subtle.digest("MD5", TextEncoder().encode(text));return bufferToHex(new Uint8Array(buffer));}

example.comと等しい場合のみ設定します。
example.comと等しい場合のみ設定します。EO-Client-IPのみ設定します。X-Forwarded-For-OriginがoriginGroup1と等しい場合にのみ、リクエストは中国本土のオリジンサーバーグループに転送されて処理されます。条件がHTTPリクエストヘッダーX-Forwarded-For-OriginがoriginGroup2と等しい場合、リクエストはシンガポールのオリジンサーバーグループに転送されて処理されます。 
フィードバック