0Pricing
Scala for Backend Engineering & Functional Programming · Ders

Geri Basınç

Hızlı üreticileri güvenle yönetin.

Geri Basınç, CoddyKit'te ücretsiz bir Scala for Backend Engineering & Functional Programming dersidir. Bu, 4 dersinin 3. 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, Scala for Backend Engineering & Functional Programming öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Scala for Backend Engineering & Functional Programming kursu toplamda 4 dersten oluşur.

Geri Basınç Nedir?

Geri basınç, hızlı bir üreticinin yavaş bir tüketiciyi aşırı yüklemesini önleyen bir akış denetimi mekanizmasıdır. Tüketici, sınırsız arabelleğe almak veya verileri atmak yerine ne kadarını işleyebileceğini bildirir.

Akka Streams, talebin yukarı akışa, öğelerin ise aşağı akışa ilerlediği Reactive Streams standardını uygular.

Talep Odaklı Akış

Her aşama yalnızca bir sonraki aşama talep bildirdiğinde yayım yapar. Bir Sink N öğe ister; bu talep, bir Source tam olarak istenen miktarı üretene kadar yukarı akışa iletilir.

Çekme tabanlı bu protokol, üreticilerin tüketicilerin işleyebileceğinden fazlasını göndermemesini sağlar.

İşlem Hatları İçin Önemi

Geri basınç olmasaydı, yavaş bir veritabanına veri sağlayan hızlı bir Kafka tüketicisi, belleği tüketip sürecin çökmesine yol açacak şekilde milyonlarca işlenmekte olan kaydı biriktirirdi.

Geri basınç, yukarı akışı doğal olarak en yavaş aşamanın hızına düşürür ve yük altında bellek kullanımını sabit tutar.

// Fast source, slow sink: backpressure slows the source
val g =
  Source(1 to 1000000)
    .map(_ * 2)
    .to(slowDatabaseSink)

Dahili Arabelleğe Alma

Akka Streams, eşzamansız sınırlar arasında küçük bir dahili arabellek tutar (varsayılan olarak 16 öğe). Bu arabellek, kısa süreli yoğunlukları karşılar; böylece aşamaların her öğede eşzamanlı ilerlemesi gerekmez.

Arabellek dolduğunda geri basınç devreye girer ve yer açılana kadar yukarı akış üretimi durur.

import akka.stream.Attributes

val buffered =
  Flow[Int]
    .map(identity)
    .addAttributes(Attributes.inputBuffer(initial = 32, max = 32))

OverflowStrategy ile Açık Arabellek

buffer işleci, seçilen boyutta açık bir arabellek ekler ve dolduğunda ne olacağını belirleyen bir OverflowStrategy kullanır.

Bu, üretici ve tüketici hızlarını birbirinden ayırabilme karşılığında bellek kullanımıyla ilgili bir tercih yapmanızı sağlar.

import akka.stream.OverflowStrategy

val withBuffer =
  Source(1 to 1000)
    .buffer(size = 100, OverflowStrategy.backpressure)

Taşma Stratejileri

Stratejiler arasında backpressure (yukarı akışı yavaşlatır), dropHead/dropTail (en eski veya en yeni öğeleri atar), dropBuffer, dropNew ve fail (hatayla sonlandırır) bulunur.

Atma stratejileri, güncelliğini yitirmiş değerlerin güvenle atılabildiği sensör okumaları gibi canlı veriler için uygundur.

import akka.stream.OverflowStrategy

val latestWins =
  liveTicks.buffer(1, OverflowStrategy.dropHead)

val strict =
  liveTicks.buffer(50, OverflowStrategy.fail)

Özetlemek İçin Conflate

Tüketici yavaş olduğunda conflate, bekleyen öğelerin tümünü arabelleğe almak yerine birleştirme işlevi kullanarak bunları tek bir öğede birleştirir.

Örneğin, çok sayıdaki sayısal güncellemeyi toplamlarında birleştirebilirsiniz; böylece tüketici, kaçırdığı verilerin bir toplamını her zaman görür.

val summarized =
  fastMetrics
    .conflate((acc, next) => acc + next)

// Slow downstream receives summed batches

Talebi Doldurmak İçin Expand

expand, conflate'in ikili karşılığıdır: aşağı akış talebi yukarı akışın üretiminden daha hızlı olduğunda, son görülen değerden ek öğeler türetir.

Bu, en son okumayı sabit bir hızla yayımlamayı sürdürmek için kullanışlıdır.

val repeated =
  sensor.expand(last => Iterator.continually(last))

// Downstream always gets the latest sensor value

Eşzamansız Sınırlar

Varsayılan olarak, birleştirilmiş aşamalar aralarında arabellek olmadan tek bir actor üzerinde çalışır. async eklemek, bir aşamayı kendi actor'üne yerleştirir; bir arabellek ekler ve işlem hattı biçiminde paralelliği etkinleştirir.

Eşzamansız sınırlar, geri basınç arabelleklerinin gerçekten bulunduğu yerlerdir.

val pipelined =
  Source(1 to 1000)
    .map(slowStep).async
    .map(anotherSlowStep).async
    .to(Sink.ignore)

Açık Hız Denetimi Olarak Throttle

throttle, bilinçli bir azami hız uygular ve bu sınıra uymak için yukarı akışta geri basınç oluşturur. Böylece tüketici daha hızlı ilerleyebilecek olsa bile hız sınırı bulunan harici hizmetler korunur.

Bir yoğunluk parametresi, sabit hızın üzerinde kısa süreli artışlara izin verir.

import scala.concurrent.duration._

val limited =
  requests
    .throttle(
      elements = 100, per = 1.second, maximumBurst = 20,
      akka.stream.ThrottleMode.Shaping)

Geri Basıncı Gözlemleme

Yukarı akıştaki yavaşlamaları izleyerek veya arabellek doluluğunu ölçerek geri basıncı tespit edebilirsiniz. log işleci ve Akka'nın akış öznitelikleri, bir işlem hattının nerede tıkandığını izlemeye yardımcı olur.

Sürekli dolu kalan bir arabellek, aktarım hızını sınırlayan en yavaş aşamayı gösterir.

val traced =
  Source(1 to 100)
    .log("after-source")
    .map(_ * 2)
    .log("after-map")
    .to(Sink.ignore)

Hızlı Kontrol

Akka Streams'in hızlı bir üreticinin yavaş bir tüketiciyi veriye boğmasını nasıl önlediğini düşünün.

Özet

Geri basınç, Akka Streams'in talep odaklı omurgasıdır: tüketiciler talebi yukarı akışa bildirir; böylece üreticiler onları aşırı yükleyemez ve bellek kullanımı sınırlı kalır.

Dahili arabellekleri, taşma stratejileriyle birlikte açık buffer işlecini, conflate ile özetlemeyi, expand ile talebi doldurmayı, eşzamansız sınırları ve throttle ile bilinçli hız denetimini gördünüz. Sırada, eksiksiz bir işlem hattını çalıştıracaksınız.

Sıkça Sorulan Sorular

“Geri Basınç” dersi ücretsiz mi?

Evet — “Geri Basınç” 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 Scala for Backend Engineering & Functional Programming kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Scala for Backend Engineering & Functional Programming kursu toplamda 4 dersten oluşur.

“Geri Basınç” dersinde ne öğreneceğim?

Hızlı üreticileri güvenle yönetin. Scala for Backend Engineering & Functional Programming 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.

Scala for Backend Engineering & Functional Programming öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Scala for Backend Engineering & Functional Programming, 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 3. dersidir.

“Geri Basınç” 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 Scala for Backend Engineering & Functional Programming dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Scala for Backend Engineering & Functional Programming 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. Source, Flow ve Sink
  2. Akışları Dönüştürme
  3. Geri Basınç
  4. Bir İşlem Hattı Çalıştırma
← Scala for Backend Engineering & Functional Programming Sayfasına Dön