1
Ringkasan Proyek
Heimdall adalah HTTP client untuk Go yang membantu aplikasi mengirim request dalam jumlah besar. Modul ini bernama github.com/gojek/heimdall/v8, menargetkan go 1.25, dan hanya bergantung pada github.com/gojek/hystrix-go/hystrix serta github.com/stretchr/testify untuk pengujian (go.mod:1-81).
Tiga kemampuan utama yang dijanjikan README adalah circuit breaker bergaya hystrix untuk menahan request yang gagal, retry in-memory yang berjalan sinkron dengan strategi retrier yang bisa diganti, serta client dengan timeout berbeda untuk setiap request. Semua HTTP method tersedia lewat fluent interface (README.md:26-312).
Peta modul
Struktur repository mengikuti satu gagasan: kontrak tinggal di paket akar heimdall, lalu dua implementasi client membangun di atasnya.
graph TD
subgraph core["paket heimdall (akar)"]
Client["Client & Doer"]
Backoff["Backoff"]
Retriable["Retriable"]
Plugin["Plugin"]
end
HTTP["httpclient.Client"] --> Client
HTTP --> Backoff
HTTP --> Retriable
HTTP --> Plugin
HTTP --> EB["internal.ErrorBudget"]
Hystrix["hystrix.Client"] --> HTTP
Hystrix --> HX["hystrix-go"]
RL["plugins.NewRequestLogger"] --> Plugin
style Client fill:#f59e0b,color:#000
style Backoff fill:#f59e0b,color:#000
style Retriable fill:#f59e0b,color:#000
style Plugin fill:#f59e0b,color:#000
style HTTP fill:#2d7d46,color:#fff
style Hystrix fill:#dc2626,color:#fff
style HX fill:#dc2626,color:#fff
style EB fill:#8b5cf6,color:#fff
style RL fill:#8b5cf6,color:#fff
%% fig: Ketergantungan modul Heimdall
%% desc: Paket akar menyediakan kontrak, httpclient mengimplementasikannya dengan retry, dan hystrix membungkus httpclient dengan circuit breaker dari hystrix-go.Paket akar mendefinisikan Doer dan Client. Doer cukup memiliki metode Do(*http.Request) (*http.Response, error), sehingga tipe seperti net/http.Client bisa dipakai sebagai client kustom. Client menyatukan Get, Post, Put, Patch, Delete, Do, dan AddPlugin dalam satu antarmuka (client.go:8-233).
Dua kontrak lain mengatur perilaku retry. Backoff hanya menuntut Next(retry int) time.Duration (backoff.go:9-124), sedangkan Retriable menuntut NextInterval(retry int) time.Duration (retry.go:5-85). Pemisahan ini membuat strategi jeda dan mekanisme retry bisa diganti secara terpisah, dan heimdall.NewRetrier menjembatani keduanya.
Kontrak ketiga adalah Plugin, yang menerima tiga callback selama siklus hidup request: OnRequestStart, OnRequestEnd, dan OnError (plugin.go:7-136). Ringkasan pemakaian plugin ada di Plugin dan Request Logger.
Dua implementasi client
httpclient.Client adalah implementasi dasar. Struct-nya menyimpan heimdall.Doer, daftar plugins, timeout, retrier, retryCount, retryableCodes, dan retryErrorBudget (httpclient/client.go:15-327). Nilai bawaannya adalah defaultRetryCount = 0 dan defaultHTTPTimeout = 30 * time.Second, dengan retrier awal heimdall.NewNoRetrier() (httpclient/client.go:34-498). Artinya client tanpa option tidak melakukan retry sama sekali.
hystrix.Client membungkus client tersebut. Struct-nya memegang *httpclient.Client ditambah parameter circuit breaker: hystrixTimeout, hystrixCommandName, maxConcurrentRequests, requestVolumeThreshold, sleepWindow, errorPercentThreshold, dan fallbackFunc (hystrix/hystrix_client.go:21-379). hystrix.NewClient membuat httpclient.NewClient() lebih dulu, menjalankan semua Option, lalu mendaftarkan konfigurasi ke hystrix.ConfigureCommand (hystrix/hystrix_client.go:54-8010). Detail pemakaiannya ada di Klien Circuit Breaker.
| Path | Peran | Identifier kunci |
|---|---|---|
akar (package heimdall) | kontrak dan utilitas retry/backoff | Doer, Client, Backoff, Retriable, Plugin (client.go:8-233) |
httpclient/ | client dengan retry, timeout, dan plugin | Client, NewClient, Option (httpclient/client.go:15-327) |
hystrix/ | client dengan circuit breaker dan fallback | Client, NewClient (hystrix/hystrix_client.go:21-379) |
internal/ | helper internal, termasuk pengendali budget retry | ErrorBudget, NewTokenErrorBudget, NewPercentErrorBudget (internal/error_budget.go:11-1911) |
plugins/ | plugin siap pakai | NewRequestLogger (plugins/request_logger.go:27-3812) |
examples/ | contoh pemakaian httpclient dan hystrix | httpClientUsage, hystrixClientUsage (examples/client.go:18-2513) |
Batas versi dan riwayat
Repository sudah memakai module path berversi v8 (go.mod:114), tetapi CHANGELOG.md hanya memuat satu entri, yaitu v0.0.1 (2018-JAN-19) dengan catatan "initial fork commit" dan "open-source stepping stones" (CHANGELOG.md:3-615).
⚠️ Jangan memakai
CHANGELOG.mdsebagai sumber nomor versi. Untuk memastikan versi yang dipakai, baca module path digo.moddan tag repository.
Ke mana harus membaca selanjutnya
- Arsitektur Modul memerinci peran setiap berkas dan paket.
- Instalasi dan Memulai memuat langkah pemasangan dan contoh pertama.
- Klien HTTP Dasar serta Siklus Request dan Retry membahas
httpclient.Clientsampai ke loop retry-nya. - Retry dan Backoff membahas
NewConstantBackoffdanNewExponentialBackoff. - Error Budget untuk Retry menjelaskan
internal.ErrorBudgetyang dipakaiskipRetry. - Pengembangan dan Pengujian menjelaskan target
Makefileuntukbuilddantest.