Prestanda i MSAL Node

Förutsättningar

  • Se Prestanda i MSAL Browser som beskriver de tekniker som ditt program kan använda för att förbättra prestanda för tokenförvärv med hjälp av MSAL.
  • Node.js

Mäta prestanda

Program som vill mäta prestanda för autentiseringsflöden i MSAL Node kan göra det manuellt med hjälp av Nodes API:er för prestandamätning eller liknande. Nedan visas en lista över några viktiga datapunkter som du kan samla in:

data Meaning Suggestions
authType acquireToken* API som används för tokenbegäran Används för att identifiera användning.
correlationId Korrelations-ID som används för tokenbegäran. Du kan hämta detta via egenskapen correlationId i AuthenticationResult Används för att identifiera användning.
durationTotalInMs Total tid i MSAL, inklusive nätverksanrop och cacheåtkomst Larm om övergripande långa svarstider (> 1 sekund). Värdet beror på tokenkällan. Från cachen: en åtkomst till cachen. Från nätverket: två cacheåtkomster plus två HTTP-anrop.
durationInCacheInMs Tid som används för att ladda eller spara den beständiga lagringen av tokencache (t.ex. Redis). Larm vid toppar.
durationInHttpInMs Tid som ägnas åt att göra HTTP-anrop till IdP (t.ex. Microsoft Entra ID). Du kan använda en anpassad nätverksklient för mer detaljerad övervakning. Mer information finns i Konfiguration och anpassat nätverksexempel Larm vid toppar.
tokenSource Källa för token (dvs. cache jämfört med nätverk). Du kan hämta detta via egenskapen fromCache i AuthenticationResult Token hämtas från cachen mycket snabbare (t.ex. ~100 ms jämfört med ~700 ms). Kan användas för att övervaka och varna för cacheträffförhållandet. Använd tillsammans med durationTotalInMs.

Ett exempel:

    const { PerformanceObserver, performance } = require('node:perf_hooks');

    const perfObserver = new PerformanceObserver((items) => {
        items.getEntries().forEach((entry) => {
            console.log(entry);
        })
    });

    perfObserver.observe({ entryTypes: ["measure"], buffered: true });

    // ...

    performance.mark("acquireTokenByClientCredential-start");

    const tokenResponse = await msalInstance.acquireTokenByClientCredential({
        scopes: ["User.Read.All"],
    });

    performance.mark("acquireTokenByClientCredential-end");

    performance.measure("acquireTokenByClientCredential", {
        start: "acquireTokenByClientCredential-start"
        end: "acquireTokenByClientCredential-end"
        detail: {
            tokenSource: tokenResponse.fromCache
            correlationId: tokenResponse.correlationId
        }
    });

Prestandaöverväganden för konfidentiella klientprogram

Eftersom konfidentiella klientprogram främst används med scenarier på serversidan som omfattar samtidig bearbetning av begäranden rekommenderar vi att MSAL-instanser ConfidenticalClientApplication (CCA) används för varje användare, begäran eller session.

En ny CCA-instans för varje begäran innebär att dess standardminnescache initialt inte innehåller några token eller metadata om hur du hämtar token. Därför bör den CCA-instans som du skapar förberedas före tokenbegäran för att undvika dåliga prestanda.

import {
    ConfidentialClientApplication,
    AuthenticationResult,
    CryptoProvider,
    OnBehalfOfRequest
} from "@azure/msal-node";

function getMsalInstance(partitionKey: string): ConfidentialClientApplication {
    return new ConfidentialClientApplication({
        auth: {
            clientId: "ENTER_CLIENT_ID",
            authority: "http://login.microsoftonline.com/ENTER_TENANT_ID"
            cloudDiscoveryMetadata: "PROVIDE_STRINGIFIED_DISCOVERY_METADATA"
            authorityMetadata: "PROVIDE_STRINGIFIED_AUTHORITY_METADATA"
        },
        cache: {
            cachePlugin: new CustomCachePlugin(
                this.cacheClientWrapper,
                partitionKey
            )
        }
    });
};

async function getToken(tokenRequest: OnBehalfOfRequest): Promise<AuthenticationResult | null> {
    const partitionKey = await this.cryptoProvider.hashString(tokenRequest.oboAssertion);

    const cca = getMsalInstance(partitionKey);

    let tokenResponse = null;

    try {
        await cca.getTokenCache().getAllAccounts(); // required for cache read
        tokenResponse = await cca.acquireTokenOnBehalfOf(tokenRequest);
    } catch (error) {
        throw error;
    }

    return tokenResponse;
};

Läs mer i CCA-webb-API med en anpassad plugin för distribuerad cache.

Se även