
## 描述
    使用队列作为请求的缓冲区。这个模式可以实现流量的削峰填谷。

## 背景和问题
    一个服务可能会遇到需求高峰，导致它变得过载和不能及时响应请求。

## 解决方案
    使用队列作为缓冲，存储消息，然后服务从队列中检索消息并进行处理。

## 注意事项
1. 控制服务处理消息的速率，避免将尖峰需求到该系统的下一个阶段。
2. 调试系统在负载下，需要调整队列的数目和服务实例的数量来控制吞吐量。
3. 消息队列是一个单向的沟通机制。
4. 要避免请求服务之间的资源争夺。

## 何时使用
    可能会过载的服务。


## 结构中包含的角色
1. Queue        队列
2. Producter    生产者
3. Consumer     消费者

## 最小可表达代码
    // 队列
    class Queue
    {
        protected $messages = [];

        // 消息入队列
        public function push(string $message)
        {
            $this->messages[] = $message;
        }

        // 消息出队列
        public function pop()
        {
            $message = array_shift($this->messages);

            return $message;  
        }
    }

    // 消费者
    class Consumer
    {
        protected $queue;

        public function __construct(Queue $queue)
        {
            $this->queue = $queue;
        }

        public function execute()
        {
            while($message = $this->queue->pop()) {
                var_dump($message);
            }
        }
    }

    // 生产者
    class Producter
    {
        protected $queue;

        public function __construct(Queue $queue)
        {
            $this->queue = $queue;
        }

        public function execute()
        {
            $this->queue->push(time());
        }
    }

    $queue = new Queue();

    // 生产者疯狂生产
    $producter1 = (new Producter($queue));
    $producter1->execute();
    $producter2 = (new Producter($queue));
    $producter2->execute();
    $producter3 = (new Producter($queue));
    $producter3->execute();
    
    // 消费者悠闲消费
    (new Consumer($queue))->execute();