74、有界通道(bounded channels)

有界通道和无界通道

到目前为止,我们一直在使用无界通道。我们想发送多少消息就发送多少消息,通道也会相应增长以容纳这些消息。
在多生产者,单消费者的情况下这可能会产生问题:如果生产者以比消费者处理信息更快的速度发出信息,通道就会不断增长,可能会消耗掉所有可用内存。
建议是,生产系统中绝不要使用无界通道。我们应该始终对使用有界通道可以排队的消息数量设定上限。

有界通道

有界通道可以有一个固定的容量。可以通过sync_channel创建一个容量大于0的有界通道:

use std::sync::mpsc::sync_channel;

let (sender, receiver) = sync_channel(10);

receiver的类型与之前的相同,都是Receiver<T>senderSyncSender<T>的实例。

消息发送ing

通过使用SyncSender我们有两个方法可以发送消息:

  • send:如果通道内有剩余的空间,它将会将消息列队,然后返回OK(())。如果通道已经满了,它将阻塞,并等待空闲的空间。
  • try_send:如果通道内有剩余的空间,它将会将消息列队,然后返回OK(())。如果通道已经满了,它将返回Err(TrySendError::Full(value)),其中value是无法发送的消息。
    根据需要,我们可能需要一种,或是另外一种。

Backpressure(背压)

使用有界通道的主要优点是他们提供了一种背压。
如果消费者跟不上,他会强制发送者放慢速度。这种背压可以在系统中传播,并且可能潜在地影响整个架构,防止终端用户的请求压垮系统。

 

阅读剩余
THE END