A small queue can apply backpressure by accepting work only while capacity remains.

Program

Play the program to choose capacity and see how many jobs stay queued.

queue_capacity_guard.rs
use std::collections::VecDeque;

fn main() {
    let capacity = ;
    let mut queue = VecDeque::new();
    let accepted = push_jobs(&mut queue, capacity);
    println!("accepted={accepted} queued={}", queue.len());
}

fn push_jobs(queue: &mut VecDeque<&'static str>, capacity: usize) -> usize {
    let jobs = ["parse", "build", "publish"];
    let mut accepted = 0;
    for job in jobs {
        if queue.len() < capacity {
            queue.push_back(job);
            accepted += 1;
        }
    }
    accepted
}
use std::collections::VecDeque;

fn main() {
    let capacity = ;
    let mut queue = VecDeque::new();
    let accepted = push_jobs(&mut queue, capacity);
    println!("accepted={accepted} queued={}", queue.len());
}

fn push_jobs(queue: &mut VecDeque<&'static str>, capacity: usize) -> usize {
    let jobs = ["parse", "build", "publish"];
    let mut accepted = 0;
    for job in jobs {
        if queue.len() < capacity {
            queue.push_back(job);
            accepted += 1;
        }
    }
    accepted
}
use std::collections::VecDeque;

fn main() {
    let capacity = ;
    let mut queue = VecDeque::new();
    let accepted = push_jobs(&mut queue, capacity);
    println!("accepted={accepted} queued={}", queue.len());
}

fn push_jobs(queue: &mut VecDeque<&'static str>, capacity: usize) -> usize {
    let jobs = ["parse", "build", "publish"];
    let mut accepted = 0;
    for job in jobs {
        if queue.len() < capacity {
            queue.push_back(job);
            accepted += 1;
        }
    }
    accepted
}
capacity The capacity value is a simple bound on queued work.
backpressure The third job is skipped when the queue is already full.
summary The final print reports both accepted work and current queue length.