Menjalankan simulasi pasar berbasis multi-agent (seperti arsitektur MarketFish) memerlukan eksekusi ratusan agen otonom secara paralel. Tanpa pembatasan ketat, loop inferensi yang tidak terkontrol atau eksekusi kode agen yang liar dapat memicu denial-of-service (DoS), menguras budget API pihak ketiga, dan mengekspos kredensial antar tenant. Artikel ini membahas strategi hardening runtime simulasi pasar melalui isolasi proses agen, rate limiting berbasis Redis, penegakan budget token LLM, dan tata kelola secret multi-tenant.
Arsitektur Sandboxing Proses Agen
Mengeksekusi logika agen langsung di dalam main process aplikasi backend membuka celah eksploitasi memori dan CPU throttling sistemik. Pendekatan standar industri adalah memisahkan runtime simulasi ke dalam kontainer ringan yang diisolasi dengan Linux cgroups dan namespaces.
Gunakan runtime container yang terisolasi ketat (seperti gVisor atau seccomp profiles khusus) untuk membatasi interaksi syscall ke host OS. Konfigurasi cgroups wajib membatasi:
- Memory Limit & Swap: Mencegah OOM killer mematikan proses platform inti.
- CPU Quota: Memastikan simulasi satu tenant tidak memonopoli core pemrosesan server.
- Pids Limit: Mencegah serangan fork bomb dari custom code logic agen.
Contoh definisi resource constraints pada docker-compose atau pod spec runner simulasi:
services:
agent-runner:
image: market-sim-runner:latest
deploy:
resources:
limits:
cpus: '0.50'
memory: 512M
pids: 50
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
read_only: true
tmpfs:
- /tmp:rw,noexec,nosuid,size=64mRate Limiting Workspace: Token Bucket dengan Redis & Lua
Ratusan agen dalam satu sesi simulasi pasar dapat mengirimkan ratusan request per detik ke mesin lelang atau order book platform. Untuk mencegah kolapsnya antrean transaksi, terapkan algoritma Token Bucket stateful yang dieksekusi secara atomik di tingkat Redis.
Skrip Lua memastikan operasi pengecekan token, pengurangan token, dan penambahan token (refill) berdasarkan elapsed time berjalan atomik tanpa terkena race condition antar agen.
-- ARGV[1]: Max tokens (capacity)
-- ARGV[2]: Refill rate per millisecond
-- ARGV[3]: Requested tokens
-- ARGV[4]: Current timestamp (epoch ms)
-- KEYS[1]: Tenant rate limit state key
local key = KEYS[1]
local max_tokens = tonumber(ARGV[1])
local refill_rate = tonumber(ARGV[2])
local requested = tonumber(ARGV[3])
local now = tonumber(ARGV[4])
local data = redis.call('HMGET', key, 'tokens', 'last_updated')
local tokens = tonumber(data[1])
local last_updated = tonumber(data[2])
if tokens == nil then
tokens = max_tokens
last_updated = now
else
local delta = math.max(0, now - last_updated)
tokens = math.min(max_tokens, tokens + (delta * refill_rate))
last_updated = now
end
if tokens >= requested then
tokens = tokens - requested
redis.call('HMSET', key, 'tokens', tokens, 'last_updated', last_updated)
redis.call('PEXPIRE', key, 60000) -- TTL 1 menit
return 1 -- Request diizinkan
else
redis.call('HMSET', key, 'tokens', tokens, 'last_updated', last_updated)
return 0 -- Rate limit tercapai
endEnforcement Budget Token LLM Per Simulasi
Jika simulasi pasar menggunakan Model Bahasa Besar (LLM) untuk pengambilan keputusan agen (misal: analisis sentimen berita atau penentuan harga penawaran), konsumsi token dapat meningkat secara eksponensial. Sistem harus memotong pemanggilan LLM sebelum tenant melampaui alokasi biaya simulasi.
Gunakan proxy service internal untuk memediasi request agen ke LLM provider (OpenAI, Anthropic, atau local engine). Proxy ini bertugas memvalidasi sisa kuota, mencatat penggunaan token, dan menghentikan request jika budget nol.
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
class BudgetExceededError(Exception):
pass
def check_and_deduct_token_budget(tenant_id: str, estimated_tokens: int):
budget_key = f"tenant:{tenant_id}:token_budget"
# Atomic decrement. Nilai bisa negatif jika token habis.
remaining = r.decrby(budget_key, estimated_tokens)
if remaining < 0:
# Rollback decrement jika transaksi ditolak
r.incrby(budget_key, estimated_tokens)
raise BudgetExceededError(f"Budget token habis untuk tenant: {tenant_id}")
return remainingCatatan: Gunakan estimasi konservatif untuk request token (panjang teks prompt + batas
max_tokensoutput). Setelah response diterima dari provider, sesuaikan nilai Redis dengan jumlah token riil yang dilaporkan pada metadata API.
Isolasi Secret API Key Antar Tenant
Agen dalam simulasi tidak boleh memiliki akses langsung ke master credentials ataupun environment variables host. Terapkan prinsip zero-trust credential brokering:
- Egress Proxy / Sidecar: Agen mengirim request HTTP ke endpoint lokal tanpa autentikasi eksternal (misal:
http://proxy.internal/v1/chat/completions). Proxy membaca header internalX-Tenant-ID, menyuntikkan token/API key resmi tenant dari Secret Manager (HashiCorp Vault atau AWS Secrets Manager), lalu meneruskannya ke provider luar. - Ephemeral Scoped Tokens: Jangan menyematkan API key jangka panjang ke environment kontainer agen. Buat token sementara dengan scope minimal sesuai durasi simulasi.
- Network Isolation: Tutup akses internet langsung agen menggunakan firewall atau network policy Kubernetes (Calico/Cilium). Batasi rute egress agen hanya ke reverse proxy internal.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: isolate-market-agents
namespace: simulation
spec:
podSelector:
matchLabels:
role: market-agent
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
role: egress-proxy
ports:
- protocol: TCP
port: 8080Trade-off dan Mitigasi
Menerapkan pengamanan bertingkat menghadirkan beberapa kompromi arsitektural yang perlu dipertimbangkan:
- Latensi Eksekusi: Verifikasi rate limit atomik di Redis dan forwarding via egress proxy menambah latensi jaringan (~2-5ms per panggilan). Untuk simulasi frekuensi tinggi (High-Frequency Trading sandbox), agregasikan request batch dalam loop lokal agen sebelum mengirim sinyal transaksi.
- Cold Starts Kontainer: Mengisolasi proses per tenant via container execution unit memperpanjang bootstrap time simulasi. Gunakan pool warm-containers yang telah siap menerima inject state tenant saat simulasi dimulai.
- State Drifts: Jika token proxy menolak request agen di tengah simulasi akibat budget habis, agen harus memiliki mekanisme fallback (misal: beralih ke rule-based heurisitik dasar) agar seluruh pasar simulasi tidak crash seketika.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!