ホームページ  >  記事  >  バックエンド開発  >  PHP メッセージ キューの設計パターンとベスト プラクティス

PHP メッセージ キューの設計パターンとベスト プラクティス

PHPz
PHPzオリジナル
2023-07-08 17:54:07864ブラウズ

PHP メッセージ キューの設計パターンとベスト プラクティス

はじめに:
インターネットの普及とテクノロジーの発展に伴い、メッセージ キューは現代のアプリケーションにおいて徐々に重要なコンポーネントになってきました。メッセージ キューを使用すると、タスクを非同期に処理し、さまざまなアプリケーション モジュールを分離し、システムのスケーラビリティと信頼性を向上させることができます。この記事では、PHP のメッセージ キューの設計パターンとベスト プラクティスを紹介し、読者がそれらをよりよく理解して適用できるようにコード例を示します。

1. メッセージ キューの基本概念
メッセージ キューは、アプリケーション間でメッセージを転送するために使用されるミドルウェアの一種で、タスクの非同期処理、メッセージのキューへの送信、およびキューからの削除を可能にします。そして消費者によって処理されます。一般的なメッセージ キュー システムには、RabbitMQ、Kafka、ActiveMQ などが含まれます。

2. PHP のメッセージ キュー設計パターン
1. パブリッシュ/サブスクライブ パターン
パブリッシュ/サブスクライブ パターンは、メッセージの送信者 (パブリッシャー) とメッセージを組み合わせる、一般的に使用されるメッセージ キューの設計パターンです。メッセージ キューにメッセージをパブリッシュすることで、サブスクライバーは自分のニーズに応じて関心のあるメッセージをサブスクライブすることを選択できます。以下は、RabbitMQ を使用してパブリッシュ/サブスクライブ モードを実装するサンプル コードです:

Publisher.php:

<?php

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

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

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

$channel->exchange_declare('logs', 'fanout', false, false, false);

$message = new AMQPMessage('Hello, subscribers!');
$channel->basic_publish($message, 'logs');

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

Subscriber.php:

<?php

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

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

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

$channel->exchange_declare('logs', 'fanout', false, false, false);

list($queue_name,,) = $channel->queue_declare('', false, false, true, false);

$channel->queue_bind($queue_name, 'logs');

$channel->basic_consume($queue_name, '', false, true, false, false, function ($msg) {
    echo 'Received: ' . $msg->body . PHP_EOL;
});

while (count($channel->callbacks)) {
    $channel->wait();
}

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

2。 -ポイント モード (ポイントツーポイント パターン)
ポイントツーポイント パターンは、一般的なメッセージ キューの設計パターンであり、メッセージをキューから特定のコンシューマが取得され、処理されます。以下は、RabbitMQ を使用してポイントツーポイント モードを実装するサンプル コードです。

Producer.php:

<?php

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

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

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

$channel->queue_declare('task_queue', false, true, false, false);

$message = new AMQPMessage('Hello, consumer!', ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($message, '', 'task_queue');

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

Consumer.php:

<?php

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

use PhpAmqpLibConnectionAMQPStreamConnection;

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

$channel->queue_declare('task_queue', false, true, false, false);

$channel->basic_qos(null, 1, null);
$channel->basic_consume('task_queue', '', false, false, false, false, function ($msg) {
    echo 'Received: ' . $msg->body . PHP_EOL;
    sleep(1);
    $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
});

while (count($channel->callbacks)) {
    $channel->wait();
}

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

3. ベスト プラクティスPHP のメッセージ キューの場合
1. メッセージの信頼性を確保する
プロデューサがメッセージをパブリッシュするときは、キューのイベントでもメッセージが失われないように、メッセージの永続属性を設定する必要があります。例外。コンシューマがメッセージを処理するときは、メッセージが繰り返し消費されるのを防ぐために、メッセージが消費されたかどうかを明示的に確認する必要があります。

2. 障害処理と再試行メカニズム
コンシューマーがメッセージを処理するときに、さまざまな障害が発生し、メッセージを正常に処理できなくなる可能性があります。メッセージの信頼性を確保するために、再試行メカニズム (メッセージ処理が失敗した場合にメッセージを再配信する) を使用し、最大再試行回数を設定できます。再試行回数を超えると、メッセージはデッドレターキューに送られます。

3. コンシューマの同時実行パフォーマンスの最適化
同時実行性が高いシナリオでは、コンシューマのスループットを向上させるために、コンシューマの数を増やすことで実現できます。同時に、メッセージ プリフェッチ (Prefetch) メカニズムを使用することもできます。つまり、コンシューマ側で複数のメッセージがキューから一度に取り出され、毎回のネットワーク通信が回避されます。

結論:
この記事では、PHP のメッセージ キューの設計パターンとベスト プラクティスを紹介し、RabbitMQ を使用してパブリッシュ/サブスクライブ モードとポイントツーポイント モードを実装するためのサンプル コードを提供します。メッセージ キューを適切に設計して適用することで、システムの信頼性、拡張性、パフォーマンスを向上させ、アプリケーションの非同期処理の問題を解決できます。この記事が、読者が実際のプロジェクトでメッセージ キューを使用する際の参考と支援になれば幸いです。

以上がPHP メッセージ キューの設計パターンとベスト プラクティスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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