Wydajność w MSAL Node

Wymagania wstępne

Mierzenie wydajności

Aplikacje, które chcą mierzyć wydajność przepływów uwierzytelniania w MSAL Node, mogą robić to ręcznie, korzystając z interfejsów API Node.js do pomiaru wydajności lub podobnych. Poniżej znajduje się lista niektórych istotnych punktów danych, które można zebrać:

Data Meaning Sugestie
authType acquireToken* Interfejs API używany na potrzeby żądania tokenu Służy do identyfikowania użycia.
correlationId Identyfikator korelacji używany dla żądania tokenu. Można to uzyskać za pośrednictwem correlationId właściwości AuthenticationResult Służy do identyfikowania użycia.
durationTotalInMs Łączny czas spędzony w usłudze MSAL, w tym wywołania sieciowe i dostęp do pamięci podręcznej Alarm dotyczący ogólnego dużego opóźnienia (> 1 sekunda). Wartość zależy od źródła tokenu. Z pamięci podręcznej: jeden dostęp do pamięci podręcznej. Z sieci: dwa odwołania do pamięci podręcznej oraz dwa wywołania HTTP.
durationInCacheInMs Czas spędzony na ładowaniu lub zapisywaniu trwałości pamięci podręcznej tokenu (np. Redis). Alarm dotyczący skoków.
durationInHttpInMs Czas poświęcony na wykonywanie wywołań HTTP do dostawcy tożsamości (IdP), np. Microsoft Entra ID. Możesz użyć niestandardowego klienta sieciowego do bardziej szczegółowego monitorowania. Zobacz Przykład konfiguracji i niestandardowej sieci, aby uzyskać więcej informacji Alarm dotyczący skoków.
tokenSource Źródło tokenu (tj. pamięć podręczna a sieć). Można to uzyskać za pośrednictwem fromCache właściwości AuthenticationResult Tokeny są pobierane z pamięci podręcznej znacznie szybciej (np. ~100 ms w porównaniu z ok. 700 ms). Może służyć do monitorowania współczynnika trafień pamięci podręcznej i alarmowania o nim. Użyj razem z durationTotalInMs.

Przykład:

    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
        }
    });

Zagadnienia dotyczące wydajności poufnych aplikacji klienckich

Ponieważ poufne aplikacje klienckie są używane głównie w scenariuszach po stronie serwera obejmujących współbieżne przetwarzanie żądań, zalecamy określanie zakresu wystąpień biblioteki MSAL ConfidenticalClientApplication (CCA) dla każdego użytkownika, żądania lub sesji.

Nowe wystąpienie CCA dla każdego żądania oznacza, że jego domyślna pamięć podręczna w pamięci początkowo nie będzie zawierać żadnych tokenów ani metadanych dotyczących sposobu uzyskiwania tokenów. W związku z tym instancję CCA, którą tworzysz, należy przygotować przed wysłaniem żądania tokenu, aby uniknąć spadku wydajności.

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;
};

Zobacz (CCA) interfejs API sieci Web używający niestandardowej wtyczki rozproszonej pamięci podręcznej, aby uzyskać więcej informacji.

Zobacz także