📔
Microservices dengan Golang
  • Go Guidance
  • Golang Fundamental
    • Basic Golang
    • Pseudo OOP
    • Konkurensi
  • Design Pattern
    • Singleton
    • Dependency Injection
    • Concurrency Pattern
      • Worker Pool
      • Future / Promise
      • Rate Limit Pattern
      • Semaphore
      • Single Flight
  • Build Rest API Framework
    • Pengenalan Rest API
    • Start up
    • Shutdown
    • Json
    • Database
    • Clean architecture
    • Configuration
    • Fatal
    • Logging
    • Routing
    • CRUD
    • Request Response Helper
    • Error Handler
    • Unit Testing
    • API Testing
    • Context
    • Validation
    • Middleware
    • Token
    • Role Based Access Controller
  • GraphQL Framework
    • Pengenalan GraphQL
  • gRPC Framework
    • Pengenalan gRPC
    • Protocol Buffer
    • makefile
    • gRPC Server
    • Config
    • Database
    • Routing
    • Clean Architecture
    • gRPC Client
    • Tracing
    • Caching
    • gRPC Testing
Powered by GitBook
On this page
  • 1. Worker Pool
  • 2. Fan-Out, Fan-In
  • 3. Publish-Subscribe (Pub-Sub)
  • 4. Pipeline
  • 5. Future / Promise
  • 6. Rate Limiting / Token Bucket
  • 7. Semaphore
  • 8. Balking Pattern
  • 9. Single Flight Pattern
  • 10. Circuit Breaker

Was this helpful?

  1. Design Pattern

Concurrency Pattern

PreviousDependency InjectionNextWorker Pool

Last updated 2 months ago

Was this helpful?

Untuk alasan performance, kita sering mengeksploitasi fitur konkurensi di golang. Ada beberapa pattern yang terkenal terkait konkurensi ini, beberapa diantaranya adalah :

1.

  • Membuat sejumlah worker (goroutine) tetap yang mengambil tugas dari sebuah job queue.

  • Digunakan untuk membatasi jumlah goroutine agar tidak membebani CPU/memori.

Contoh Kasus: Pemrosesan antrian tugas di backend, seperti pemrosesan gambar atau request API.

2. Fan-Out, Fan-In

  • Fan-Out: Banyak goroutine dibuat untuk memproses data dari satu sumber.

  • Fan-In: Beberapa goroutine mengirimkan hasilnya ke satu channel untuk digabungkan.

Contoh Kasus: Memproses banyak permintaan HTTP secara paralel, lalu menggabungkan hasilnya.

3. Publish-Subscribe (Pub-Sub)

  • Satu publisher mengirimkan pesan ke banyak subscriber.

  • Bisa dilakukan dengan channel atau message broker seperti Redis Pub/Sub atau Kafka.

Contoh Kasus: Notifikasi real-time, event-driven architecture.

4. Pipeline

  • Data mengalir melalui beberapa tahap pemrosesan, di mana setiap tahap dilakukan oleh goroutine berbeda.

  • Setiap tahap beroperasi secara independen dengan channel sebagai perantara.

Contoh Kasus: ETL (Extract, Transform, Load), pemrosesan data bertingkat.

  • Menggunakan goroutine untuk menjalankan tugas async dan mengembalikan hasilnya melalui channel atau struct yang menampung nilai dan status.

Contoh Kasus: Menjalankan beberapa query database secara paralel dan menunggu hasilnya.

  • Mengontrol jumlah goroutine atau request dalam periode waktu tertentu untuk mencegah overload.

Contoh Kasus: Membatasi jumlah request API ke layanan eksternal.

  • Menggunakan semaphoric channel untuk membatasi jumlah goroutine yang berjalan bersamaan.

Contoh Kasus: Mengontrol akses ke sumber daya yang terbatas seperti koneksi database.

8. Balking Pattern

  • Jika suatu goroutine menemukan kondisi tertentu (misalnya, resource sedang dipakai), maka ia membatalkan tugasnya tanpa menunggu.

Contoh Kasus: Cache warming, di mana hanya satu goroutine yang boleh memperbarui cache.

  • Jika dalam waktu bersamaan ada beberapa permintaan identik yang masuk, maka hanya ada satu permintaan yang diteruskan, yang lainnya akan menunggu. Setelah permintaan yang diteruskan mendapatakan response, maka semua permintaan yang masuk akan menerima response yang sama.

  • Banyak digunakan untuk mengelola permintaan ke sebuah proses yang lambat/berat.

Contoh Kasus: request reporting, request ke heavy database, request ke proses yang latency tinggi dan consume banyak resource (memory/cpu), call api third party yang lambat.

10. Circuit Breaker

  • Jika ada kegagalan berturut-turut, sistem akan berhenti mencoba untuk sementara waktu.

  • Bisa dikombinasikan dengan timeout atau retry pattern.

Contoh Kasus: Mencegah request berulang ke layanan eksternal yang sedang down.

5.

6.

7.

9.

Worker Pool
Future / Promise
Rate Limiting / Token Bucket
Semaphore
Single Flight Pattern