Kotlin Academy · Ders

Dayanıklı Koroutin Mimarileri Tasarlama

Üretim düzeyinde eşzamanlılık için supervisorScope, yeniden deneme mantığı ve işleyicileri birleştirin.

4. ders / 413 adım

Dayanıklı Koroutin Mimarileri Tasarlama, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.

Koroutinleri Dayanıklı Kılan Nedir?

Dayanıklı koroutin mimarileri hataları zarifçe ele alır: hataları yalıtır, geçici hataları yeniden dener, güncelliğini yitirmiş işleri iptal eder ve kaynakları belirli biçimde temizler.

import kotlinx.coroutines.*
// Resilience pillars:
// 1. Failure isolation (SupervisorJob)
// 2. Retry with backoff (retry operator / loop)
// 3. Timeout guards (withTimeout)
// 4. Clean teardown (finally + NonCancellable)
// 5. Observability (CoroutineExceptionHandler)
fun main() = runBlocking { println("Design for failure from the start") }

Uygulama Düzeyi Kapsam Kalıbı

SupervisorJob + handler içeren tek bir uygulama düzeyi CoroutineScope oluşturun. Tüm hizmetlerin aynı yaşam döngüsünü paylaşması için bu kapsamı hizmetlere enjekte edin.

import kotlinx.coroutines.*
object AppCoroutineScope {
    private val handler = CoroutineExceptionHandler { _, e ->
        println("[AppScope] Uncaught: ${e.message}")
    }
    val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default + handler)
    fun cancel() = scope.cancel()
}

Üstel Beklemeyle Yeniden Deneme

Geçici başarısızlıkları zarifçe ele almak için ağ çağrılarını üstel bekleme kullanan bir yeniden deneme döngüsüyle sarmalayın.

import kotlinx.coroutines.*
suspend fun <T> retryWithBackoff(
    times: Int = 3,
    initialDelay: Long = 100,
    block: suspend () -> T
): T {
    var delay = initialDelay
    repeat(times - 1) { attempt ->
        try { return block() }
        catch (e: Exception) {
            if (e is CancellationException) throw e
            println("Attempt ${attempt+1} failed, retrying in ${delay}ms")
            delay(delay)
            delay *= 2
        }
    }
    return block()
}
fun main() = runBlocking {
    var n = 0
    val result = retryWithBackoff {
        if (n++ < 2) throw RuntimeException("transient")
        "success"
    }
    println(result)
}

Devre Kesici Kalıbı

Bir devre kesici, N başarısızlıktan sonra başarısız olan bir hizmeti çağırmayı durdurur ve soğuma süresinden sonra yeniden açılır — zincirleme başarısızlıkları önler.

import kotlinx.coroutines.*
class CircuitBreaker(val maxFailures: Int, val cooldownMs: Long) {
    private var failures = 0
    private var openUntil = 0L
    suspend fun <T> call(block: suspend () -> T): T {
        if (System.currentTimeMillis() < openUntil) throw RuntimeException("Circuit open")
        return try {
            val result = block()
            failures = 0
            result
        } catch (e: Exception) {
            if (e is CancellationException) throw e
            if (++failures >= maxFailures) openUntil = System.currentTimeMillis() + cooldownMs
            throw e
        }
    }
}

Her Harici Çağrıda Zaman Aşımı

Harici G/Ç işlemlerini her zaman withTimeout veya withTimeoutOrNull ile sarmalayın. Takılmış bir bağlantının bir koroutini süresiz olarak engellemesine asla izin vermeyin.

import kotlinx.coroutines.*
suspend fun fetchWithTimeout(url: String): String? = withTimeoutOrNull(3000) {
    // ktor: client.get(url).body()
    delay(100) // simulate
    "response from $url"
}
fun main() = runBlocking {
    val result = fetchWithTimeout("https://api.example.com")
    println(result ?: "Timed out")
}

Her Özellik İçin Yapılandırılmış Kapsam

Kendi SupervisorJob öğesine sahip ayrı bir CoroutineScope oluşturun. Özellik yok edildiğinde bu kapsamı iptal edin.

import kotlinx.coroutines.*
class FeatureController {
    private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
    fun start() {
        scope.launch { /* load data */ }
        scope.launch { /* subscribe to updates */ }
    }
    fun destroy() = scope.cancel()  // cancels all feature coroutines
}

use() ile Kaynak Güvenliği

AutoCloseable kaynakları için use { } kullanın. Koroutin iptaliyle birleştirin: koroutin iptal edilse bile kaynaklar kapatılır.

import kotlinx.coroutines.*
class Connection : AutoCloseable {
    override fun close() = println("Connection closed")
    suspend fun fetch(): String { delay(100); return "data" }
}
fun main() = runBlocking {
    val job = launch {
        Connection().use { conn ->
            println(conn.fetch())
        } // close() called even on cancellation
    }
    delay(50)
    job.cancelAndJoin()
}

Zarif Kapatma

Zarif kapatmayı uygulayın: yeni işleri kabul etmeyi durdurun, devam eden koroutinlerin tamamlanmasını bekleyin, ardından kapsamı cancel edin.

import kotlinx.coroutines.*
class WorkQueue {
    private val scope = CoroutineScope(SupervisorJob())
    private val jobs = mutableListOf<Job>()
    fun submit(block: suspend () -> Unit) {
        jobs += scope.launch { block() }
    }
    suspend fun shutdown() {
        jobs.forEach { it.join() }  // wait for all
        scope.cancel()               // then cancel scope
    }
}
fun main() = runBlocking {
    val q = WorkQueue()
    repeat(3) { i -> q.submit { delay(50); println("Task $i done") } }
    q.shutdown()
    println("Queue shut down cleanly")
}

Gözlemlenebilirlik: CoroutineName

Hata ayıklamak için koroutinleri CoroutineName ile etiketleyin. Adlar yığın izlerinde görünür ve yapılandırılmış günlük kaydı için istisna işleyicilerinde kullanılabilir.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val handler = CoroutineExceptionHandler { ctx, e ->
        println("[${ctx[CoroutineName]?.name}] Failed: ${e.message}")
    }
    CoroutineScope(SupervisorJob() + handler).apply {
        launch(CoroutineName("UserLoader")) { throw RuntimeException("DB error") }
        launch(CoroutineName("Analytics")) { delay(100); println("Analytics ok") }
        delay(200); cancel()
    }
}

GlobalScope Kullanımından Kaçının

Üretimde GlobalScope kullanmayın. Üst öğesi, yaşam döngüsü yönetimi ve yapılandırılmış iptali olmayan koroutinler oluşturur. Bunun yerine kapsamı belirlenmiş alternatifleri kullanın.

import kotlinx.coroutines.*
// BAD — GlobalScope leaks coroutines:
// GlobalScope.launch { delay(Long.MAX_VALUE) }

// GOOD — scoped, cancellable:
val scope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
scope.launch { delay(100); println("Scoped") }
fun main() = runBlocking { delay(200); scope.cancel() }

Dayanıklılığı Sınama

Gerçek gecikmeler olmadan birim sınamalarında başarısızlıkları, zaman aşımlarını ve yeniden denemeleri benzetmek için runTest ile TestCoroutineScheduler kullanın.

import kotlinx.coroutines.*
import kotlinx.coroutines.test.*
fun testRetry() = runTest {
    var attempts = 0
    val result = retryWithBackoff(3, 100) {
        if (attempts++ < 2) throw RuntimeException("fail")
        "ok"
    }
    println(result) // "ok"
}
// In test, virtual time advances instantly through delays

Kısa Kontrol

Dayanıklı, uzun ömürlü bir koroutin kapsamının temelini hangi birleşim oluşturur?

Özet

Dayanıklı mimariler yalıtım için denetleyici işini, geçici hatalar için retryWithBackoff öğesini, takılmış G/Ç işlemleri için withTimeout öğesini, temizleme için sonlandırma/NonCancellable öğesini ve gözlemlenebilirlik için CoroutineExceptionHandler öğesini birleştirir.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Kotlin öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
51
Dersler
203

Sıkça Sorulan Sorular

“Dayanıklı Koroutin Mimarileri Tasarlama” dersi ücretsiz mi?

Evet — “Dayanıklı Koroutin Mimarileri Tasarlama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.

“Dayanıklı Koroutin Mimarileri Tasarlama” dersinde ne öğreneceğim?

Üretim düzeyinde eşzamanlılık için supervisorScope, yeniden deneme mantığı ve işleyicileri birleştirin. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Dayanıklı Koroutin Mimarileri Tasarlama” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. SupervisorJob ve Job: Hata Yalıtımı
  2. CoroutineExceptionHandler: Genel Yakalanmamış İstisna İşleyicisi
  3. async/await İstisna Yayılımı
  4. Dayanıklı Koroutin Mimarileri Tasarlama
← Kotlin Academy Sayfasına Dön