Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan baris gilir dan siaran mesej yang diedarkan dalam perkhidmatan mikro PHP

Bagaimana untuk melaksanakan baris gilir dan siaran mesej yang diedarkan dalam perkhidmatan mikro PHP

王林
王林asal
2023-09-25 18:05:021336semak imbas

Bagaimana untuk melaksanakan baris gilir dan siaran mesej yang diedarkan dalam perkhidmatan mikro PHP

Cara melaksanakan baris gilir dan siaran mesej yang diedarkan dalam perkhidmatan mikro PHP

Kata Pengantar:
Dalam pembangunan sistem teragih moden, baris gilir dan siaran mesej adalah komponen yang sangat biasa digunakan untuk melaksanakan komunikasi antara pelbagai sistem Penyahgandingan dan komunikasi. Dalam seni bina perkhidmatan mikro PHP, untuk melaksanakan pemprosesan mesej dan fungsi penyiaran yang diedarkan, kami boleh menggunakan beberapa alatan dan rangka kerja sumber terbuka yang matang untuk memudahkan pembangunan Artikel ini akan memperkenalkan cara menggunakan RabbitMQ dan Swoole untuk melaksanakan baris gilir dan siaran mesej.

1. Konsep asas dan penggunaan RabbitMQ
RabbitMQ ialah perisian tengah pemesejan merentas platform yang boleh dipercayai, sumber terbuka. Ia mengikut piawaian AMQP (Advanced Message Qeuing Protocol) dan menyediakan keupayaan pengeluaran dan penggunaan mesej yang lengkap. Berikut adalah beberapa konsep asas RabbitMQ:

  1. Pengeluar: program yang menghantar mesej.
  2. Barisan: Bekas yang menyimpan mesej.
  3. Pengguna: Program yang menerima dan memproses mesej.
  4. Penghargaan Pengguna: Selepas pengguna menerima mesej, ia menghantar mesej pengesahan kepada baris gilir untuk memaklumkan baris gilir bahawa mesej telah diproses.
  5. Pertukaran: Menerima mesej yang dihantar oleh pengeluar dan mengarahkan mesej ke baris gilir mengikut peraturan tertentu.
  6. Mengikat: Mengikat hubungan antara penukar dan baris gilir.

Berikut ialah contoh kod PHP yang menunjukkan cara menghantar dan menerima mesej dalam RabbitMQ:

// 创建连接
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// 创建通道
$channel = $connection->channel();

// 声明队列
$channel->queue_declare('hello', false, false, false, false);

// 发送消息
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'hello');

echo "Sent 'Hello World!'";

// 接收消息
$callback = function ($msg) {
  echo "Received: ", $msg->body, "
";
};

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

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

// 关闭通道和连接
$channel->close();
$connection->close();

2. Konsep asas dan penggunaan Swoole
Swoole ialah rangka kerja komunikasi rangkaian berprestasi tinggi berdasarkan PHP yang menyediakan Asynchronous yang berkuasa Keupayaan IO dan model pengaturcaraan dipacu peristiwa. Dalam seni bina perkhidmatan mikro PHP, kita boleh menggunakan Swoole untuk melaksanakan fungsi siaran mesej yang diedarkan.

Berikut ialah beberapa konsep asas Swoole:

  1. Pelayan: Program yang menerima dan memproses permintaan rangkaian.
  2. Pelanggan: Program yang menghantar permintaan rangkaian.
  3. Acara: Interaksi antara pelayan dan pelanggan.
  4. Asynchronous: Kaedah yang tidak menghalang pelaksanaan proses utama.
  5. Segerak: Kaedah menyekat pelaksanaan proses utama sehingga operasi selesai.

Berikut ialah contoh kod PHP yang menunjukkan cara mencipta pelayan TCP dan menyiarkan mesej dalam Swoole:

// 创建服务器
$server = new swoole_server("127.0.0.1", 9501);

// 注册事件回调函数
$server->on('connect', function ($server, $fd) {
  echo "Client {$fd}: connect.
";
});

$server->on('receive', function ($server, $fd, $from_id, $data) {
  echo "Received: $data 
";

  // 广播消息给所有客户端
  $server->sendtoAll($data);
});

$server->on('close', function ($server, $fd) {
  echo "Client {$fd}: close.
";
});

// 启动服务器
$server->start();

3. Melaksanakan baris gilir mesej teragih dalam perkhidmatan mikro PHP
Untuk melaksanakan mesej yang diedarkan dalam Queue PHP perkhidmatan mikro, kami boleh gunakan RabbitMQ dan Swoole bersama-sama. Pertama, kita perlu memulakan pengguna RabbitMQ dan pelayan TCP Swoole.

Contoh kod pengguna RabbitMQ:

// 创建连接
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// 创建通道
$channel = $connection->channel();

// 声明队列
$channel->queue_declare('task_queue', false, false, false, false);

// 设置每次只接收一条消息
$channel->basic_qos(null, 1, null);

// 定义消息处理的回调函数
$callback = function ($msg) {
  echo "Received: ", $msg->body, "
";
  // 模拟任务处理
  sleep(3);
  echo "Task finished.
";
  // 显示确认消息
  $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
};

// 监听队列,接收消息
$channel->basic_consume('task_queue', '', false, false, false, false, $callback);

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

// 关闭通道和连接
$channel->close();
$connection->close();

Contoh kod pelayan TCP Swoole:

// 创建服务器
$server = new swoole_server("127.0.0.1", 9501);

$server->set([
  'worker_num' => 4,         // 设置工作进程数
  'task_worker_num' => 4,    // 设置任务进程数
]);

// 注册事件回调函数
$server->on('connect', function ($server, $fd) {
  echo "Client {$fd}: connect.
";
});

$server->on('receive', function ($server, $fd, $from_id, $data) {
  echo "Received: $data 
";
  
  // 将接收到的消息发送给任务进程处理
  $server->task($data);
});

$server->on('task', function ($server, $task_id, $from_id, $data) {
  // 模拟任务处理
  sleep(3);
  
  // 处理结果发送给请求进程
  $server->finish($data);
});

$server->on('finish', function ($server, $task_id, $data) {
  // 将处理结果发送给客户端
  $server->send($data);
});

$server->on('close', function ($server, $fd) {
  echo "Client {$fd}: close.
";
});

// 启动服务器
$server->start();

Apabila pengguna RabbitMQ menerima mesej, ia bermakna tugas dibuat dan mula diproses. Kemudian, pelayan TCP Swoole menghantar mesej yang diterima ke proses tugasan untuk diproses dan menghantar hasil pemprosesan kepada klien melalui fungsi panggil balik.

4. Laksanakan siaran mesej teragih dalam perkhidmatan mikro PHP
Untuk melaksanakan siaran mesej teragih dalam perkhidmatan mikro PHP, kami boleh menggabungkan fungsi siaran Swoole dengan cache yang diedarkan (seperti Redis). Pertama, kita perlu mencipta pelayan TCP Swoole dan pelanggan Redis.

Contoh kod untuk pelayan TCP Swoole:

// 创建服务器
$server = new swoole_server("127.0.0.1", 9501);

// 注册事件回调函数
$server->on('connect', function ($server, $fd) {
  echo "Client {$fd}: connect.
";
});

$server->on('receive', function ($server, $fd, $from_id, $data) {
  echo "Received: $data 
";

  // 将接收到的消息广播给所有客户端
  $server->sendtoAll($data);
});

$server->on('close', function ($server, $fd) {
  echo "Client {$fd}: close.
";
});

// 启动服务器
$server->start();

Contoh kod untuk pelanggan Redis:

// 创建Redis连接
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 订阅消息
$redis->subscribe('channel', function ($redis, $channel, $message) {
  echo "Received from Redis: $message 
";
  
  // 发送消息给Swoole TCP服务器
  $client = new swoole_client(SWOOLE_SOCK_TCP);
  if (!$client->connect('127.0.0.1', 9501, -1)) {
    echo "Failed to connect to server.";
    exit;
  }
  $client->send($message);
  $client->close();
});

Apabila Redis menerima mesej, ia menghantarnya ke pelayan TCP Swoole melalui fungsi panggil balik, dan kemudian pelayan menyiarkan mesej yang diterima kepada semua pelanggan.

Ringkasan:
Melalui kod sampel di atas, kita boleh mempelajari cara menggunakan RabbitMQ dan Swoole untuk melaksanakan baris gilir mesej dan fungsi siaran yang diedarkan dalam perkhidmatan mikro PHP. Teknologi dan alatan ini boleh membantu kami membina sistem teragih berprestasi tinggi dan berskala serta meningkatkan penyahgandingan dan kebolehpercayaan sistem.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan baris gilir dan siaran mesej yang diedarkan dalam perkhidmatan mikro PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn