Layanan API untuk COVID-19 tapi Berasa Statik
Layanan API yang bisa diakses lewat web sangat populer untuk mengambil kepingan informasi. Untuk dekontaminasi.com, sebuah layanan informasi paparan COVID-19 di Indonesia, saya memadukan konsep situs statik dengan persembahan data ala JSON. Bagaimana ceritanya di balik layar?
Pengembang web sudah sangat akrab dengan penggunaan API via web. Contohnya, kalau mau berburu prakiraan dan situasi cuaca terbaru, bisa menggunakan OpenWeatherMap (satu dari lusinan layanan serupa):
> curl "api.openweathermap.org/data/2.5/weather?q=Jakarta&appid=42a68dd678c87a18414b60611849c54d"{"coord":{"lon":106.85,"lat":-6.21},"weather":[{"id":721,"main":"Haze","description":"haze","icon":"50d"}],"base":"stations","main":{"temp":305.15,"feels_like":306.41,"temp_min":305.15,"temp_max":305.15,"pressure":1010,"humidity":52},"visibility":5000,"wind":{"speed":4.1,"deg":60},"clouds":{"all":20},"dt":1592626512,"sys":{"type":1,"id":9383,"country":"ID","sunrise":1592607680,"sunset":1592650019},"timezone":25200,"id":1642911,"name":"Jakarta","cod":200}
Parameter appid merujuk ke kunci API (API key), biasanya didapatkan dengan mendaftar dulu ke penyedia layanan, dalam hal ini OpenWeatherMap. Hasilnya, dalam bentuk JSON, mewakili data cuaca untuk “Jakarta”, yang sudah dispesifikasikan sebagai query.
Tentu saja ada juga penyedia layanan yang tidak membutuhkan kunci API, misalnya contoh yang berikut ini untuk mendapatkan lokasi geografis dari alamat IP:
> curl https://freegeoip.app/json/{"ip":"173.255.132.1","country_code":"US","country_name":"United States","region_code":"CA","region_name":"California","city":"San Francisco","zip_code":"94130","time_zone":"America/Los_Angeles","latitude":37.8231,"longitude":-122.3693,"metro_code":807}
Dalam dua contoh di atas, sudah pasti hasilnya akan berbeda bergantung kepada banyak faktor, dari query, lokasi, waktu, jam, dll. Artinya, kalau saya memanggil API yang sama, hasilnya bisa saja berbeda dengan hasil panggilan Anda, apalagi kalau waktunya yang berbeda.
Untuk layanan API paparan COVID-19 di Indonesia yang saya buat sebagai dekontaminasi.com, informasi yang dikembalikan tidak terlalu bervariasi berdasarkan pemanggilannya. Yang jelas datanya akan berubah begitu ada informasi paparan terbaru (misalnya dari Gugus Tugas COVID-19 atau juga tim BNPB). Karenanya, kita bisa menggunakan konsep situs statik karena data paparan COVID-19 sendiri tidak akan berubah tiap jam (apalagi tiap menit atau tiap detik).
Buat yang belum pernah mengoprek generator situs statik (seperti Hugo, Gatsy, Jekyll, Pelican, atau lusinan pilihan lainnya: www.staticgen.com), konsepnya adalah membuat materi/konten yang disimpan sebagai berkas HTML biasa yang diletakkan di server web. Ini berbeda dengan Wordpress, Joomla, Laravel, ataupun teknologi lain yang serupa, yang merakit halaman HTML tersebut saat ada permintaan dari browser. Buat pengguna situs statik, manakala ada penambangan atau pengubahan konten, barulah berkas-berkas HTML-nya dibuat ulang, biasanya sebagai bagian dari proses deployment.
Konsep ini juga yang saya terapkan untuk data-data di dekontaminasi.com yang berbentuk JSON. Berkas-berkas JSON tersebut sifatnya statik, dipicu pembuatannya secara berkala tiap 15 menit (memanfaatkan fitur trigger dari GitHub Actions), sebagaimana bisa disimak dari berkas YAML untuk workflow-nya (dari github.com/ariya/dekontaminasi):
name: Deploy
on:
push:
branches: [ master ]
schedule:
- cron: '*/15 * * * *'
Bagaimana proses pengolahan datanya? Di sini saya menyedot data resmi dari BNPB (atau lebih tepatnya, dashboard ArcGIS yang digunakan tim Gugus Tugas di inacovid19.maps.arcgis.com). Data mentah tersebut diubah isinya sehingga lebih mudah dipahami, dalam hal ini saya menggunakan jq, stedolan.github.io/jq.
Selain data paparan COVID-19, ada juga sumber data yang lain, misalnya daftar rumah sakit rujukan resmi, berita-berita terkait COVID-19 di berbagai surat kabar daring Indonesia, berikut juga analisis hoaks terbaru dari turnbackhoax.id. Semuanya melalu proses yang sama: comot data mentah, ubah formatnya ke dalam bentuk JSON yang bersahabat, lalu jebloskan di direktori public
. Begitu usai, barulah dilakukan proses deployment.
Karena berkas-berkas JSON ini sifatnya statik, saya menggunakan Netlify sebagai sarana deployment. Alternatif lain juga banyak, dari Firebase Hosting, Vercel, Surge, Aerobatic, dsb. Untuk kasus penggunakan Netlify di atas, kuota bandwidth yang diberikan (tanpa perlu bayar) sangat murah hati, yaitu 100 GB per bulan. Mengingat total ukuran berkas-berkas JSON yang dapat diakses dari dekontaminasi.com ini sangat kecil, kurang dari 100 KB, kuota sebanyak itu bisa dipakai 1 juta panggilan dalam sebulannya tanpa masalah!
Lebih rincinya, silakan langsung ke TKP: github.com/ariya/dekontaminasi. Kalau ada ide, jangan sungkan mengirimkan pull request!
Apa saja kelebihan dan kekurangan model penyediaan data ala situs statik seperti ini?
Salah satu kekurangannya adalah tentu saja datanya tidak akan dimutakhirkan secara langsung. Karena proses penyedotan dan pengolahan data hanya terjadi tiap 15 menit, bisa terjadi delay antara sumber data asli (misalnya pembaruan dari Gugus Tugas) hingga data olahannya nongol di dekontaminasi.com. Jika layanan yang Anda buat perlu bersifat real-time, tentu saja model seperti tidak akan jalan. Akan tetapi dalam banyak kasus, baik paparan COVID-19 ataupun juga situasi cuaca, 15 menit (ataupun yang lebih cepat lagi) tidak akan terlalu mengubah hasilnya.
Kelebihan utama model API statik seperti adalah efisiensi. Pertama, karena berkasnya statik, deployment bisa ke server web apapun, baik bikinan sendiri (Apache, Nginx, dll) maupun lewat layanan yang sudah ada (Netlify, Vercel, dll). Kalau ada yang mau bikin mirror, juga gampang sekali karena tinggal menjalankan rsync
secara periodik. Atau, kalau diekspresikan dari sudut pandang yang lain, berkas JSON statik tersebut bertindak sebagai lapis persistensi, tanpa perlu kepeningan menyiapkan dan menjalankan sebuah basis data seperti PostgreSQL, MongoDB, dsb.
Efisiensinya juga terefleksikan di pengolahan data terutama karena proses pengolahan data tersebut hanya dipicu tiap 15 menit dan bukan tiap kali ada request. Juga berarti bahwa pencomotan data mentah dari sumbernya tidak ada terjadi terlalu sering. Mengapa ini penting? Karena kalau terlalu sering, bisa jadi akan kena throttling. Sudah pasti yang punya server data mentah tidak akan riang gembira manakala servernya dibombardir terus-menerus karena akan menghabiskan bandwidth, memori, CPU, dll.
Walhasil, dari beberapa kelebihan inilah saya memutuskan untuk mengadopsi model API statik tersebut.
Nah, dengan ide baru seperti ini, adakah layanan API yang baru yang Anda hendak bangun?
Hyperjump is an open-source-first company providing engineering excellence service. We aim to build and commercialize open-source tools to help companies streamline, simplify, and secure the most important aspects of its modern DevOps practices.