Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in den Nachrichtenbestätigungs- und Wiederholungsmechanismus in der PHP-Nachrichtenwarteschlange

Einführung in den Nachrichtenbestätigungs- und Wiederholungsmechanismus in der PHP-Nachrichtenwarteschlange

PHPz
PHPzOriginal
2023-07-09 20:55:371752Durchsuche

Einführung in den Nachrichtenbestätigungs- und Wiederholungsmechanismus in der PHP-Nachrichtenwarteschlange

Mit der Entwicklung von Internetanwendungen kann die herkömmliche direkte Anforderungsmethode angesichts hoher Parallelität und großem Datenverkehr nicht mehr den Anforderungen gerecht werden. Als technische Lösung zur Entkopplung und asynchronen Verarbeitung wird die Nachrichtenwarteschlange in vielen Anwendungen auf Unternehmensebene häufig verwendet. In der PHP-Nachrichtenwarteschlange sind Nachrichtenbestätigung und Wiederholungsmechanismus zwei sehr wichtige Konzepte. In diesem Artikel werden sie ausführlich vorgestellt und entsprechende Codebeispiele gegeben.

  1. Nachrichtenbestätigungsmechanismus

In der Nachrichtenwarteschlange bedeutet der Nachrichtenbestätigungsmechanismus, dass der Verbraucher nach Erhalt der Nachricht eine Bestätigungsnachricht an die Nachrichtenwarteschlange sendet, um die Nachrichtenwarteschlange darüber zu informieren, dass die Nachricht erfolgreich verarbeitet wurde. Wenn eine Ausnahme auftritt oder die Verarbeitung fehlschlägt, während ein Verbraucher eine Nachricht verarbeitet, erhält die Nachrichtenwarteschlange keine Bestätigungsinformationen und geht davon aus, dass die Nachrichtenverarbeitung fehlgeschlagen ist, und verteilt die Nachricht an andere Verbraucher oder versucht den Vorgang erneut.

Bei der Implementierung des Nachrichtenbestätigungsmechanismus müssen die folgenden zwei Aspekte berücksichtigt werden:
(1) Wie der Nachrichtenkonsument Bestätigungsinformationen an die Nachrichtenwarteschlange sendet
(2) Wie die Nachrichtenwarteschlange Nachrichten verarbeitet, die keine Bestätigungsinformationen erhalten haben

In der PHP-Nachrichtenwarteschlange wird normalerweise das AMQP-Protokoll (Advanced Message Queuing Protocol) verwendet, um den Nachrichtenbestätigungsmechanismus zu implementieren. Das Folgende ist ein Beispiel für die Verwendung von 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();

Im obigen Code werden eine Nachrichtenwarteschlangenverbindung und ein Kanal erstellt und eine Warteschlange mit dem Namen „Hallo“ deklariert. Rufen Sie in der Rückruffunktion nach der Geschäftsverarbeitung der empfangenen Nachricht $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']) auf um Bestätigungsinformationen an die Nachrichtenwarteschlange zu senden. $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();

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

Nachrichten, die keine Bestätigungsinformationen erhalten haben, werden von der Nachrichtenwarteschlange gemäß bestimmten Strategien verarbeitet. Eine übliche Verarbeitungsmethode besteht darin, die Ablaufzeit der Nachricht festzulegen. Wenn die Nachricht innerhalb eines bestimmten Zeitraums keine Bestätigungsinformationen erhält, gilt die Nachrichtenverarbeitung als fehlgeschlagen und die Nachrichtenwarteschlange verteilt die Nachricht an andere Verbraucher.

    Nachrichtenwiederholungsmechanismus🎜🎜🎜Der Nachrichtenwiederholungsmechanismus bezieht sich auf einen Mechanismus zum Wiederholen der Nachricht, nachdem die Nachrichtenverarbeitung fehlgeschlagen ist. In der Nachrichtenwarteschlange kann die Nachrichtenwiederholung auf den folgenden zwei Methoden basieren: 🎜(1) Feste Anzahl von Wiederholungsversuchen: Bei Nachrichten, die nicht verarbeitet werden können, verteilt die Nachrichtenwarteschlange die Nachricht neu an den Verbraucher und versucht es jedes Mal erneut, wenn der Zähler erreicht ist Wenn eine bestimmte Anzahl von Wiederholungsversuchen erreicht wird, unternimmt die Nachrichtenwarteschlange keinen erneuten Versuch, sondern sendet die Nachricht an eine bestimmte Fehlerwarteschlange, um auf einen manuellen Eingriff zu warten. 🎜(2) Exponentialbasierte Wiederholungszeit: Bei Nachrichten, die nicht verarbeitet werden können, verteilt die Nachrichtenwarteschlange die Nachricht neu an den Verbraucher und bestimmt das Zeitintervall für jeden Wiederholungsversuch basierend auf der Exponentialmethode. Normalerweise wird das Zeitintervall zwischen den einzelnen Wiederholungsversuchen exponentiell erhöht, um eine große Anzahl von Wiederholungsversuchen in kurzer Zeit zu vermeiden und die Systemlast zu reduzieren. 🎜🎜Das Folgende ist ein Beispiel für die Verwendung des Nachrichtenwiederholungsmechanismus von Rabbitmq: 🎜rrreee🎜Im obigen Code wird eine Warteschlange mit dem Namen „task_queue“ deklariert, wobei $channel->basic_qos(null, 1, null);Einrichten, um jeweils nur eine Nachricht zu verteilen und den Nachrichtenverarbeitungsfehler in der Rückruffunktion zu simulieren. Wenn die Verarbeitung fehlschlägt, rufen Sie $msg->delivery_info['channel']->basic_reject($msg->delivery_info['delivery_tag'], true); im Beispielcode auf, um eine Wiederholung zu senden Nachrichten in die Nachrichtenwarteschlange. 🎜🎜Durch den Nachrichtenbestätigungsmechanismus und den Wiederholungsmechanismus kann die PHP-Nachrichtenwarteschlange die Zuverlässigkeit der Nachrichten und die Effizienz der Verarbeitung sicherstellen. Entwickler können basierend auf den tatsächlichen Anforderungen geeignete Nachrichtenbestätigungs- und Wiederholungsstrategien auswählen, um eine bessere Benutzererfahrung und Systemleistung zu bieten. 🎜

Das obige ist der detaillierte Inhalt vonEinführung in den Nachrichtenbestätigungs- und Wiederholungsmechanismus in der PHP-Nachrichtenwarteschlange. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn