Kinerja di MSAL Node

Prasyarat

  • Lihat Performa di Browser MSAL yang menguraikan teknik yang dapat digunakan aplikasi Anda untuk meningkatkan performa akuisisi token menggunakan MSAL.
  • Node.js

Mengukur kinerja

Aplikasi yang ingin mengukur performa alur autentikasi di MSAL Node dapat melakukannya secara manual, menggunakan API pengukuran performa Node atau sejenisnya. Di bawah ini adalah daftar beberapa poin data penting yang dapat Anda kumpulkan:

Data Meaning Saran
authType acquireToken* API yang digunakan untuk permintaan token Gunakan untuk mengidentifikasi penggunaan.
correlationId ID korelasi yang digunakan untuk permintaan token. Anda dapat memperoleh ini melalui correlationId properti di AuthenticationResult Gunakan untuk mengidentifikasi penggunaan.
durationTotalInMs Total waktu yang dihabiskan di MSAL, termasuk panggilan jaringan dan akses cache Alarm pada latensi tinggi keseluruhan (> 1 detik). Nilai tergantung pada sumber token. Dari cache: satu akses cache. Dari jaringan: dua akses cache ditambah dua panggilan HTTP.
durationInCacheInMs Waktu yang dihabiskan untuk memuat atau menyimpan persistensi cache token (misalnya Redis). Alarm saat terjadi lonjakan.
durationInHttpInMs Waktu yang dihabiskan untuk melakukan panggilan HTTP ke IdP (misalnya Microsoft Entra ID). Anda dapat menggunakan klien jaringan kustom untuk pemantauan yang lebih halus. Lihat Konfigurasi dan sampel jaringan kustom untuk informasi selengkapnya Alarm saat terjadi lonjakan.
tokenSource Sumber token (yaitu cache vs jaringan). Anda dapat memperoleh ini melalui fromCache properti di AuthenticationResult Token diambil dari cache jauh lebih cepat (misalnya ~ 100 ms versus ~ 700 ms). Dapat digunakan untuk memantau dan memberikan alarm terkait rasio hit cache. Gunakan bersama dengan durationTotalInMs.

Contohnya:

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

Pertimbangan performa untuk aplikasi klien rahasia

Karena aplikasi klien rahasia terutama digunakan dengan skenario sisi server yang melibatkan pemrosesan permintaan secara bersamaan, kami sarankan untuk mencakup instans MSAL ConfidenticalClientApplication (CCA) untuk setiap pengguna, permintaan, atau sesi.

Instans CCA baru untuk setiap permintaan berarti cache dalam memori defaultnya awalnya tidak akan berisi token atau metadata apa pun tentang cara memperoleh token. Dengan demikian, instans CCA yang Anda buat harus disiapkan sebelum permintaan token untuk menghindari performa yang buruk.

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

Lihat API Web (CCA) menggunakan plugin cache terdistribusi kustom untuk informasi selengkapnya.

Baca juga