Pendahuluan
Kamu tahu google adalah tempat kita mencari beberapa kata kunci yang dapat menghasilkan berbagai jutaan informasi yang kita dapat hanya dengan mengetik beberapa kata kunci dan dalam waktu kurang dari 1 detik kita sudah bisa mendapatkan berbagai informasi terkait kata kunci yang kita cari. Nah ini adalah contoh miniatur atau search engine versi sederhana bagaimana kita bisa mengimplementasikan worker pool menjadi suatu engine yang berguna untuk pencarian.
Kamu sudah memahami bagaimana cara kerja Worker Pool? Jika belum tahu atau sudah tahu tapi ingin memperdalam lagi bisa baca-baca terlebih dahulu di artikel sebelumnya yang pernah Santekno bahas di cara implementasi concurrency worker pool golang.
Persiapan Data Dasar
Sebelum kita membuat program pencarian, kita harus siapkan terlebih dahulu data yang akan dicari. Santekno disini akan memberikan sampel data yang paling sederhana agar mudah untuk dicerna oleh teman-teman semuanya.
Kita akan membuat data berupa informasi User
yang terdapat atribut nama
dan email
. Nama dan email ini yang akan kita dijadikan data yang akan dicari.
type User struct {
Name string
Email string
}
var Database = []User{
{Name: "ihsan arif", Email: "ihsan.arif@example.com"},
{Name: "ihsan nugraha", Email: "ihsa@example.com"},
{Name: "arif susanto", Email: "arif.susanto@example.com"},
{Name: "ines nur", Email: "ines.nur@example.com"},
{Name: "inez hendriani", Email: "inez.hendriani@example.com"},
{Name: "deni siahaan", Email: "deni.siahaan@example.com"},
{Name: "sumarno treggono", Email: "sumarno.trenggono@example.com"},
{Name: "nida fauziah", Email: "nida.fauziah@example.com"},
{Name: "nurul kamilah", Email: "nurul.kamilah@example.com"},
{Name: "muhammad rafi", Email: "muhammad.rafi@example.com"},
{Name: "irfan maulana", Email: "irfan.maulana@example.com"},
{Name: "irsyad aprilianto", Email: "irsyad.aprilianto@example.com"},
{Name: "iqbal fauzi", Email: "iqbal.fauzi@example.com"},
{Name: "rani zahroh", Email: "rani.zahroh@example.com"},
{Name: "ajeng syifa", Email: "ajeng.syifa@example.com"},
{Name: "aldi arikandi", Email: "aldi.arikandi@example.com"},
{Name: "firman syah", Email: "firman.syah@example.com"},
{Name: "irwan setiawan", Email: "irwan.setiawan@example.com"},
}
Inisialisasi Worker Pool
Kenapa kita menggunakan worker pool? Jawaban sederhananya yaitu agar proses pencarian berdasarkan kata kunci ke dalam database (sumber data) lebih cepat dan dibagi-bagi. Bisa kita lihat dibawah ini inisialisasi Worker struct
menjadi object yang nanti kita gunakan untuk pencarian di fungsi main. Jika masih bingung lihat saja dulu potongan program untuk inisialisasi Woerker-nya.
type Worker struct {
Users []User
ch chan *User
Name string
}
func NewWorker(users []User, ch chan *User, name string) *Worker {
return &Worker{Users: users, ch: ch, Name: name}
}
Fungsi Pencarian
Fungsi utama dari worker akan kita buat dibawah objek worker agar saat pencarian lebih mudah.
func (w *Worker) Find(email string) *User {
for i := range w.Users {
user := &w.Users[i]
if strings.Contains(user.Email, email) {
w.ch <- user
}
}
return nil
}
Fungi Main Program
Fungsi ini menjalankan proses inisialisasi worker, pengambilan data dan membaca input untuk jadi kata kunci yang akan dicari pada basis data.
func main() {
// untuk mengambil argumen masukan
email := os.Args[1]
// inisialisasi channel objek user
ch := make(chan *User)
// inisialisasi worker pool sebanyak 3 pool
for i := 0; i < 3; i++ {
go NewWorker(Database[(len(Database)/3*i):len(Database)/3*(i+1)], ch, fmt.Sprintf("#%s", i)).Find(email)
}
// mencetak hasil dari pencarian
select {
case user := <-ch:
log.Printf("the email %s is owned by %s", email, user.Email)
case <-time.After(100 * time.Millisecond):
log.Printf("the email %s was not found", email)
}
}
Output Program
-> go run content/post/main.go ihsan.arif
2021/05/10 19:38:00 the email ihsan.arif is owned by ihsan.arif@example.com
-> go run content/post/main.go ines
2021/05/10 19:38:04 the email ines is owned by ines.nur@example.com
-> go run content/post/main.go unyil
2021/05/10 19:40:49 the email unyil was not found