基于队列的负载均衡模式 Queue Based Load Leveling Pattern

未匹配的标注

描述

使用队列作为请求的缓冲区。这个模式可以实现流量的削峰填谷。

背景和问题

一个服务可能会遇到需求高峰,导致它变得过载和不能及时响应请求。

解决方案

使用队列作为缓冲,存储消息,然后服务从队列中检索消息并进行处理。

注意事项

  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();

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~