All Products
Search
Document Center

Alibaba Cloud Service Mesh:Implementasikan pembatasan laju token LLM berdasarkan header permintaan

Last Updated:Mar 12, 2026

Service Mesh (ASM) membatasi jumlah token yang dapat dikonsumsi oleh klien tertentu saat memanggil layanan model bahasa besar (LLM). Pembatasan laju diterapkan berdasarkan atribut permintaan seperti atribut TCP, Header HTTP, path, host, dan entri rute tujuan. Jika klien melebihi kuota tokennya, proxy sidecar akan mengembalikan tanggapan pembatasan laju alih-alih meneruskan permintaan ke layanan LLM hulu.

Kasus penggunaan

  • Kendalikan biaya API LLM: Layanan LLM eksternal umumnya menagih berdasarkan konsumsi token. Pembatasan laju token membatasi pengeluaran per klien atau tier pengguna, sehingga mencegah lonjakan biaya tak terduga.

  • Lindungi layanan inferensi bersama: Saat klien eksternal memanggil layanan inferensi di kluster Anda, pembatasan laju token mencegah satu klien saja mendominasi sumber daya komputasi dan menurunkan ketersediaan bagi pengguna lain.

Cara kerja

ASM mengimplementasikan pembatasan laju token LLM melalui dua komponen berbasis WebAssembly (Wasm):

  • Plugin pembatasan laju — Plugin Wasm yang diterapkan sebagai filter sidecar. Plugin ini mencegat setiap permintaan LLM keluar, mengekstrak kunci pembatasan laju (misalnya, nilai header user-type), lalu menanyakan layanan pembatasan laju untuk menentukan apakah permintaan boleh diteruskan atau ditolak.

  • Layanan pembatasan laju — Layanan backend yang dikelola oleh klien, yang melacak konsumsi token dan menerapkan aturan pembatasan laju. Plugin pembatasan laju ASM memanggil layanan ini menggunakan antarmuka HTTP standar. ASM menyediakan implementasi bawaan yang menggunakan algoritma token bucket dengan Redis sebagai backend penyimpanan. Untuk menerapkan logika kustom, buat layanan Anda sendiri menggunakan algoritma apa pun (token bucket, leaky bucket, atau jendela geser). Anda juga dapat menyesuaikan aturan pembatasan laju secara dinamis berdasarkan beban layanan backend.

Architecture diagram

Alur permintaan:

  1. Klien mengirim permintaan LLM melalui proxy sidecar.

  2. Plugin Wasm mengekstrak kunci pembatasan laju dari header permintaan.

  3. Plugin menanyakan layanan pembatasan laju untuk memeriksa apakah kunci tersebut telah melebihi kuota tokennya.

  4. Jika masih tersisa kuota, permintaan diteruskan ke layanan LLM. Jika kuota habis, proxy mengembalikan tanggapan pembatasan laju (misalnya, regular-user is being rate-limited).

  5. Layanan LLM memproses permintaan dan mengembalikan tanggapan yang mencakup data penggunaan token dalam bidang usage (misalnya, prompt_tokens, completion_tokens, dan total_tokens).

  6. Plugin melaporkan jumlah token yang dikonsumsi kembali ke layanan pembatasan laju untuk memperbarui catatan.

Catatan

Langkah 6 berjalan secara asinkron dan tidak menghalangi tanggapan LLM sampai ke klien.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

Langkah 1: Terapkan layanan pembatasan laju

Langkah ini menerapkan layanan pembatasan laju yang menggunakan algoritma token bucket untuk memberlakukan kuota token per pengguna. Contoh ini mendefinisikan dua tier pengguna — regular-user dan subscriber — dengan alokasi token yang berbeda.

  1. Buat file bernama token-limit.yaml dengan konten berikut:

    Lihat konten YAML

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: asm-llm-token-rate-limit-example
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: asm-llm-token-rate-limit-example
      labels:
        app: asm-llm-token-rate-limit-example
        service: asm-llm-token-rate-limit-example
    spec:
      ports:
      - name: http
        port: 80
        targetPort: 8080
      selector:
        app: asm-llm-token-rate-limit-example
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: asm-llm-token-rate-limit-example
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: asm-llm-token-rate-limit-example
          version: v1
      template:
        metadata:
          labels:
            app: asm-llm-token-rate-limit-example
            version: v1
          annotations:
            sidecar.istio.io/inject: "true"
        spec:
          tolerations:
          - key: "node.kubernetes.io/disk-pressure"
            operator: "Equal"
            value: ""
            effect: "NoSchedule"
          serviceAccountName: asm-llm-token-rate-limit-example
          containers:
          - image: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-wasm-token-rate-limit-example:v1.23.6.34-g92d6a4b-aliyun
            imagePullPolicy: IfNotPresent
            name: asm-llm-token-rate-limit-example
            ports:
            - containerPort: 8080
            env:
            # Koneksi Redis: ganti dengan endpoint dan port Redis Anda
            - name: REDIS_ADDRESS
              value: ${redis-address}:${redis-port}
            # Kredensial Redis: ganti dengan username dan password Redis Anda
            - name: REDIS_PASSWORD
              value: "${redis-user}:${password}"
            # Aturan pembatasan laju: satu entri per tier pengguna
            - name: RATE_LIMIT_CONFIG
              value: |
                [
                  {
                    "rate_limit_key_regex": "regular-user.*",
                    "redis_expired_seconds": 300,
                    "fill_interval_second": 30,
                    "tokens_per_fill": 50,
                    "max_tokens": 200
                  },
                  {
                    "rate_limit_key_regex": "subscriber.*",
                    "redis_expired_seconds": 600,
                    "fill_interval_second": 60,
                    "tokens_per_fill": 100,
                    "max_tokens": 1000
                  }
                ]
            resources:
              limits:
                memory: 256Mi
                cpu: 200m
              requests:
                memory: 64Mi
                cpu: 50m

    Ganti placeholder berikut dengan nilai aktual Anda:

    PlaceholderDeskripsiContoh
    ${redis-address}Alamat host Redisr-bp1xxxxxx.redis.rds.aliyuncs.com
    ${redis-port}Nomor port Redis6379
    ${redis-user}Username Redisdefault
    ${password}Password RedisMyP@ssw0rd

    Variabel lingkungan RATE_LIMIT_CONFIG mendefinisikan aturan token bucket. Setiap aturan mencocokkan kunci pembatasan laju berdasarkan regex dan menerapkan bucket terpisah:

    ParameterDeskripsi
    rate_limit_key_regexPola regex untuk mencocokkan kunci pembatasan laju yang diekstrak dari header permintaan.
    max_tokensKapasitas maksimum bucket token. Permintaan yang akan melebihi batas ini ditolak.
    tokens_per_fillJumlah token yang ditambahkan ke bucket pada setiap interval pengisian ulang.
    fill_interval_secondInterval waktu (dalam detik) antara pengisian ulang token.
    redis_expired_secondsTime-to-live (TTL) untuk catatan pembatasan laju di Redis. Setelah periode ini, catatan kedaluwarsa dan bucket diatur ulang.

    Tabel berikut menunjukkan aturan pembatasan laju yang dikonfigurasi dalam contoh ini:

    AturanRegex kunciBucket CapacityLaju pengisian ulangTTL Redis
    Pengguna biasaregular-user.*200 token50 token setiap 30 detik300 detik
    Subscribersubscriber.*1.000 token100 token setiap 60 detik600 s

    Subscriber mendapatkan bucket 5 kali lebih besar dan lebih banyak token per pengisian ulang, sehingga mendukung penggunaan LLM volume tinggi yang berkelanjutan.

  2. Terapkan konfigurasi menggunakan kubeconfig dari Kluster bidang data:

    kubectl apply -f token-limit.yaml
Catatan

Ini adalah implementasi pembatasan laju bawaan yang disediakan oleh ASM. Untuk kebutuhan kustom seperti algoritma atau backend penyimpanan berbeda, lihat kode sumber di GitHub.

Langkah 2: Terapkan plugin Wasm

Langkah ini menerapkan WasmPlugin yang mengonfigurasi proxy sidecar untuk mencegat permintaan LLM, mengekstrak kunci pembatasan laju dari header user-type, lalu memverifikasinya terhadap layanan pembatasan laju.

  1. Buat file bernama wasm.yaml dengan konten berikut:

    apiVersion: extensions.istio.io/v1alpha1
    kind: WasmPlugin
    metadata:
      name: llm-token-ratelimit
      namespace: default
    spec:
      failStrategy: FAIL_OPEN
      imagePullPolicy: IfNotPresent
      selector:
        matchLabels:
          app: sleep
      match:
      - mode: CLIENT
        ports:
        - number: 80
      phase: STATS
      pluginConfig:
        matches:
        - host:
            exact: "dashscope.aliyuncs.com"
        rateLimitKeys:
        - "{{request.headers.user-type}}"
        rateLimitService:
          service: asm-llm-token-rate-limit-example.default.svc.cluster.local
          port: 80
      priority: 10
      url: registry-cn-hangzhou.ack.aliyuncs.com/acs/asm-wasm-llm-token-ratelimit:v1.23.6.34-g92d6a4b-aliyun

    Tabel berikut menjelaskan bidang konfigurasi utama:

    BidangDeskripsi
    .spec.pluginConfig.matchesMenentukan permintaan mana yang memicu pembatasan laju. Permintaan yang tidak cocok dilewatkan tanpa pemeriksaan pembatasan laju.
    .spec.pluginConfig.rateLimitKeysMenentukan cara mengekstrak kunci pembatasan laju. Menggunakan sintaks atribut permintaan Envoy. Dalam contoh ini, {{request.headers.user-type}} mengekstrak nilai header user-type.
    .spec.pluginConfig.rateLimitServiceMenentukan titik akhir layanan pembatasan laju. Berikan nama domain lengkap (FQDN) dari Service Kubernetes.
  2. Terapkan konfigurasi menggunakan kubeconfig kluster lapisan kontrol:

    kubectl apply -f wasm.yaml

Langkah 3: Verifikasi konfigurasi

Kirim permintaan uji sebagai kedua jenis pengguna untuk memastikan pembatasan laju berfungsi dengan benar.

Jalankan masing-masing perintah berikut beberapa kali menggunakan kubeconfig kluster bidang data.

Sebagai pengguna biasa:

kubectl exec deployment/sleep -it -- curl 'http://dashscope.aliyuncs.com' \
  --header 'Content-Type: application/json' \
  --header "user-type: regular-user" \
  --data '{
      "messages": [
          {"role": "user", "content": "Please introduce yourself"}
      ]
  }'

Sebagai subscriber:

kubectl exec deployment/sleep -it -- curl 'http://dashscope.aliyuncs.com' \
  --header 'Content-Type: application/json' \
  --header "user-type: subscriber" \
  --data '{
      "messages": [
          {"role": "user", "content": "Please introduce yourself"}
      ]
  }'

Perilaku yang diharapkan:

  • Permintaan awal dari kedua jenis pengguna mengembalikan tanggapan LLM normal yang berisi bidang usage dengan jumlah token.

  • Setelah beberapa permintaan, regular-user pertama kali mencapai batas laju dan menerima regular-user is being rate-limited.

  • subscriber dapat mengirim lebih banyak permintaan sebelum dibatasi lajunya, yang mengonfirmasi kuota token yang lebih tinggi.

Hal ini memvalidasi bahwa layanan pembatasan laju membedakan tier pengguna dan menerapkan kuota token yang dikonfigurasi.

Langkah selanjutnya

  • Kustomisasi aturan pembatasan laju: Sesuaikan max_tokens, tokens_per_fill, dan fill_interval_second dalam RATE_LIMIT_CONFIG agar sesuai dengan pola lalu lintas produksi Anda.

  • Buat layanan pembatasan laju kustom: Fork implementasi contoh untuk menerapkan algoritma kustom (leaky bucket, jendela geser) atau menggunakan backend penyimpanan berbeda.

  • Perluas ke atribut lainnya: Ubah rateLimitKeys untuk mengekstrak kunci dari atribut permintaan lain seperti path, host, atau atribut TCP. Lihat atribut Envoy untuk opsi yang tersedia.