基于队列的负载均衡模式 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 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
发起讨论 查看所有版本


暂无话题~