Redis
Spesifikasi teknis Redis In-Memory Cache di Nexa, pola prefix key, manajemen session JWT, transport Redis Streams 'scrape-tasks', rate limiting, dan distributed locks.
Redis In-Memory Cache & Stream Transport
Redis bertindak sebagai lapisan penyimpanan memori berkecepatan tinggi (In-Memory Key-Value & Stream Store) di seluruh gateway F1 API Backend, A1 Scraper Controller, dan D1 AI Worker.
Matriks Penggunaan Kunci & Struktur Data
| Pola Key (Prefix) | Tipe Data | TTL (Masa Berlaku) | Modul Pemilik | Deskripsi & Fungsi |
|---|---|---|---|---|
nexa:cache:url_hash:{md5} | String | 30 Hari | a1-scraper-controller | Cache hash URL untuk deteksi cepat tautan yang sudah pernah di-crawl (first-line filter). |
nexa:auth:token_blacklist:{jti} | String | Sisa masa berlaku JWT | f1-api-backend | Daftar ID token JWT yang dicabut saat user Logout untuk validasi instan sub-1ms. |
nexa:ratelimit:ip:{client_ip} | String (Integer) | 60 Detik | f1-api-backend | Sliding window counter untuk membatasi request per IP (misal: max 120 req/menit). |
nexa:cache:dashboard:national | String (JSON) | 5 Menit | f1-api-backend | Response cache endpoint overview nasional untuk mempertahankan TTFB < 20ms. |
nexa:cache:taxonomy:tree | String (JSON) | 24 Jam | f1-api-backend | Cache hierarki pohon taksonomi 5-Level yang jarang berubah. |
nexa:worker:lock:{article_id} | String | 10 Menit | nexa-d1 | Distributed lock (SET NX EX) guna mencegah race condition inferensi artikel ganda. |
nexa:stream:scrape-tasks | Stream | Retention 7 Hari | A1 / Scraper Legacy | Redis Stream taskbus untuk pengiriman instruksi crawling ke scraper lawas. |
1. Transport Redis Streams (scrape-tasks)
Untuk mendukung scraper legacy sebelum migrasi penuh ke Kafka:
Operasi Stream:
# Produser: A1 Controller mengirim tugas scraping baru
XADD scrape-tasks * job_id "9b1deb4d-3b7d-4bad" domain "kompas.com" max_pages 15
# Konsumen: Scraper Worker membaca antrean tugas dalam consumer group
XREADGROUP GROUP b1-workers worker-01 BLOCK 5000 COUNT 5 STREAMS scrape-tasks >
# Konfirmasi: Scraper menyelesaikan scraping
XACK scrape-tasks b1-workers 1726056000000-02. Distributed Locking & Idempotensi Worker
Untuk memastikan hanya satu worker instance yang memproses inferensi AI pada artikel yang sama:
// Implementasi Distributed Lock pada API Gateway / Worker
async function acquireArticleLock(articleId: string, instanceId: string): Promise<boolean> {
const lockKey = `nexa:worker:lock:${articleId}`;
// Set kunci jika belum ada (NX) dengan masa kedaluwarsa 600 detik (EX)
const result = await redis.set(lockKey, instanceId, 'NX', 'EX', 600);
return result === 'OK';
}
async function releaseArticleLock(articleId: string, instanceId: string): Promise<void> {
const lockKey = `nexa:worker:lock:${articleId}`;
const luaScript = `
if redis.call("get", KEYS[1]) == ARGV[1] then
return redis.call("del", KEYS[1])
else
return 0
end
`;
await redis.eval(luaScript, 1, lockKey, instanceId);
}3. Kebijakan Manajemen Memori
Instans Redis dikonfigurasi dengan limit alokasi memori dan kebijakan eviksi maxmemory-policy volatile-lru (kunci dengan TTL yang paling jarang digunakan akan dibuang terlebih dahulu jika RAM mendekati batas maksimal).
Elasticsearch
Spesifikasi teknis cluster Elasticsearch di Nexa, katalog lengkap 13 indeks data master & analitik, struktur mapping dokumen, serta pola query pencarian real-time.
MinIO
Spesifikasi teknis Object Storage MinIO (S3 Compatible) di Nexa, partisi folder bucket 'nexa', siklus hidup raw payload, presigned URL, dan backup snapshot.