1. 程式人生 > 實用技巧 >hyperf中使用訊息中介軟體rabbitmq

hyperf中使用訊息中介軟體rabbitmq

1.概述

訊息佇列已經逐漸成為企業IT系統內部通訊的核心手段。它具有低耦合、可靠投遞、廣播、流量控制、最終一致性等一系列功能,成為非同步RPC的主要手段之一。當今市面上有很多主流的訊息中介軟體,如老牌的ActiveMQ、RabbitMQ,炙手可熱的Kafka,阿里巴巴自主開發RocketMQ等。原理都類似,本文主要基於rabbitmq

2.建立生產者

php bin/hyperf.php gen:amqp-producer DemoProducer

在 DemoProducer 檔案中,我們可以修改@Producer註解對應的欄位來替換對應的exchangeroutingKey。 其中payload

就是最終投遞到訊息佇列中的資料,所以我們可以隨意改寫__construct方法,只要最後賦值payload即可。 示例如下。

<?php

declare(strict_types=1);

namespace App\Amqp\Producers;

use Hyperf\Amqp\Annotation\Producer;
use Hyperf\Amqp\Message\ProducerMessage;
use App\Models\User;

/**
 * DemoProducer
 * @Producer(exchange="hyperf", routingKey="hyperf")
 */
class DemoProducer extends ProducerMessage
{
    public function __construct($id)
    {
        // 設定不同 pool
        $this->poolName = 'pool2';

        $user = User::where('id', $id)->first();
        $this->payload = [
            'id' => $id,
            'data' => $user->toArray()
        ];
    }
}

  通過di容器建立例項投遞訊息

$message = new DemoProducer(1);
$producer = ApplicationContext::getContainer()->get(Producer::class);
$result = $producer->produce($message);

 3.建立消費者

php bin/hyperf.php gen:amqp-consumer DemoConsumer

  在 DemoConsumer 檔案中,我們可以修改@Consumer註解對應的欄位來替換對應的exchangeroutingKeyqueue

。 其中$data就是解析後的訊息資料。 示例如下

<?php

declare(strict_types=1);

namespace App\Amqp\Consumers;

use Hyperf\Amqp\Annotation\Consumer;
use Hyperf\Amqp\Message\ConsumerMessage;
use Hyperf\Amqp\Result;

/**
 * @Consumer(exchange="hyperf", routingKey="hyperf", queue="hyperf", nums=1)
 */
class DemoConsumer extends ConsumerMessage
{
    public function consume($data): string
    {
        print_r($data);
        return Result::ACK;
    }
}

  更多細節請查閱hyperf官方文件