{"id":17967254,"url":"https://github.com/hibbannn/pool-manager","last_synced_at":"2026-02-07T01:01:29.183Z","repository":{"id":259065342,"uuid":"875398380","full_name":"hibbannn/pool-manager","owner":"hibbannn","description":"Pool Manager dirancang untuk mengelola pooling objek secara efisien dalam aplikasi Anda. Dengan fitur-fitur seperti sharding, caching, auto-tuning, dan kebijakan eviksi, package ini membantu meningkatkan performa dan efisiensi penggunaan memori. ","archived":false,"fork":false,"pushed_at":"2024-10-27T09:48:34.000Z","size":37,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-10-29T15:45:54.763Z","etag":null,"topics":["auto-tuning","caching","concurrency","eviction-policy","go","memory-management","performance","pooling","shrading"],"latest_commit_sha":null,"homepage":"https://www.linkedin.com/in/hibbann/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hibbannn.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-19T21:39:01.000Z","updated_at":"2024-10-25T18:23:33.000Z","dependencies_parsed_at":"2024-10-22T06:13:29.555Z","dependency_job_id":"26613560-4344-48a2-9d4e-94f4f45e36db","html_url":"https://github.com/hibbannn/pool-manager","commit_stats":null,"previous_names":["hibbannn/pool-manager"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/hibbannn/pool-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hibbannn%2Fpool-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hibbannn%2Fpool-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hibbannn%2Fpool-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hibbannn%2Fpool-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hibbannn","download_url":"https://codeload.github.com/hibbannn/pool-manager/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hibbannn%2Fpool-manager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29183274,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-07T00:44:15.062Z","status":"ssl_error","status_checked_at":"2026-02-07T00:35:01.758Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["auto-tuning","caching","concurrency","eviction-policy","go","memory-management","performance","pooling","shrading"],"created_at":"2024-10-29T14:04:54.459Z","updated_at":"2026-02-07T01:01:29.107Z","avatar_url":"https://github.com/hibbannn.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PoolManager\n\n`poolmanager` adalah sebuah package di Go yang digunakan untuk mengelola pooling objek secara efisien. Package ini memungkinkan Anda untuk mengatur konfigurasi pooling, sharding, caching, auto-tuning, dan kebijakan eviksi untuk objek-objek yang sering digunakan dalam aplikasi Anda.\n\n## Fitur\n\n- **Pooling**: Mengelola objek secara efisien untuk menghindari overhead pembuatan objek berulang.\n- **Sharding**: Mendukung pembagian pool menjadi beberapa shard untuk meningkatkan performa pada lingkungan bersamaan.\n- **Caching**: Menyediakan caching untuk mengurangi akses berulang ke objek yang sering digunakan.\n- **Auto-Tuning**: Menyesuaikan ukuran pool secara otomatis berdasarkan kebutuhan aplikasi.\n- **Eviction Policies**: Mendukung berbagai kebijakan eviksi seperti TTL, LRU, dan LFU untuk mengelola objek yang tidak terpakai.\n- **Monitoring**: Mencatat metrik penggunaan objek dalam pool dan menyediakan callback untuk berbagai kejadian.\n\n## Instalasi\n\nUntuk menggunakan package ini, silakan unduh melalui Go modules:\n\n```bash\ngo get github.com/hibbannn/pool-manager\n```\n\n## Pool Configuration Guide\n\nAnda dapat mengatur konfigurasi pool menggunakan `PoolConfigBuilder`. Berikut adalah opsi konfigurasi yang tersedia:\n\n### Opsi Konfigurasi\n\n#### `WithSizeLimit(sizeLimit int)`\n- Menetapkan batas maksimum ukuran pool.\n- **Parameter:**\n    - `sizeLimit`: Batas maksimum jumlah objek yang dapat disimpan di dalam pool.\n\n#### `WithInitialSize(initialSize int)`\n- Menetapkan ukuran awal pool saat diinisialisasi.\n- **Parameter:**\n    - `initialSize`: Ukuran awal objek di dalam pool.\n\n#### `WithAutoTune(autoTune bool)`\n- Mengaktifkan atau menonaktifkan fitur auto-tuning.\n- **Parameter:**\n    - `autoTune`: `true` untuk mengaktifkan auto-tuning, `false` untuk menonaktifkan.\n\n#### `WithAutoTuneFactor(factor float64)`\n- Menetapkan faktor peningkatan ukuran pool saat auto-tuning diaktifkan.\n- **Parameter:**\n    - `factor`: Faktor peningkatan ukuran.\n\n#### `WithEnableCaching(enable bool)`\n- Mengaktifkan atau menonaktifkan caching.\n- **Parameter:**\n    - `enable`: `true` untuk mengaktifkan caching, `false` untuk menonaktifkan.\n\n#### `WithCacheMaxSize(maxSize int)`\n- Menetapkan batas maksimum jumlah objek yang dapat disimpan dalam cache.\n- **Parameter:**\n    - `maxSize`: Batas maksimum ukuran cache.\n\n#### `WithSharding(enabled bool, shardCount int)`\n- Mengaktifkan fitur sharding dan menetapkan jumlah shard.\n- **Parameter:**\n    - `enabled`: `true` untuk mengaktifkan sharding, `false` untuk menonaktifkan.\n    - `shardCount`: Jumlah shard yang digunakan.\n\n#### `WithTTL(ttl time.Duration)`\n- Menetapkan Time-to-Live (TTL) untuk kebijakan eviksi objek dalam pool.\n- **Parameter:**\n    - `ttl`: Durasi TTL.\n\n#### `WithOnGet(callback func(poolType string))`\n- Menetapkan callback yang dipanggil saat objek diambil dari pool.\n- **Parameter:**\n    - `callback`: Fungsi yang dipanggil, dengan parameter `poolType` yang menunjukkan tipe pool.\n\n#### `WithOnPut(callback func(poolType string))`\n- Menetapkan callback yang dipanggil saat objek dikembalikan ke pool.\n- **Parameter:**\n    - `callback`: Fungsi yang dipanggil, dengan parameter `poolType` yang menunjukkan tipe pool.\n\n#### `WithOnEvict(callback func(poolType string))`\n- Menetapkan callback yang dipanggil saat objek dihapus dari pool.\n- **Parameter:**\n    - `callback`: Fungsi yang dipanggil, dengan parameter `poolType` yang menunjukkan tipe pool.\n\n#### `WithOnAutoTune(callback func(poolType string, newSize int))`\n- Menetapkan callback yang dipanggil saat auto-tuning terjadi.\n- **Parameter:**\n    - `callback`: Fungsi yang dipanggil, dengan parameter `poolType` dan `newSize` yang menunjukkan ukuran baru setelah auto-tuning.\n\n#### `WithOnError(callback func(poolType string, err error))`\n- Menetapkan callback yang dipanggil saat terjadi error.\n- **Parameter:**\n    - `callback`: Fungsi yang dipanggil, dengan parameter `poolType` dan `err` yang menunjukkan jenis kesalahan.\n\n## Contoh Builder\n\nBerikut adalah contoh penggunaan konfigurasi pool:\n\n```go\npoolConfig := NewPoolConfigBuilder().\n    WithSizeLimit(100).\n    WithInitialSize(10).\n    WithAutoTune(true).\n    WithAutoTuneFactor(1.5).\n    WithEnableCaching(true).\n    WithCacheMaxSize(50).\n    WithSharding(true, 4).\n    WithTTL(5 * time.Minute).\n    WithOnGet(func(poolType string) {\n        fmt.Println(\"Object taken from pool:\", poolType)\n    }).\n    WithOnPut(func(poolType string) {\n        fmt.Println(\"Object returned to pool:\", poolType)\n    }).\n    WithOnEvict(func(poolType string) {\n        fmt.Println(\"Object evicted from pool:\", poolType)\n    }).\n    WithOnAutoTune(func(poolType string, newSize int) {\n        fmt.Printf(\"Auto-tuning for %s, new size: %d\\n\", poolType, newSize)\n    }).\n    WithOnError(func(poolType string, err error) {\n        fmt.Printf(\"Error in %s: %v\\n\", poolType, err)\n    }).\n    Build()\n```\n\n## Mengimplementasikan `PoolAble`\n\nUntuk menggunakan objek dalam pool, struct harus mengimplementasikan interface `PoolAble` dengan mendefinisikan metode `Reset`. Metode ini digunakan untuk mereset status objek sebelum dikembalikan ke pool.\nContoh:\n```go\ntype LargeObject struct {\n    Data   [102400]byte // Simulasi objek besar (100 KB)\n    ID     int\n    Name   string\n}\n\n// Reset mengimplementasikan metode Reset pada interface PoolAble\nfunc (l *LargeObject) Reset() {\n    l.ID = 0\n    l.Name = \"\"\n}\n```\n\n### Sharding\n\nSharding dapat diaktifkan untuk membagi pool menjadi beberapa bagian (shard) yang berbeda. Ini berguna dalam aplikasi bersamaan dengan tingkat konkurensi tinggi, di mana akses ke objek dari pool sering terjadi. Sharding membantu mengurangi kontensi dengan mendistribusikan permintaan ke beberapa shard.\n\n- **WithSharding**: Mengaktifkan fitur sharding dan menentukan jumlah shard.\n\nContoh:\n```go\nWithSharding(true, 4) // Mengaktifkan sharding dengan 4 shard\n```\n\n### Kebijakan Eviksi\n\n`poolmanager` mendukung beberapa kebijakan eviksi untuk mengelola objek dalam pool, termasuk:\n\n- **TTL (Time-To-Live)**: Menghapus objek yang sudah tidak digunakan selama periode waktu tertentu.\n- **LRU (Least Recently Used)**: Menghapus objek yang paling jarang digunakan baru-baru ini.\n- **LFU (Least Frequently Used)**: Menghapus objek yang paling jarang digunakan secara keseluruhan.\n\nAnda dapat menetapkan kebijakan eviksi melalui konfigurasi pool.\n\nContoh:\n```go\npoolConfig := NewPoolConfigBuilder().\n    WithTTL(5 * time.Minute).\n    Build()\n```\n\n## Contoh\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"sync\"\n    \"time\"\n    \"github.com/hibbannn/pool-manager\"\n)\n\n// LargeObject adalah contoh struct yang mengimplementasikan interface PoolAble\ntype LargeObject struct {\n    Data   [102400]byte // Simulasi objek besar (100 KB)\n    ID     int\n    Name   string\n}\n\n// Reset mengimplementasikan metode Reset pada interface PoolAble\nfunc (l *LargeObject) Reset() {\n    l.ID = 0\n    l.Name = \"\"\n}\n\nfunc main() {\n    // Buat instance PoolManager\n    poolManager := poolmanager.NewPoolManager()\n\n    // Konfigurasi Pool dengan berbagai opsi\n    poolConfig := poolmanager.NewPoolConfigBuilder().\n        WithSizeLimit(2000).\n        WithInitialSize(100).\n        WithAutoTune(true).\n        WithAutoTuneFactor(1.5).\n        WithEnableCaching(true).\n        WithCacheMaxSize(500).\n        WithSharding(true, 10).\n        WithTTL(10 * time.Minute).\n        Build()\n\n    // Tambahkan pool dengan tipe \"largeObject\"\n    err := poolManager.AddPool(\"largeObject\", func() poolmanager.PoolAble {\n        return \u0026LargeObject{}\n    }, poolConfig)\n\n    if err != nil {\n        fmt.Println(\"Gagal menambahkan pool:\", err)\n        return\n    }\n\n    // Contoh penggunaan pool dengan beberapa goroutine\n    const numWorkers = 10\n    const iterations = 1000\n    var wg sync.WaitGroup\n    wg.Add(numWorkers)\n\n    for i := 0; i \u003c numWorkers; i++ {\n        go func(workerID int) {\n            defer wg.Done()\n            for j := 0; j \u003c iterations; j++ {\n                instance, err := poolManager.AcquireInstance(\"largeObject\")\n                if err != nil {\n                    fmt.Println(\"Gagal mengambil instance:\", err)\n                    continue\n                }\n\n                largeObj, ok := instance.(*LargeObject)\n                if ok {\n                    largeObj.ID = workerID*iterations + j\n                    largeObj.Name = fmt.Sprintf(\"Worker-%d-Item-%d\", workerID, j)\n                }\n\n                // Kembalikan objek ke pool setelah selesai digunakan\n                err = poolManager.ReleaseInstance(\"largeObject\", largeObj)\n                if err != nil {\n                    fmt.Println(\"Gagal mengembalikan instance:\", err)\n                }\n            }\n        }(i)\n    }\n\n    wg.Wait()\n    fmt.Println(\"Selesai menjalankan contoh.\")\n}\n```\n\n### FAQ / Troubleshooting\n\n#### Q: Mengapa saya mendapatkan error \"pool does not exist\" saat memanggil `AcquireInstance`?\nA: Pastikan Anda sudah menambahkan pool dengan `AddPool` sebelum mencoba mengambil instance dari pool.\n\n#### Q: Apa yang terjadi jika `ReleaseInstance` gagal?\nA: Jika terjadi error saat mengembalikan objek ke pool, periksa callback `OnError` untuk menangani error ini dengan lebih baik.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhibbannn%2Fpool-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhibbannn%2Fpool-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhibbannn%2Fpool-manager/lists"}