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).
MongoDB
Spesifikasi teknis MongoDB di platform Nexa Intelligence, arsitektur koleksi operational data store (ODS) & registry crawler, sinkronisasi Postgres-to-Mongo, buffer staging dokumen, dan dead-job tracking.
MinIO
Spesifikasi teknis Object Storage MinIO (S3 Compatible) di Nexa, partisi folder bucket 'nexa', siklus hidup raw payload, presigned URL, dan backup snapshot.