Dalam pengelolaan layanan perangkat lunak berbasis API, pembatasan kuota akses atau yang dikenal sebagai rate limiting memegang peran krusial. Mekanisme ini berfungsi untuk mengatur jumlah permintaan (request) yang diizinkan dari seorang pengguna atau alamat IP tertentu ke dalam sumber daya peladen dalam kurun waktu yang telah ditentukan. Tanpa sistem pembatasan ini, peladen rentan mengalami kelebihan beban akibat otomatisasi bot atau penyalahgunaan kuota.
Meskipun konfigurasi pembatas trafik dapat dilakukan di tingkat peladen web seperti Nginx, membangun sistem pembatasan secara mandiri di dalam kode aplikasi memberikan fleksibilitas logika yang jauh lebih tinggi. Platform analitik seperti BulkMetrik kerap mengandalkan pendekatan berbasis memori untuk memastikan kueri pengecekan massal berjalan stabil, adil, dan terlindung dari lonjakan trafik anomali.
Mengapa Memilih Redis untuk Rate Limiting?
Terdapat beberapa alasan utama mengapa basis data dalam memori seperti Redis menjadi pilihan terbaik untuk menangani manajemen trafik berskala tinggi:
- Kecepatan Akses Tinggi: Redis menyimpan seluruh datanya di dalam RAM, menghasilkan waktu tanggap yang jauh lebih cepat dibandingkan penyimpanan berbasis cakram fisik atau sesi bawaan berbasis berkas.
- Fleksibilitas Logika: Pengembang memiliki kendali penuh untuk merancang struktur kunci (key) dan aturan pembatasan yang disesuaikan dengan kebutuhan bisnis.
- Dukungan Ekosistem Luas: Redis menyediakan pustaka klien yang stabil di berbagai bahasa pemrograman populer, termasuk Node.js.
Persiapan Infrastruktur dan Lingkungan Kerja
Sebelum mulai merancang kode, pastikan lingkungan lokal Anda sudah terpasang Node.js serta peladen Redis. Di lingkungan Windows, Redis dapat dijalankan secara praktis melalui kontainer Docker.
Langkah awal inisialisasi proyek melalui terminal penintah:
- Buat direktori baru untuk proyek:
mkdir express-rate-limiting - Masuk ke dalam direktori tersebut:
cd express-rate-limiting - Inisialisasi konfigurasi npm:
npm init -y - Pasang modul pustaka yang dibutuhkan:
npm i -S express redis bluebird date-fns
Penjelasan singkat pustaka yang digunakan: express sebagai kerangka kerja web API, redis untuk komunikasi dengan peladen basis data, bluebird guna mengubah fungsi callback menjadi berbasis Promise, serta date-fns untuk pengaturan format waktu.
Mekanisme dan Konsep Logika
Target utama implementasi ini adalah membatasi endpoint GET /hello agar setiap alamat IP hanya dapat mengaksesnya sebanyak 10 kali dalam kurun waktu satu menit. Untuk merealisasikannya, sistem akan memanfaatkan tiga perintah inti Redis:
GET: Memeriksa nilai akumulasi akses dari sebuah kunci unik.INCR: Menaikkan nilai numerik akumulasi akses sebesar satu angka setiap kali permintaan masuk.EXPIRE: Memberikan batas kedaluwarsa otomatis pada kunci agar memori peladen tidak terbebani secara berkala.
Format struktur kunci dirancang secara spesifik berdasarkan kombinasi alamat IP, jalur akses (path), serta penanda waktu per menit:
{IP}:{PATH}:{TAHUN}{BULAN}{TANGGAL}:{JAM}{MENIT}
Implementasi Kode pada Express.js
Buat berkas baru bernama app.js di dalam direktori proyek Anda, lalu masukkan susunan kode berikut untuk menghubungkan modul dan membangun logika pembatas:
const { format } = require('date-fns')
const express = require('express')
const bluebird = require('bluebird')
const redis = require('redis')
// Mengaktifkan Promise pada modul redis
bluebird.promisifyAll(redis)
const client = redis.createClient({
host: '127.0.0.1',
port: 6379
})
const port = 3000
const app = express()
app.get('/hello', async (req, res) => {
const limit = 10
const path = '/hello'
const time = format(new Date(), 'yyyyMMdd:HHmm')
const key = `${req.ip}:${path}:${time}`
const count = parseInt(await client.getAsync(key))
if (count > limit) {
return res.status(429).json({
error: 429,
message: `API rate limit exceeded`
})
}
const trx = client.multi()
trx.incr(key)
trx.expire(key, 60)
await trx.execAsync()
res.json({
message: 'Hello world'
})
})
app.listen(port, () => {
console.log(`Aplikasi berjalan pada port ${port}!`)
})
Pengujian Sistem Pembatasan Trafik
Jalankan aplikasi melalui terminal dengan perintah node app. Ketika Anda mengakses peramban ke alamat http://localhost:3000/hello secara beruntun, sepuluh permintaan pertama akan mengembalikan respons sukses berupa pesan teks normal. Memasuki permintaan kesebelas dalam menit yang sama, peladen akan secara otomatis menolak dan memunculkan respons kode galat 429 Too Many Requests.
Sistem secara otomatis akan mereset kuota setelah pergantian menit atau setelah masa kedaluwarsa kunci Redis selama 60 detik tercapai, mengembalikan akses normal bagi pengguna. Pendekatan arsitektur ini memastikan reliabilitas tinggi pada layanan pemrosesan data di ekosistem BulkMetrik.