ホームページ  >  記事  >  バックエンド開発  >  PHP メッセージ キューとマイクロサービス アーキテクチャを組み合わせた実践

PHP メッセージ キューとマイクロサービス アーキテクチャを組み合わせた実践

WBOY
WBOYオリジナル
2023-07-08 11:10:46983ブラウズ

PHP メッセージ キューとマイクロサービス アーキテクチャを組み合わせる実践

はじめに:
最新のアプリケーションが複雑になるにつれて、スケーラビリティと柔軟性の手段を構築するためにマイクロサービス アーキテクチャの採用が必要になりました。非同期通信モードとして、メッセージ キューはアプリケーションのさまざまなモジュールを分離し、システムの信頼性とパフォーマンスを向上させるのに役立ちます。この記事では、PHP でメッセージ キューを使用してマイクロサービス アーキテクチャをサポートする方法を紹介し、コード例を示します。

1. メッセージ キューとは何ですか?
メッセージ キューは、異なるアプリケーション コンポーネントまたはサービス間の通信を分離するために使用される非同期通信パターンです。メッセージの送信者はメッセージをキューに送信し、受信者はキューからメッセージを取得して処理します。メッセージ キューは信頼性の高い通信メカニズムを提供しており、システム内のコンポーネントが使用できない場合でも、メッセージはキューに蓄積され、コンポーネントが復旧した後の処理を待つことができます。

2. マイクロサービス アーキテクチャにおけるメッセージ キュー アプリケーション シナリオ
マイクロサービス アーキテクチャでは、さまざまなサービス間の通信とコラボレーションが必要です。メッセージ キューは次のシナリオに適用できます。

  1. 非同期通信: リクエストをメッセージ キューに送信し、コンシューマによって非同期に処理します。
  2. システムの分離: 依存するサービス間の通信をメッセージ キューに変換することで、システムの信頼性とパフォーマンスを向上させます。
  3. タスクのスケジュール: 遅延またはスケジュールする必要があるタスクをメッセージ キューに入れ、優先順位とスケジュール ルールに従ってコンシューマーによって処理されます。

3. PHP メッセージ キュー拡張機能の概要
PHP には、RabbitMQ、ActiveMQ、Kafka など、選択できる成熟したメッセージ キュー拡張機能が多数あります。この記事では例として RabbitMQ を紹介します。

RabbitMQ は、AMQP (Advanced Message Queuing Protocol) プロトコルを実装した、高い信頼性と拡張性を備えたオープンソースのメッセージ キューイング システムです。以下は、RabbitMQ の PHP 拡張機能を使用してメッセージ キューを作成する方法を示す簡単な例です。

<?php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

// 连接RabbitMQ服务器
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

// 声明一个名为hello的队列
$channel->queue_declare('hello', false, false, false, false);

// 发送消息到队列
$message = new AMQPMessage('Hello RabbitMQ!');
$channel->basic_publish($message, '', 'hello');

echo " [x] Sent 'Hello RabbitMQ!'
";

// 关闭连接
$channel->close();
$connection->close();
?>

4. マイクロサービス アーキテクチャでのメッセージ キューの実践
以下では、単純な電子商取引システムを例として、メッセージ キューとマイクロサービス アーキテクチャを組み合わせる方法を紹介します。

シナリオ: ユーザーが注文した後、在庫の控除、ポイントの計算、注文ステータスの変更などの操作を実行する必要があります。

  1. 在庫サービス
    在庫サービスを作成し、注文成功イベントをリッスンし、在庫控除ロジックを処理します。
<?php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare('order_success_event', false, false, false, false);

$callback = function ($message) {
    echo " [x] Order success event received: " . $message->body . "
";
    
    // 处理库存扣减逻辑
    
    $message->delivery_info['channel']->basic_ack($message->delivery_info['delivery_tag']);
};

$channel->basic_consume('order_success_event', '', false, false, false, false, $callback);

while ($channel->is_consuming()) {
    $channel->wait();
}

$channel->close();
$connection->close();
?>
  1. ポイント サービス
    ポイント サービスを作成し、注文成功イベントをリッスンし、ポイント計算ロジックを処理します。
<?php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare('order_success_event', false, false, false, false);

$callback = function ($message) {
    echo " [x] Order success event received: " . $message->body . "
";
    
    // 处理积分计算逻辑
    
    $message->delivery_info['channel']->basic_ack($message->delivery_info['delivery_tag']);
};

$channel->basic_consume('order_success_event', '', false, false, false, false, $callback);

while ($channel->is_consuming()) {
    $channel->wait();
}

$channel->close();
$connection->close();
?>
  1. 注文サービス
    ユーザーの注文リクエストの受信や注文成功イベントの送信など、注文関連のビジネス ロジックを処理する注文サービスを作成します。
<?php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare('order_success_event', false, false, false, false);

// 接收用户下单请求
$request = $_POST; // 假设为用户的下单请求数据
$orderInfo = createOrder($request);

// 处理订单相关的业务逻辑

// 发送订单成功事件到消息队列
$message = new AMQPMessage(json_encode($orderInfo));
$channel->basic_publish($message, '', 'order_success_event');

echo "Order placed successfully!";

$channel->close();
$connection->close();

function createOrder($request) {
    // 创建订单的逻辑
    // ...
    
    return $orderInfo;
}
?>

5. 概要
この記事では、PHP でメッセージ キューを使用してマイクロサービス アーキテクチャをサポートする方法を紹介し、RabbitMQ コード例を示します。メッセージ キューを使用することで、マイクロサービス間の分離と非同期通信を実現し、システムの信頼性とパフォーマンスを向上させることができます。複雑なアプリケーションの場合、マイクロサービス アーキテクチャとメッセージ キューの採用は効果的なアーキテクチャ設計アプローチです。この記事が読者の実践に役立つことを願っています。

以上がPHP メッセージ キューとマイクロサービス アーキテクチャを組み合わせた実践の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。