消费者的竞争模式 Competing Consumers Pattern

未匹配的标注

描述#

    多个并发用户处理同一个通讯通道的信息。这种模式使系统能够同时处理多条数据,以优化吞吐量,提高可扩展性和可用性,以及平衡工作负载。

背景和问题#

    在高峰时间的系统可能需要处理许多每秒数百个请求,而在其他时间的数量可能是非常小的,处理这些请求可能是高度可变的。为了处理这种波动的负载,该系统可以运行多个消费者服务实例。而这些消费者之间是存在资源竞争的。

解决方案#

    使用消息队列来实现应用和消费者服务实例之间的通信信道,简单说,就是把数据存到消息队列中,然后多个消费者同时消费消息队列。

liaoliaophp 消费者的竞争模式

注意事项#

  1. 增强系统的负载。可以承受请求量很大的变化。
  2. 提高可靠性。信息存在队列中,可以监控队列的数据。
  3. 不需要协调消费者的竞争。
  4. 可扩展性高。能够动态地增加或减少消费者服务的实例。

何时使用#

  1. 工作量为一个应用程序被分成可异步运行任务。
  2. 任务是独立的,可以并行地运行。
  3. 工作容积变化很大,需要一个可扩展的解决方案。
  4. 该解决方案必须提供高可用性,并且如果处理一个任务失败必须是有弹性的。

结构中包含的角色#

  1. MessageQueue 抽象队列
  2. ConcreteMessageQueue 具体队列
  3. Producer 生产者
  4. Consumer 消费者

最小可表达代码#

abstract class MessageQueue
{
    protected $messages = [];

    public function pop()
    {
        return array_shift($this->messages);
    }

    public function push($message)
    {
        $this->messages[] = $message;
    }
}

class ConcreteMessageQueue extends MessageQueue {}

class Producer
{
    protected $number;
    protected $messageQueue;

    public function __construct(MessageQueue $messageQueue, int $number)
    {
        $this->messageQueue = $messageQueue;
        $this->number = $number;
    }

    public function handle()
    {
        $message = microtime();

        var_dump("Producer {$this->number} : $message");

        $this->messageQueue->push($message);
    }
}

class Consumer
{
    protected $number;
    protected $messageQueue;

    public function __construct(MessageQueue $messageQueue, int $number)
    {
        $this->messageQueue = $messageQueue;
        $this->number = $number;
    }

    public function handle()
    {
        $message = $this->messageQueue->pop();

        var_dump("Consumer {$this->number} : $message");
    }
}

// 线程安全
$queue = new ConcreteMessageQueue();
$product1 = new Producer($queue, 1);
$product1->handle();
$product2 = new Producer($queue, 2);
$product2->handle();

$consumer1 = new Consumer($queue, 1);
$consumer1->handle();
$consumer2 = new Consumer($queue, 2);
$consumer2->handle();

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

上一篇 下一篇
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~