Pengenalan kepada pengesahan mesej dan mekanisme cuba semula dalam baris gilir mesej PHP

PHPz
Lepaskan: 2023-07-09 20:58:01
asal
1771 orang telah melayarinya

Pengenalan kepada mekanisme pengesahan mesej dan cuba semula dalam baris gilir mesej PHP

Dengan pembangunan aplikasi Internet, dalam menghadapi keselarasan tinggi dan senario trafik yang besar, kaedah permintaan langsung tradisional tidak lagi dapat memenuhi keperluan. Sebagai penyelesaian teknikal penyahgandingan dan pemprosesan tak segerak, baris gilir mesej digunakan secara meluas dalam banyak aplikasi peringkat perusahaan. Dalam baris gilir mesej PHP, pengesahan mesej dan mekanisme cuba semula adalah dua konsep yang sangat penting Artikel ini akan memperkenalkannya secara terperinci dan memberikan contoh kod yang sepadan.

  1. Mekanisme pengesahan mesej

Dalam baris gilir mesej, mekanisme pengesahan mesej bermakna selepas pengguna menerima mesej, ia menghantar mesej pengesahan kepada baris gilir mesej untuk memaklumkan baris gilir mesej bahawa mesej telah berjaya diproses. Jika pengecualian berlaku atau pemprosesan gagal apabila pengguna memproses mesej, baris gilir mesej tidak akan menerima maklumat pengesahan dan akan menganggap bahawa pemprosesan mesej gagal dan akan mengedarkan semula mesej kepada pengguna lain atau mencuba semula proses tersebut.

Pelaksanaan mekanisme pengesahan mesej perlu mengambil kira dua aspek berikut:
(1) Bagaimana pengguna mesej menghantar maklumat pengesahan ke baris gilir mesej
(2) Bagaimana baris gilir mesej mengendalikan mesej yang belum menerima maklumat pengesahan

Dalam baris gilir mesej PHP , protokol AMQP (Advanced Message Qeuing Protocol) biasanya digunakan untuk melaksanakan mekanisme pengesahan mesej. Berikut ialah contoh penggunaan rabbitmq:

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

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

echo " [*] Waiting for messages. To exit press CTRL+C
";

$callback = function ($msg) {
    echo ' [x] Received ', $msg->body, "
";
    // 处理消息的业务逻辑

    // 发送确认信息给消息队列
    $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
};

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

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

$channel->close();
$connection->close();
Salin selepas log masuk

Dalam kod di atas, sambungan baris gilir mesej dan saluran dibuat, dan baris gilir bernama "hello" diisytiharkan. Dalam fungsi panggil balik, selepas melakukan pemprosesan perniagaan pada mesej yang diterima, hubungi $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag'])</code > untuk menghantar maklumat pengesahan ke baris gilir mesej. <code>$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag'])来发送确认信息给消息队列。

对于没有收到确认信息的消息,消息队列根据具体的策略来处理。一种常见的处理方式是设置消息的过期时间,如果消息在一定时间内没有收到确认信息,则认为该消息处理失败,消息队列将重新分发该消息给其他消费者。

  1. 消息重试机制

消息重试机制是指在消息处理失败后,对该消息进行重试处理的机制。在消息队列中,消息的重试可以基于以下两种方式:
(1) 固定的重试次数:对于处理失败的消息,消息队列会将该消息重新分发给消费者,并在每次重试时增加计数器,当计数器达到固定的重试次数后,消息队列将不再进行重试,而是将该消息发送到一个特定的失败队列中,等待人工干预。
(2) 基于指数的重试时间:对于处理失败的消息,消息队列会将该消息重新分发给消费者,并根据指数的方式来确定每次重试的时间间隔。通常,每次重试的时间间隔会按照指数倍数递增,以避免出现短时间内的大量重试,降低系统负载。

以下是一个使用rabbitmq的消息重试机制的示例:

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

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

echo " [*] Waiting for messages. To exit press CTRL+C
";

$callback = function ($msg) {
    echo ' [x] Received ', $msg->body, "
";
    // 模拟消息处理失败的情况
    if (rand(0, 10) < 3) {
        // 发送重试信息给消息队列
        $msg->delivery_info['channel']->basic_reject($msg->delivery_info['delivery_tag'], true);
    } else {
        // 处理消息的业务逻辑

        // 发送确认信息给消息队列
        $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
    }
};

$channel->basic_qos(null, 1, null);
$channel->basic_consume('task_queue', '', false, false, false, false, $callback);

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

$channel->close();
$connection->close();
Salin selepas log masuk

在上面的代码中,声明了一个名称为"task_queue"的队列,使用$channel->basic_qos(null, 1, null);设置每次只分发一条消息,并在回调函数内模拟了消息处理失败的情况。当处理失败时,调用示例代码中的$msg->delivery_info['channel']->basic_reject($msg->delivery_info['delivery_tag'], true);

Untuk mesej yang belum menerima maklumat pengesahan, baris gilir mesej akan memprosesnya mengikut strategi tertentu. Kaedah pemprosesan biasa adalah untuk menetapkan masa tamat tempoh mesej Jika mesej tidak menerima maklumat pengesahan dalam tempoh masa tertentu, pemprosesan mesej dianggap telah gagal, dan baris gilir mesej akan mengedarkan semula mesej kepada pengguna lain.

    Mekanisme cuba semula mesej🎜🎜🎜Mekanisme cuba semula mesej merujuk kepada mekanisme untuk mencuba semula mesej selepas pemprosesan mesej gagal. Dalam baris gilir mesej, cuba semula mesej boleh berdasarkan dua kaedah berikut: 🎜(1) Bilangan percubaan semula tetap: Untuk mesej yang gagal diproses, baris gilir mesej akan mengedarkan semula mesej kepada pengguna dan cuba semula setiap kali Apabila kaunter mencapai bilangan percubaan semula yang tetap, baris gilir mesej tidak lagi akan mencuba semula, tetapi akan menghantar mesej ke baris gilir kegagalan tertentu untuk menunggu campur tangan manual. 🎜(2) Masa percubaan semula berasaskan eksponen: Untuk mesej yang gagal diproses, baris gilir mesej akan mengedarkan semula mesej kepada pengguna dan menentukan selang masa untuk setiap percubaan semula berdasarkan kaedah eksponen. Biasanya, selang masa antara setiap percubaan semula ditingkatkan secara eksponen untuk mengelakkan bilangan percubaan semula yang besar dalam tempoh masa yang singkat dan mengurangkan beban sistem. 🎜🎜Berikut ialah contoh menggunakan mekanisme cuba semula mesej rabbitmq: 🎜rrreee🎜Dalam kod di atas, baris gilir bernama "task_queue" diisytiharkan, menggunakan $channel->basic_qos(null, 1, null);Sediakan untuk mengedarkan hanya satu mesej pada satu masa, dan mensimulasikan kegagalan pemprosesan mesej dalam fungsi panggil balik. Apabila pemprosesan gagal, panggil $msg->delivery_info['channel']->basic_reject($msg->delivery_info['delivery_tag'], true); dalam kod sampel untuk menghantar Cuba Semula mesej kepada baris gilir mesej. 🎜🎜Melalui mekanisme pengesahan mesej dan mekanisme cuba semula, baris gilir mesej PHP dapat memastikan kebolehpercayaan mesej dan kecekapan pemprosesan. Pembangun boleh memilih pengesahan mesej yang sesuai dan mencuba semula strategi berdasarkan keperluan sebenar untuk memberikan pengalaman pengguna dan prestasi sistem yang lebih baik. 🎜

Atas ialah kandungan terperinci Pengenalan kepada pengesahan mesej dan mekanisme cuba semula dalam baris gilir mesej PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan