Skip to content

Group Lines - 路由群組最佳化指南

概述

使用 testLinegetGroupResult 方法高效管理多條服務器路線,確保資源分配到性能最佳的服務器,並實現動態路由優化。

⚠️ 注意事項

  • 當返回值為空字串 (""),務必實作備換機制,以避免錯誤或服務中斷。
  • 返回結果 (result) 中的每條路線均必須進行測試,確保其可用性。如果路線不可用,請切換至其他可用路線,或實作備換機制。
  • typegroup 參數必須和前面通過 testLine 配置過的群組名稱相符,否則可能無法正確取得性能資料。

testLine( type, group, lines ) - 建立路由群組

描述

testLine 方法用於建立指定群組名稱的新路由群組。這是整個動態路由優化的起點。

語法

javascript
import JBLWebSocket from '@/assets/js/jbl.es.js';
const authorizationKey = '${Product authorization key}';

JBLWebSocket.connect(authorizationKey);
JBLWebSocket.testLine(type, group, lines);

參數說明

參數類型描述
typeString必填 指定類型,選項為 site3r,分別對應網站或第三方服務。
groupString必填 群組名稱,用於識別路由群組。
linesString必填 服務器路線位址,格式為逗號分隔的字串 (例:api.dome1.com,api.dome2.com)

範例

javascript
// 建立一個名為 "Group1" 的路由群組,包含兩條服務器路線
JBLWebSocket.testLine('site', 'Group1', 'api.dome1.com,api.dome2.com');

// 為第三方服務設定類型
JBLWebSocket.testLine('3r', 'ThirdPartyGroup', 'api.thirdparty.com,api.backup.com');

getGroupResult( type, group ) - 獲取最佳路線

描述

getGroupResult 方法用於獲取指定 typegroup name 的最新服務器路線性能數據(速度和使用情況)。這是動態選擇最佳路線的關鍵步驟。

為何先執行 testLine 再調用 getGroupResult?

在調用 getGroupResult 之前,必須先執行 testLine。這樣可以確保服務器已經初始化並填充路由群組。否則,getGroupResult 可能會返回空數據或過時的結果。

jblResult如何透過WebSocket自動更新?

當 JBLWebSocket.getGroupResult(type, group) 被調用時,它返回的是一個物件的引用,而不是一個靜態值。 WebSocket 會在內部持續更新這個物件,這意味著即使開發者沒有手動監聽 WebSocket 事件,jblResult 依然會自動接收即時更新。 這讓開發者可以直接存取 jblResult,而不需要重複調用 getGroupResult() 來手動刷新數據。

語法

javascript
import JBLWebSocket from '@/assets/js/jbl.es.js';
const authorizationKey = '${Product authorization key}';

await JBLWebSocket.connect(authorizationKey);
JBLWebSocket.testLine(type, group, lines);

let jblResult = await JBLWebSocket.getGroupResult('site', 'Group1');

參數說明

參數類型描述
typeString必填 指定類型,選項為 site3r,分別對應網站或第三方服務。
groupString必填 群組名稱,用於識別路由群組。

基本範例

javascript
import JBLWebSocket from '@/assets/js/jbl.es.js';

const authorizationKey = ${Product authorization key};

// 建立 WebSocket 連接
JBLWebSocket.connect(authorizationKey);
// 建立一個名為 "Group1" 的路由群組,包含兩條服務器路線
JBLWebSocket.testLine('site', 'Group1', 'api.dome1.com,api.dome2.com');

// 獲取 `jblResult`,它保持對 WebSocket 內部數據的引用
let jblResult = await JBLWebSocket.getGroupResult('site', 'Group1');

// 即使沒有手動監聽 WebSocket 事件,
// `jblResult` 也是對 WebSocket 內部數據的引用。
// 任何 WebSocket 推送的更改都會直接更新 `jblResult`。
console.log('初始化的最佳服務器路線:', jblResult);
// 示例輸出: { site_Group1: 'api.dome1.com' }

🔍 WebSocket 群組路由更新機制

1️⃣ 群組初始化與首次更新延遲

  • 如果服務器沒有現有的群組配置,則必須先通過 testLine 發送群組設置。
  • testLine 發送後,服務器大約需要一分鐘才能完成結果更新並在 getGroupResult 中獲取到最新的數據。
  • 在此等待期間,任何對 getGroupResult() 的調用都可能返回空數據,直到首次更新循環完成。

2️⃣ 數據過期的自動重置

  • 如果服務器長時間未接收到指定群組的新數據,則會自動清除結果。
  • 這可以防止過時或不準確的路由信息,並在有新數據時重新計算最佳路線。

3️⃣ 每分鐘自動更新機制

  • 服務器每分鐘更新一次群組結果,確保獲取最新的路由數據。
  • 如果在一分鐘內沒有新的更新,服務器會自動清除結果,直到接收到新數據。
  • 如果在一分鐘內有更新,則保留最新的路由數據,並通過 getGroupResult() 獲取。

結果處理與備換機制

當返回值為空字串時,您需要實作自己的備換機制,以避免潛在的錯誤。例如:

javascript
let jblResult = await JBLWebSocket.getGroupResult('site', 'Group1');

if (!jblResult || !jblResult.site_Group1) {
    console.error('沒有可用的服務器路線,請實作備換機制。');
    // 在這裡添加您的備換邏輯
} else {
    console.log(`最佳路線:${jblResult.site_Group1}`);

    // 測試該路線的可用性
    const fetchTestLine = async (url) => {
        try {
            const response = await fetch(url, { method: 'HEAD' });
            return response.ok;
        } catch (err) {
            console.error(`${url} 測試失敗:`, err);
            return false;
        }
    };

    const isAvailable = await fetchTestLine(jblResult.site_Group1);

    if (!isAvailable) {
        console.error('主路線不可用,正在切換到備換路線...');
        // 在這裡添加您的備換邏輯
    }
}

這樣的重組更聚焦技術要點,同時也讓整體結構更加流暢!🚀 如果還有需要調整的地方,隨時說!