基于队列的负载均衡模式 Queue Based Load Leveling Pattern
描述
使用队列作为请求的缓冲区。这个模式可以实现流量的削峰填谷。
背景和问题
一个服务可能会遇到需求高峰,导致它变得过载和不能及时响应请求。
解决方案
使用队列作为缓冲,存储消息,然后服务从队列中检索消息并进行处理。
注意事项
- 控制服务处理消息的速率,避免将尖峰需求到该系统的下一个阶段。
- 调试系统在负载下,需要调整队列的数目和服务实例的数量来控制吞吐量。
- 消息队列是一个单向的沟通机制。
- 要避免请求服务之间的资源争夺。
何时使用
可能会过载的服务。
结构中包含的角色
- Queue 队列
- Producter 生产者
- 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();
推荐文章: