Node.js 和 DAX - Amazon DynamoDB

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Node.js 和 DAX

DAX SDK for Node.js v3.x 相容於 AWS SDK for Node.js v3.x。DAX SDK for Node.js v3.x 支援使用彙總用戶端。請注意,DAX 不支援建立裸機用戶端。如需不支援功能的詳細資訊,請參閱 功能與 AWS SDK V3 不相同

請按照此程序操作,在 Amazon EC2 執行個體上執行 Node.js 範例應用程式。

執行 DAX 的 Node.js 範例
  1. 在您的 Amazon EC2 執行個體上設定 Node.js,如下所示:

    1. 安裝節點版本管理工具 (nvm)。

      curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
    2. 使用 nvm 安裝 Node.js。

      nvm install 18
    3. 使用 nvm 來使用 Node 18

      nvm use 18
    4. 測試 Node.js 已安裝且正常運作。

      node -e "console.log('Running Node.js ' + process.version)"

      這應該會顯示以下訊息。

      Running Node.js v18.x.x

  2. 使用節點套件管理工具 (npm) 安裝 DaxDocument Node.js 用戶端。

    npm install @amazon-dax-sdk/lib-dax

TryDax 範本程式碼

若要評估 DynamoDB Accelerator (DAX) 的效能優勢,請依照下列步驟執行範例測試,以比較標準 DynamoDB 和 DAX 叢集之間的讀取操作時間。

  1. 在設定工作空間並將 lib-dax 安裝為依存項目之後,請將 TryDax.js 複製到您的專案中。

  2. 針對 DAX 叢集執行程式。若要判斷您 DAX 叢集的端點,請選擇下列其中一個項目:

    • 使用 DynamoDB 主控台:選擇您的 DAX 叢集。叢集端點會在主控台上顯示,如以下範例。

      dax://my-cluster.l6fzcv.dax-clusters.us-east-1.amazonaws.com
    • 使用 AWS CLI :輸入下列命令。

      aws dax describe-clusters --query "Clusters[*].ClusterDiscoveryEndpoint"

      如下列範例所示,叢集端點會在輸出上顯示。

      { "Address": "my-cluster.l6fzcv.dax-clusters.us-east-1.amazonaws.com", "Port": 8111, "URL": "dax://my-cluster.l6fzcv.dax-clusters.us-east-1.amazonaws.com" }
  3. 現在請將叢集端點指定為命令列參數以執行程式。

    node TryDax.js dax://my-cluster.l6fzcv.dax-clusters.us-east-1.amazonaws.com

    您應該會看到類似下列的輸出:

    Attempting to create table; please wait... Successfully created table. Table status: ACTIVE Writing data to the table... Writing 20 items for partition key: 1 Writing 20 items for partition key: 2 Writing 20 items for partition key: 3 ... Running GetItem Test Total time: 153555.10 µs - Avg time: 383.89 µs Total time: 44679.96 µs - Avg time: 111.70 µs Total time: 36885.86 µs - Avg time: 92.21 µs Total time: 32467.25 µs - Avg time: 81.17 µs Total time: 32202.60 µs - Avg time: 80.51 µs Running Query Test Total time: 14869.25 µs - Avg time: 2973.85 µs Total time: 3036.31 µs - Avg time: 607.26 µs Total time: 2468.92 µs - Avg time: 493.78 µs Total time: 2062.53 µs - Avg time: 412.51 µs Total time: 2178.22 µs - Avg time: 435.64 µs Running Scan Test Total time: 2395.88 µs - Avg time: 479.18 µs Total time: 2207.16 µs - Avg time: 441.43 µs Total time: 2443.14 µs - Avg time: 488.63 µs Total time: 2038.24 µs - Avg time: 407.65 µs Total time: 1972.17 µs - Avg time: 394.43 µs Running Pagination Test Scan Pagination [ { pk: 1, sk: 1, someData: 'XXXXXXXXXX' }, { pk: 1, sk: 2, someData: 'XXXXXXXXXX' }, { pk: 1, sk: 3, someData: 'XXXXXXXXXX' } ] [ { pk: 1, sk: 4, someData: 'XXXXXXXXXX' }, { pk: 1, sk: 5, someData: 'XXXXXXXXXX' }, { pk: 1, sk: 6, someData: 'XXXXXXXXXX' } ] ... Query Pagination [ { pk: 1, sk: 1, someData: 'XXXXXXXXXX' }, { pk: 1, sk: 2, someData: 'XXXXXXXXXX' }, { pk: 1, sk: 3, someData: 'XXXXXXXXXX' } ] [ { pk: 1, sk: 4, someData: 'XXXXXXXXXX' }, { pk: 1, sk: 5, someData: 'XXXXXXXXXX' }, { pk: 1, sk: 6, someData: 'XXXXXXXXXX' } ] ... Attempting to delete table; please wait... Successfully deleted table.

    請記下計時資訊。GetItemQueryScan 測試所需的微秒數。

  4. 在此情況下,您會針對 DAX 叢集執行程式。現在您將再次執行該程式,但此次針對的是 DynamoDB。

  5. 現在重新執行程式,但這一次叢集端點 URL 並沒有作為命令列參數。

    node TryDax.js

    查看輸出,並記下計時資訊。使用 DAX 的 GetItemQueryScan 已耗用時間應遠低於使用 DynamoDB 的已耗用時間。

功能與 AWS SDK V3 不相同

  • 裸機用戶端:Dax Node.js V3 不支援裸機用戶端。

    const dynamoDBClient = new DynamoDBClient({ region: 'us-west-2' }); const regularParams = { TableName: 'TryDaxTable', Key: { pk: 1, sk: 1 } }; // The DynamoDB client supports the send operation. const dynamoResult = await dynamoDBClient.send(new GetCommand(regularParams)); // However, the DaxDocument client does not support the send operation. const daxClient = new DaxDocument({ endpoints: ['your-dax-endpoint'], region: 'us-west-2', }); const params = { TableName: 'TryDaxTable', Key: { pk: 1, sk: 1 } }; // This will throw an error - send operation is not supported for DAX. Please refer to documentation. const result = await daxClient.send(new GetCommand(params)); console.log(result);
  • 中介軟體堆疊:Dax Node.js V3 不支援使用中介軟體函式。

    const dynamoDBClient = new DynamoDBClient({ region: 'us-west-2' }); // The DynamoDB client supports the middlewareStack. dynamoDBClient.middlewareStack.add( (next, context) =>> async (args) => { console.log("Before operation:", args); const result = await next(args); console.log("After operation:", result); return result; }, { step: "initialize", // or "build", "finalizeRequest", "deserialize" name: "loggingMiddleware", } ); // However, the DaxDocument client does not support the middlewareStack. const daxClient = new DaxDocument({ endpoints: ['your-dax-endpoint'], region: 'us-west-2', }); // This will throw an error - custom middleware and middlewareStacks are not supported for DAX. Please refer to documentation. daxClient.middlewareStack.add( (next, context) => async (args) => { console.log("Before operation:", args); const result = await next(args); console.log("After operation:", result); return result; }, { step: "initialize", // or "build", "finalizeRequest", "deserialize" name: "loggingMiddleware", } );