Single Flight
Single Flight adalah pola yang digunakan untuk mencegah redundant request dengan memastikan bahwa hanya satu goroutine yang menjalankan proses tertentu dalam satu waktu. Goroutine lain yang meminta hasil yang sama akan menunggu hasil dari goroutine pertama, bukan memproses ulang permintaan yang sama.
Pola ini sangat berguna untuk:
Mengurangi load ke database atau API eksternal (misal: caching atau fetching data).
Menghindari spam request ke third-party API, sehingga lebih efisien.
Menghindari race condition saat banyak goroutine meminta data yang sama.
Meningkatkan efisiensi dalam sistem dengan banyak request paralel.
Kapan Teknik Ini Berguna?
Ketika banyak request ke API yang sama dalam waktu bersamaan.
Jika API third-party memiliki rate limit dan kita ingin menghindari throttling.
Untuk mengurangi latensi dengan menghindari redundant request.
Untuk menghemat biaya jika API third-party menggunakan sistem berbayar per request.
Cara Menentukan Unique Key
Seperti yang kita lihat dari contoh kode implmentasi single flight patter, ada satu unique-key yang digunakan, sehingga request-request yang memiliki unique key yang sama, hanya akan diproses 1x. Unique-key bisa digenerate dengan berbagai logic, untuk kasus pemanggilan api third party, unique-key bisa menggunakan path url termasuk dengan parameter/query yang digunakan. Jika url, path dan parameter dirasa terlalu panjang, bisa menggunakan hashing agar lebih ringkas.
Implementasi Single Flight Pattern
Penjelasan Kode :
Membuat MySingleFlight
Menggunakan map[string]*call untuk menyimpan request yang sedang berjalan.
Menggunakan sync.Mutex agar hanya satu goroutine yang bisa memodifikasi map pada satu waktu.
Request kedua dan seterusnya akan menunggu hasil request pertama.
Struktur call
wg sync.WaitGroup: Menunggu hasil request yang sedang berlangsung.
res string: Menyimpan hasil response.
err error: Menyimpan error jika terjadi.
Mekanisme Do()
Jika request dengan key tertentu sudah berjalan, goroutine menunggu hasilnya (c.wg.Wait()).
belum ada request, membuat request baru dan menyimpannya di map.
Setelah request selesai, hapus entri dari map agar request baru bisa dilakukan.
Memanggil API dengan Hashing
Menggunakan SHA-256 hash dari URL sebagai key untuk menghindari duplikasi request.
Menjalankan fetchAPI() dengan Beberapa Goroutine
Tiga goroutine menjalankan request bersamaan.
Hanya satu request yang benar-benar dikirim, sisanya menunggu hasilnya.
Output yang diharapkan
Fetching API: hanya muncul sekali, menandakan hanya satu request yang benar-benar dikirim.
Semua goroutine mendapatkan hasil yang sama tanpa harus request ulang.
Implementasi Menggunakan Library "golang.org/x/sync/singleflight"
Saat ini, sudah ada library single-flight pattern yang cukup populer di golang. Pertimbangkan untuk menggunakan library ini agar kita tidak perlu membuatnya from scratch.
Kesimpulan
SingleFlight adalah solusi yang efisien dan sederhana untuk menghindari eksekusi berulang dari tugas yang sama dalam lingkungan konkuren. Jika ingin kontrol penuh, kita bisa membuat SingleFlight buatan sendiri. Jika ingin implementasi cepat dan stabil, cukup gunakan sync/singleflight.
🚀 Dengan menggunakan SingleFlight, kita bisa meningkatkan performa aplikasi secara signifikan dan menghindari pemborosan resource!
Last updated
Was this helpful?