Semaphore

Semaphore pattern adalah teknik dalam concurrent programming yang digunakan untuk mengontrol jumlah goroutine atau thread yang berjalan secara bersamaan.

🛠 Cara Kerja:

  • Semaphore memiliki batas maksimum (limit) untuk jumlah operasi yang berjalan bersamaan.

  • Ketika limit tercapai, goroutine berikutnya harus menunggu sampai ada slot yang tersedia.

  • Digunakan untuk mencegah overload atau resource starvation pada sistem.

Contoh Dasar Implementasi Semaphore di Golang

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	const maxConcurrentJobs = 3 // Batas maksimal goroutine yang boleh berjalan
	semaphore := make(chan struct{}, maxConcurrentJobs)

	var wg sync.WaitGroup
	for i := 1; i <= 10; i++ {
		wg.Add(1)

		// Mengisi slot semaphore sebelum memulai pekerjaan
		semaphore <- struct{}{}

		go func(jobID int) {
			defer wg.Done()
			defer func() { <-semaphore }() // Melepaskan slot semaphore setelah selesai

			fmt.Printf("Processing job %d\n", jobID)
			time.Sleep(2 * time.Second) // Simulasi pekerjaan
		}(i)
	}

	wg.Wait()
	fmt.Println("All jobs completed")
}

Penjelasan:

  • Membatasi jumlah goroutine aktif (dalam contoh ini, hanya 3 goroutine yang berjalan bersamaan).

  • Menunggu slot kosong jika jumlah goroutine yang berjalan sudah mencapai batas.

  • Mencegah aplikasi overload dengan terlalu banyak goroutine.

Pada prakteknya, seringkali semaphore digunakan di middleware untuk mengontrol banyaknya request yang bisa dilayani secara bersamaan.

Implementasi Middleware Semaphore untuk gRPC

Cara Kerja Middleware gRPC Semaphore

  • Membatasi jumlah request yang masuk berdasarkan maxConcurrentRequests.

  • Jika slot penuh, request langsung ditolak dengan error ResourceExhausted.

  • Menggunakan channel sebagai semaphore untuk tracking request yang berjalan.

Implementasi Middleware Semaphore untuk REST API (HTTP)

Cara Menggunakan Middleware di HTTP Server

Kesimpulan

✅ Semaphore cocok di Middleware

  • gRPC: Gunakan UnaryInterceptor untuk batasi concurrent request di gRPC server.

  • REST API: Gunakan http.Handler middleware untuk batasi HTTP request di web server.

✅ Mengatasi Overload

  • Jika batas tercapai, request langsung ditolak dengan error Too many concurrent requests.

✅ Memastikan Performa Stabil

  • Dengan semaphore, server tidak overload meskipun banyak request masuk.

🚀 Gunakan middleware ini untuk melindungi API dari lonjakan traffic dan menjaga stabilitas server!

Last updated