Pemrograman

Membuat Distibuted Search Engine Sederhana Menggunakan Worker Pool Pada Golang

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

Program keseluruhan

comments powered by Disqus