Corak reka bentuk dan amalan terbaik untuk baris gilir mesej PHP
Pengenalan:
Dengan populariti Internet dan perkembangan teknologi, baris gilir mesej secara beransur-ansur menjadi komponen penting dalam aplikasi moden. Baris gilir mesej boleh digunakan untuk memproses tugas secara tidak segerak, menyahgandingkan pelbagai modul aplikasi dan meningkatkan kebolehskalaan dan kebolehpercayaan sistem. Dalam artikel ini, kami akan memperkenalkan corak reka bentuk dan amalan terbaik baris gilir mesej dalam PHP dan menyediakan contoh kod untuk membantu pembaca memahami dan menerapkannya dengan lebih baik.
1. Konsep asas baris gilir mesej ialah sejenis perisian tengah yang digunakan untuk menghantar mesej antara aplikasi Ia membolehkan pemprosesan tugasan tidak segerak, menghantar mesej ke baris gilir, dan kemudian pengguna dari baris gilir. Sistem baris gilir mesej biasa termasuk RabbitMQ, Kafka, ActiveMQ, dll.
1. Corak Terbit-Langganan
Pola Terbit-Langgan ialah corak reka bentuk baris gilir mesej yang menggabungkan pengirim mesej (penerbit) dan Penerima mesej (pelanggan) dipisahkan mesej dalam baris gilir mesej, pelanggan boleh memilih untuk melanggan mesej yang diminati mengikut keperluan mereka sendiri. Berikut ialah contoh kod yang menggunakan RabbitMQ untuk melaksanakan corak publish-subscribe:
<?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();
<?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();
Point-to-Point ialah biasa Corak reka bentuk baris gilir mesej memisahkan penghantar mesej (pengeluar) dan penerima mesej (pengguna) dengan menghantar mesej ke baris gilir, dan kemudian dibawa keluar dari baris gilir dan diproses oleh pengguna tertentu. Berikut ialah kod contoh yang menggunakan RabbitMQ untuk melaksanakan mod titik ke titik:
<?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();
<?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();
1. Pastikan kebolehpercayaan mesej
Dalam penerbit Apabila menerbitkan mesej, sifat kegigihan mesej harus ditetapkan untuk memastikan mesej itu tidak akan hilang walaupun sekiranya berlaku pengecualian baris gilir. Apabila pengguna memproses mesej, ia harus mengesahkan secara jelas sama ada mesej telah digunakan untuk mengelakkan penggunaan berulang mesej.
Apabila pengguna memproses mesej, pelbagai kegagalan mungkin berlaku, menyebabkan mesej gagal diproses secara normal. Untuk memastikan kebolehpercayaan mesej, anda boleh menggunakan mekanisme cuba semula, iaitu, menghantar semula mesej apabila pemprosesan mesej gagal, dan menetapkan bilangan percubaan semula maksimum Selepas bilangan percubaan semula melebihi, mesej boleh dihantar ke barisan surat mati.
Dalam senario konkurensi yang tinggi, untuk meningkatkan daya pengeluaran pengguna, ini boleh dicapai dengan menambah bilangan pengguna. Pada masa yang sama, mekanisme prefetch (Prefetch) mesej boleh digunakan, iaitu, berbilang mesej dikeluarkan dari baris gilir pada satu masa di sebelah pengguna untuk mengelakkan komunikasi rangkaian setiap kali.
Artikel ini memperkenalkan corak reka bentuk dan amalan terbaik baris gilir mesej dalam PHP, dan menyediakan kod contoh untuk melaksanakan mod penerbitan-langganan dan mod titik-ke-titik menggunakan RabbitMQ. Dengan mereka bentuk dan menggunakan baris gilir mesej dengan betul, anda boleh meningkatkan kebolehpercayaan sistem, kebolehskalaan dan prestasi serta menyelesaikan masalah pemprosesan tak segerak dalam aplikasi. Saya harap artikel ini memberikan sedikit rujukan dan bantuan untuk pembaca menggunakan baris gilir mesej dalam projek sebenar.
Atas ialah kandungan terperinci Reka bentuk corak dan amalan terbaik untuk baris gilir mesej PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!