MSAL Node'da Performans

Prerequisites

Performansı ölçme

MSAL Node'da kimlik doğrulama akışlarının performansını ölçmek isteyen uygulamalar, Node'un performans ölçüm API'lerini veya benzerlerini kullanarak bunu el ile yapabilir. Aşağıda, toplayabileceğiniz bazı önemli veri noktalarının listesi yer alır:

Veri Meaning Öneriler
authType acquireToken* Belirteç isteği için kullanılan API Kullanımı tanımlamak için kullanın.
correlationId Belirteç isteği için kullanılan korelasyon kimliği. Bunu correlationId içindeki özelliği aracılığıyla alabilirsiniz Kullanımı tanımlamak için kullanın.
durationTotalInMs Ağ çağrıları ve önbellek erişimi dahil olmak üzere MSAL'de harcanan toplam süre Genel yüksek gecikme alarmı (> 1 saniye). Değer belirteç kaynağına bağlıdır. Önbellekten: 1 önbellek erişimi. Ağdan: iki önbellek erişimi ve iki HTTP çağrısı.
durationInCacheInMs Belirteç önbelleğini yüklemek veya kaydetmek için harcanan süre (örneğin Redis üzerinde). Ani artışlarda alarm.
durationInHttpInMs IdP'ye HTTP çağrıları yapmak için harcanan süre (örneğin, Microsoft Entra ID). Daha ayrıntılı izleme için özel bir ağ istemcisi kullanabilirsiniz. Daha fazla bilgi için bkz. Yapılandırma ve özel ağ örneği Ani artışlarda alarm.
tokenSource Belirtecin kaynağı (önbellek ve ağ). Bunu fromCache içindeki özelliği aracılığıyla alabilirsiniz Belirteçler önbellekten çok daha hızlı alınır (ör. ~100 ms ile ~700 ms). Önbellek isabet oranını izlemek ve uyarı vermek için kullanılabilir. durationTotalInMs ile birlikte kullanın.

Örneğin:

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

Gizli istemci uygulamaları için performansla ilgili dikkat edilmesi gerekenler

Gizli istemci uygulamaları öncelikli olarak isteklerin eşzamanlı olarak işlenmesini içeren sunucu tarafı senaryolarla kullanıldığından, MSAL ConfidenticalClientApplication (CCA) örneklerini her kullanıcı, istek veya oturum için kapsamanızı öneririz.

Her istek için yeni bir CCA örneği, varsayılan bellek içi önbelleğinin başlangıçta belirteçlerin nasıl alınacağıyla ilgili herhangi bir belirteç veya meta veri içermeyeceği anlamına gelir. Bu nedenle, düşük performanstan kaçınmak için oluşturduğunuz CCA örneği belirteç isteğinden önce hazırlanmalıdır.

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

Daha fazla bilgi için bkz. (CCA) Özel dağıtılmış önbellek eklentisi kullanan Web API'si .

Ayrıca bakınız