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.
Alur permintaan:
Klien mengirim permintaan LLM melalui proxy sidecar.
Plugin Wasm mengekstrak kunci pembatasan laju dari header permintaan.
Plugin menanyakan layanan pembatasan laju untuk memeriksa apakah kunci tersebut telah melebihi kuota tokennya.
Jika masih tersisa kuota, permintaan diteruskan ke layanan LLM. Jika kuota habis, proxy mengembalikan tanggapan pembatasan laju (misalnya,
regular-user is being rate-limited).Layanan LLM memproses permintaan dan mengembalikan tanggapan yang mencakup data penggunaan token dalam bidang
usage(misalnya,prompt_tokens,completion_tokens, dantotal_tokens).Plugin melaporkan jumlah token yang dikonsumsi kembali ke layanan pembatasan laju untuk memperbarui catatan.
Langkah 6 berjalan secara asinkron dan tidak menghalangi tanggapan LLM sampai ke klien.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans ASM (versi 1.23 atau lebih baru) dengan kluster yang ditambahkan
LLMProvider dan sumber daya terkait, yang diterapkan dengan menyelesaikan Langkah 1 dan 2 dalam Perutean trafik: Gunakan ASM untuk mengelola trafik LLM secara efisien
Layanan Redis yang dapat diakses dari kluster. Untuk membuat instans terkelola, lihat Panduan Cepat Tair (Kompatibel dengan Redis OSS)
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.
Buat file bernama
token-limit.yamldengan konten berikut:Ganti placeholder berikut dengan nilai aktual Anda:
Placeholder Deskripsi Contoh ${redis-address}Alamat host Redis r-bp1xxxxxx.redis.rds.aliyuncs.com${redis-port}Nomor port Redis 6379${redis-user}Username Redis default${password}Password Redis MyP@ssw0rdVariabel lingkungan
RATE_LIMIT_CONFIGmendefinisikan aturan token bucket. Setiap aturan mencocokkan kunci pembatasan laju berdasarkan regex dan menerapkan bucket terpisah:Parameter Deskripsi 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:
Aturan Regex kunci Bucket Capacity Laju pengisian ulang TTL Redis Pengguna biasa regular-user.*200 token 50 token setiap 30 detik 300 detik Subscriber subscriber.*1.000 token 100 token setiap 60 detik 600 s Subscriber mendapatkan bucket 5 kali lebih besar dan lebih banyak token per pengisian ulang, sehingga mendukung penggunaan LLM volume tinggi yang berkelanjutan.
Terapkan konfigurasi menggunakan kubeconfig dari Kluster bidang data:
kubectl apply -f token-limit.yaml
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.
Buat file bernama
wasm.yamldengan 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-aliyunTabel berikut menjelaskan bidang konfigurasi utama:
Bidang Deskripsi .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 headeruser-type..spec.pluginConfig.rateLimitServiceMenentukan titik akhir layanan pembatasan laju. Berikan nama domain lengkap (FQDN) dari Service Kubernetes. 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
usagedengan jumlah token.Setelah beberapa permintaan,
regular-userpertama kali mencapai batas laju dan menerimaregular-user is being rate-limited.subscriberdapat 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, danfill_interval_seconddalamRATE_LIMIT_CONFIGagar 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
rateLimitKeysuntuk mengekstrak kunci dari atribut permintaan lain seperti path, host, atau atribut TCP. Lihat atribut Envoy untuk opsi yang tersedia.