Queue di antara producer dan consumer yang lebih lambat dapat menyerap perbedaan laju untuk sementara. Queue tidak dapat menghapus perbedaan tersebut. Jika arrival terus lebih cepat daripada completion, setiap item yang diterima menambah pekerjaan yang belum selesai. Unbounded queue membiarkan state itu menumpuk sampai resource lain menjadi batas efektif, sering kali memory atau timeout eksternal.
Bounded queue memindahkan batas tersebut ke interface. Setelah capacity habis, admission harus menghasilkan sesuatu yang dapat diamati: menunggu ruang tersedia, menolak pekerjaan baru, membuang pekerjaan tertentu, atau mengalihkannya ke tempat lain. Karena itu, capacity queue dan perilaku saat penuh menjadi bagian dari kontrak overload sistem.
Capacity mengubah tekanan tersembunyi menjadi state
Pertimbangkan worker pool dengan N worker dan queue yang menampung paling banyak Q job tertunda. Pada suatu saat, pekerjaan yang telah diterima dibatasi oleh job yang sedang berjalan ditambah job yang menunggu, dengan detail yang bergantung pada eksekusi konkuren antara worker dan producer.
Properti utamanya bukan hitungan persis tersebut. Backlog tertunda memiliki batas yang dinyatakan secara eksplisit. Producer tidak dapat terus mengubah input menjadi objek dalam queue setelah batas tercapai tanpa berhadapan dengan kebijakan admission.
Pada unbounded queue, producer yang sama dapat terus memperoleh hasil enqueue sukses ketika service capacity sudah tidak memadai. Queue depth kemudian merekam utang yang terus membesar. Setiap item dalam queue dapat mempertahankan payload, reference, tracing state, callback, atau objek lain. Biaya memory bergantung pada workload, tetapi arahnya langsung: lebih banyak job yang ditahan berarti lebih banyak state yang tetap hidup.
Queue berukuran hingga membuat saturasi terlihat pada batas enqueue, bukan menundanya sampai resource habis.
Blocking meneruskan tekanan ke producer
Salah satu kebijakan saat queue penuh adalah memblokir producer sampai capacity tersedia. Mekanisme ini menjadi backpressure hanya jika producer memang boleh menunggu dan penantian tersebut mencapai komponen yang mampu menurunkan laju produksi.
Pada pipeline dalam satu process, blocking send dapat secara alami memperlambat stage sebelumnya. Pada request handler, blocking justru dapat menahan thread, goroutine, task slot, connection, atau request budget. Queue tetap memiliki batas, tetapi tekanan dapat berpindah ke resource hingga lainnya.
Perbedaan ini penting. Blocking tidak identik dengan overload control. Blocking adalah perilaku sinkronisasi yang dapat menjadi bagian dari overload control jika model resource di sekitarnya mendukungnya.
Blocking enqueue juga memerlukan cancellation atau deadline ketika caller memiliki masa guna terbatas. Jika caller meninggalkan operasi sementara producer tetap terblokir tanpa batas, sistem dapat menghabiskan capacity untuk menerima pekerjaan yang hasilnya tidak lagi memiliki consumer.
Rejection menjaga batas admission tetap non-blocking
Non-blocking enqueue dapat melaporkan bahwa queue sudah penuh. Caller kemudian menentukan arti kegagalan pada batas tersebut. HTTP service dapat mengembalikan respons overload, scheduler internal dapat menunda item, sedangkan jalur telemetry best-effort dapat membuangnya.
Properti yang berguna adalah kejelasan. Producer menerima hasil tepat di titik saat sistem tidak lagi dapat menerima item berdasarkan kontrak queue yang berlaku.
Rejection juga membatasi jumlah pekerjaan tunggu yang telah diterima tanpa mengikat umur producer pada kemajuan consumer. Overload tidak hilang. Bentuknya berubah dari akumulasi backlog menjadi kegagalan admission yang terlihat dan harus ditangani kode upstream.
Perilaku retry memerlukan kontrol terpisah. Retry langsung ke queue yang sama dan masih jenuh dapat membentuk kembali tekanan di luar queue serta menaikkan arrival rate. Backoff, retry budget, deadline, atau batas admission di upstream mungkin diperlukan, bergantung pada protocol dan workload.
Kebijakan shedding menentukan pekerjaan yang boleh hilang
Sebagian queue membuang pekerjaan alih-alih menolak item terbaru. Kebijakan dapat menghapus item tertua, mengganti item dengan key yang sama, hanya mempertahankan state terbaru, atau menerapkan priority class.
Pilihan tersebut valid hanya jika semantik workload mengizinkannya. Queue yang membawa snapshot state sering dapat mengganti snapshot lama dengan snapshot baru karena state antara keduanya tidak memiliki kewajiban independen. Queue yang membawa mutasi finansial tidak dapat memakai asumsi yang sama. Menghapus satu mutasi dapat mengubah durable state.
Kebijakan queue karena itu terikat pada semantik pesan. Istilah seperti drop-oldest menjelaskan mekanisme, bukan correctness. Correctness bergantung pada apakah unit yang dibuang memiliki kewajiban delivery atau processing tersendiri.
Queue capacity bukan pengaturan throughput
Menaikkan Q tidak meningkatkan service rate consumer. Perubahan itu hanya menambah jumlah pekerjaan yang dapat menunggu sebelum kebijakan admission aktif.
Queue yang lebih besar dapat menyerap burst lebih lama jika consumer kemudian mengejar backlog. Pada tekanan berkelanjutan, queue yang lebih besar juga dapat menambah waktu tunggu pekerjaan yang sudah diterima. Jika job memiliki deadline, sebagian dapat kedaluwarsa sebelum eksekusi dimulai. Jika nilai job menurun seiring waktu, capacity tambahan dapat mempertahankan pekerjaan yang sudah tidak bernilai saat worker akhirnya menerimanya.
Queue yang lebih kecil menampilkan saturasi lebih awal dan membatasi pekerjaan tunggu lebih ketat, tetapi dapat menolak burst singkat yang sebenarnya dapat ditampung buffer lebih besar. Pemilihan capacity bergantung pada toleransi burst, umur job, memory footprint, concurrency, dan perilaku admission. Tidak ada nilai capacity universal yang terpisah dari batasan tersebut.
Beberapa queue dapat menyembunyikan backlog sebenarnya
Bounded application queue tidak berarti total pekerjaan dalam antrean dibatasi pada angka yang sama. Buffer tambahan dapat berada di client library, executor, protocol stack, broker, kernel socket buffer, proxy, atau service upstream.
Jika producer mengirim ke bounded local queue hanya setelah menumpuk pekerjaan di struktur unbounded lain, batas lokal melindungi satu komponen tetapi tidak membatasi backlog end-to-end. Masalah serupa muncul ketika request yang ditolak dimasukkan ke retry list tanpa batas.
Secara operasional, queue depth paling berguna jika dilihat bersama hasil admission dan aktivitas service. Queue yang hampir selalu kosong dapat menandakan spare capacity yang sehat, tetapi juga dapat berarti pekerjaan ditolak sebelum mencapainya. Queue penuh dapat menandakan overload berkelanjutan atau consumer yang berhenti membuat progres. State tersebut memerlukan konteks dari enqueue failure, worker aktif, completion rate, cancellation, dan umur job.
Batas tersebut adalah keputusan desain yang bertahan
Bounded queue menetapkan batas ownership yang hingga untuk pekerjaan tertunda. Komponen menyatakan bahwa ia menerima paling banyak sejumlah state tunggu yang telah ditentukan dan membutuhkan tindakan eksplisit setelah titik tersebut.
Tindakan itu merupakan bagian desain yang paling berdampak. Blocking meneruskan tekanan melalui sinkronisasi. Rejection mengembalikan tekanan sebagai hasil. Shedding mengorbankan pekerjaan tertentu sesuai semantik workload. Tidak satu pun meningkatkan capacity consumer, dan masing-masing mengubah perilaku overload yang dapat diamati.
Memperlakukan batas dan kebijakan saat queue penuh sebagai satu kontrak membuat failure mode tetap lokal dan dapat diperiksa. Sistem tetap memerlukan service capacity yang memadai untuk load yang dituju, tetapi excess demand tidak lagi dapat berubah menjadi backlog tersembunyi yang tumbuh tanpa batas pada boundary tersebut.