Scala for Backend Engineering & Functional Programming · Pelajaran

Tekanan Balik

Tangani produsen cepat dengan aman.

Pelajaran 3 dari 413 langkah

Tekanan Balik adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Scala for Backend Engineering & Functional Programming, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.

Apa Itu Backpressure?

Backpressure adalah mekanisme pengendalian aliran yang mencegah produsen cepat membebani konsumen lambat. Alih-alih melakukan buffering tanpa batas atau membuang data, konsumen memberi sinyal tentang jumlah data yang sanggup ditanganinya.

Akka Streams menerapkan standar Reactive Streams, yang membuat permintaan mengalir ke upstream dan elemen mengalir ke downstream.

Aliran Berbasis Permintaan

Setiap tahap hanya menghasilkan elemen ketika tahap berikutnya telah memberi sinyal permintaan. Sink meminta N elemen; permintaan itu diteruskan ke upstream sampai Source menghasilkan tepat sebanyak yang diminta.

Protokol berbasis pull ini berarti produsen tidak pernah mendorong lebih banyak data daripada yang dapat diproses konsumen.

Mengapa Ini Penting bagi Pipeline

Tanpa backpressure, konsumen Kafka yang cepat dan memasok basis data yang lambat akan menumpuk jutaan rekaman yang sedang diproses, menghabiskan memori, lalu membuat proses mengalami kerusakan.

Backpressure secara alami memperlambat upstream hingga mengikuti tahap yang paling lambat, sehingga penggunaan memori tetap stabil saat beban tinggi.

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

Buffer Internal

Di antara batas asinkron, Akka Streams mempertahankan buffer internal kecil (secara bawaan 16 elemen). Buffer ini menyerap lonjakan singkat sehingga tahap-tahap tidak perlu menunggu satu sama lain untuk setiap elemen.

Saat buffer penuh, backpressure aktif dan upstream berhenti menghasilkan data sampai ruang tersedia kembali.

import akka.stream.Attributes

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

buffer Eksplisit dengan Strategi Overflow

Operator buffer menyisipkan buffer eksplisit dengan ukuran yang dipilih, menggunakan OverflowStrategy untuk menentukan tindakan saat buffer penuh.

Dengan demikian, Anda dapat menukar penggunaan memori dengan kemampuan memisahkan kecepatan produsen dan konsumen.

import akka.stream.OverflowStrategy

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

Strategi Overflow

Strateginya mencakup backpressure (memperlambat upstream), dropHead/dropTail (membuang yang paling lama atau paling baru), dropBuffer, dropNew, dan fail (mengakhiri dengan kesalahan).

Strategi pembuangan cocok untuk data langsung seperti pembacaan sensor, yang nilai kedaluwarsanya dapat dibuang dengan aman.

import akka.stream.OverflowStrategy

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

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

conflate untuk Membuat Ringkasan

Saat konsumen lambat, conflate menggabungkan elemen yang menunggu menjadi satu menggunakan fungsi penggabungan, alih-alih menyangga semuanya.

Misalnya, gabungkan banyak pembaruan numerik menjadi jumlahnya, sehingga konsumen selalu melihat agregat dari data yang terlewat.

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

// Slow downstream receives summed batches

expand untuk Memenuhi Permintaan

expand adalah kebalikan dari conflate: saat downstream meminta data lebih cepat daripada upstream menghasilkannya, operator ini membuat elemen tambahan dari nilai terakhir yang terlihat.

Hal ini berguna untuk terus menghasilkan pembacaan terbaru dengan laju yang stabil.

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

// Downstream always gets the latest sensor value

Batas Asinkron

Secara bawaan, tahap yang menyatu berjalan pada satu aktor tanpa buffering di antaranya. Menyisipkan async menempatkan sebuah tahap pada aktornya sendiri, menambahkan buffer dan memungkinkan paralelisme berbasis pipeline.

Batas asinkron adalah tempat buffer backpressure sebenarnya berada.

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

throttle sebagai Pengendalian Laju Eksplisit

throttle menetapkan laju maksimum secara sengaja dan menghasilkan backpressure ke upstream untuk mematuhinya. Hal ini melindungi layanan eksternal yang memiliki batas laju, bahkan ketika konsumen sebenarnya dapat berjalan lebih cepat.

Parameter burst memungkinkan lonjakan singkat di atas laju stabil.

import scala.concurrent.duration._

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

Mengamati Backpressure

Anda dapat mendeteksi backpressure dengan mengamati perlambatan upstream atau mengukur keterisian buffer. Operator log dan atribut stream Akka membantu melacak lokasi pipeline yang mengalami kemacetan.

Buffer yang terus-menerus penuh menunjukkan tahap paling lambat yang membatasi throughput.

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

Pemeriksaan Singkat

Pikirkan cara Akka Streams mencegah produsen cepat membanjiri konsumen lambat.

Ringkasan

Backpressure adalah tulang punggung Akka Streams yang berbasis permintaan: konsumen memberi sinyal permintaan ke upstream agar produsen tidak membebaninya, sehingga penggunaan memori tetap terbatas.

Anda telah mempelajari buffer internal, operator buffer eksplisit dengan strategi overflow, pembuatan ringkasan menggunakan conflate, pemenuhan permintaan dengan expand, batas asinkron, dan pengendalian laju yang disengaja melalui throttle. Selanjutnya, Anda akan menjalankan pipeline lengkap.

Gratis untuk memulai

Belajar Scala dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
39
Pelajaran
143

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Tekanan Balik” gratis?

Ya — teks lengkap “Tekanan Balik” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Scala for Backend Engineering & Functional Programming, upgrade ke CoddyKit PRO. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Tekanan Balik”?

Tangani produsen cepat dengan aman. Kamu berlatih Scala for Backend Engineering & Functional Programming dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Scala for Backend Engineering & Functional Programming?

Tidak diperlukan pengalaman sebelumnya. Scala for Backend Engineering & Functional Programming di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Tekanan Balik” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Scala for Backend Engineering & Functional Programming ini?

Ya. Setiap pelajaran Scala for Backend Engineering & Functional Programming menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Source, Flow, dan Sink
  2. Mengubah Aliran
  3. Tekanan Balik
  4. Menjalankan Pipeline
← Kembali ke Scala for Backend Engineering & Functional Programming