Async/Await di .NET Bisa Boros Resource Kalau Tanpa Limit ๐๐
Source: Dev.to
Pendahuluan
Banyak dari kita berpikir bahwa menggunakan async/await secara otomatis membuat aplikasi kita โskalabelโ. Namun, tanpa mekanisme pembatasan (throttling), kode async justru dapat menjadi senjata makan tuan yang menghabiskan resource server dalam sekejap. Pada artikel ini (dan video YouTube terbaru saya), kita akan membahas mengapa Task.WhenAll tanpa limit berbahaya dan bagaimana SemaphoreSlim dapat menyelamatkan server Anda.
Apa yang Terjadi di Balik Layar?
- Socket Exhaustion โ Server kehabisan port untuk koneksi keluar.
- Database Pool Starvation โ Request lain tertahan karena semua koneksi DB sedang dipakai.
- RAM Spike โ Setiap task membawa state machine dan alokasi memori sendiriโsendiri.
Akibatnya, server โhangโ, request timeout, dan pengguna menjadi kecewa.
SemaphoreSlim
SemaphoreSlim adalah cara paling ringan di .NET untuk membatasi berapa banyak task yang boleh berjalan secara konkuren.
Cara Implementasi yang Benar
// Batasi maksimal 10 operasi konkuren
using var semaphore = new SemaphoreSlim(10);
var tasks = dataList.Select(async d =>
{
await semaphore.WaitAsync(); // Antre di sini
try
{
await CallExternalApiAsync(d);
}
finally
{
semaphore.Release(); // Lepas slot untuk task berikutnya
}
});
await Task.WhenAll(tasks);
Dengan kode ini, meskipun Anda memiliki 1.000 data, hanya 10 data yang diproses secara bersamaan. Resource server tetap terjaga, dan aplikasi tetap responsif.
Praktik Terbaik
- Gunakan
try...finally: Selalu panggilRelease()di blokfinally. Jika tidak, slot semaphore akan โbocorโ dan aplikasi dapat mengalami deadlock. - Tentukan Limit yang Rasional: Jangan asal memasang angka. Sesuaikan limit dengan kemampuan resource (misalnya: jumlah koneksi maksimal di Database Pool Anda).
- Semaphore vs Lock: Hindari penggunaan
lockbiasa untuk kode async.lockmemblokir thread, sedangkanWaitAsync()membebaskan thread untuk mengerjakan hal lain sambil menunggu antrean.
Kesimpulan
async/await memberikan kita kekuatan, tetapi SemaphoreSlim memberikan kita kendali. Jangan biarkan server Anda tumbang hanya karena mencoba melakukan terlalu banyak hal pada waktu yang sama. Batasi concurrency dengan bijak, dan aplikasi Anda akan tetap responsif serta stabil.