基于队列的负载均衡模式 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 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 查看所有版本


暂无话题~