Heim > Backend-Entwicklung > PHP-Tutorial > Anwendung der Warteschlangentechnologie bei der Nachrichtendeduplizierung und Nachrichten-Idempotenz in PHP und MySQL

Anwendung der Warteschlangentechnologie bei der Nachrichtendeduplizierung und Nachrichten-Idempotenz in PHP und MySQL

王林
Freigeben: 2023-10-15 12:44:02
Original
1362 Leute haben es durchsucht

Anwendung der Warteschlangentechnologie bei der Nachrichtendeduplizierung und Nachrichten-Idempotenz in PHP und MySQL

Anwendung der Warteschlangentechnologie bei der Nachrichtendeduplizierung und Nachrichten-Idempotenz in PHP und MySQL

Zusammenfassung: Mit der kontinuierlichen Entwicklung von Internetanwendungen sind Nachrichtenwarteschlangen zu einem wichtigen Werkzeug für die Handhabung hoher Parallelität und asynchroner Vorgänge geworden. Wie können in PHP und MySQL Warteschlangen verwendet werden, um die Probleme der Nachrichtendeduplizierung und Nachrichtenidempotenz zu lösen? In diesem Artikel werden spezifische Codebeispiele vorgestellt, die Redis und MySQL verwenden, um diese beiden Funktionen zu implementieren.

  1. Einführung
    Nachrichtenwarteschlange ist eine Methode zur Übermittlung von Nachrichten zwischen Anwendungen, die die Skalierbarkeit und Zuverlässigkeit des Systems verbessern kann. Im PHP-Bereich gibt es viele ausgereifte Nachrichtenwarteschlangen-Tools wie RabbitMQ, Kafka und Redis, während MySQL eine gängige relationale Datenbank ist.
  2. Nachrichtendeduplizierung
    In der Nachrichtenwarteschlange erscheinen manchmal doppelte Nachrichten. Aufgrund der Wiederholung der Nachrichten können einige Vorgänge wiederholt werden, was zu Datenverwirrung oder anderen Problemen führen kann. Um dieses Problem zu lösen, können wir die Set-Datenstruktur von Redis verwenden, um Nachrichten zu deduplizieren.

Der Beispielcode lautet wie folgt:

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

// 消息去重
function deduplicate($message) {
    if ($redis->sismember('processed_messages', $message)) {
        return false; // 已处理过的消息,不再处理
    }
    
    // 处理消息的逻辑...
    
    $redis->sadd('processed_messages', $message);
    return true;
}
Nach dem Login kopieren

Im obigen Code verwenden wir die Methoden sismember und sadd von Redis, um festzustellen, ob die Nachricht verarbeitet wurde. Wenn die Nachricht bereits in der Redis-Sammlung „processed_messages“ vorhanden ist, bedeutet dies, dass die Nachricht verarbeitet wurde und „false“ direkt zurückgegeben wird. Andernfalls verarbeiten Sie die Nachricht und fügen Sie sie der Sammlung hinzu.

  1. Nachrichten-Idempotenz
    In einem verteilten System können Nachrichten aufgrund von Netzwerk- und anderen Gründen wiederholt konsumiert werden. Um die Korrektheit des Systems sicherzustellen, müssen Nachrichten idempotent verarbeitet werden, d. h. die mehrmalige Verarbeitung derselben Nachricht hat den gleichen Effekt wie die einmalige Verarbeitung. In MySQL können wir eindeutige Indizes verwenden, um eine Idempotenz von Nachrichten zu erreichen.

Der Beispielcode lautet wie folgt:

CREATE TABLE messages (
    id INT AUTO_INCREMENT PRIMARY KEY,
    message VARCHAR(255) NOT NULL
    UNIQUE KEY message_index (message)
);
Nach dem Login kopieren

Im obigen Code erstellen wir eine Nachrichtentabelle, in der das Nachrichtenfeld über UNIQUE KEY einen eindeutigen Index definiert. Als nächstes müssen wir vor dem Einfügen der Nachricht feststellen, ob die Nachricht bereits vorhanden ist.

Der Beispielcode lautet wie folgt:

// 连接MySQL
$mysqli = new mysqli('localhost', 'username', 'password', 'database');

// 消息幂等性处理
function handle_message($message) {
    $escaped_message = $mysqli->real_escape_string($message);
    
    $select_query = "SELECT id FROM messages WHERE message = '$escaped_message'";
    
    $result = $mysqli->query($select_query);
    if ($result->num_rows > 0) {
        return; // 消息已存在,不再处理
    }
    
    // 处理消息的逻辑...
    
    $insert_query = "INSERT INTO messages (message) VALUES ('$escaped_message')";
    $mysqli->query($insert_query);
}
Nach dem Login kopieren

Im obigen Code verwenden wir die real_escape_string-Methode von MySQL, um die Nachricht zu maskieren und SQL-Injection-Angriffe zu verhindern. Anschließend fragen wir die Nachrichtentabelle ab, um festzustellen, ob die Nachricht bereits vorhanden ist. Wenn die Anzahl der Zeilen in der Ergebnismenge größer als 0 ist, bedeutet dies, dass die Nachricht bereits vorhanden ist und direkt zurückgegeben werden kann. Andernfalls verarbeiten Sie die Nachricht und fügen Sie sie in die Tabelle ein.

  1. Fazit
    Durch die Verwendung von Redis und MySQL können wir die Anwendung der Warteschlangentechnologie bei der Nachrichtendeduplizierung und Nachrichtenidempotenz in PHP und MySQL realisieren. Durch die Deduplizierung von Nachrichten können wir die wiederholte Verarbeitung von Nachrichten vermeiden und die Leistung und Zuverlässigkeit des Systems verbessern. Durch die Erkenntnis der Idempotenz von Nachrichten können wir die Korrektheit des Systems sicherstellen und die Nebenwirkungen einer mehrfachen Verarbeitung derselben Nachricht vermeiden. In praktischen Anwendungen können Nachrichten auch flexibler entsprechend den Geschäftsanforderungen verarbeitet werden.

Referenzmaterialien:

  • Offizielle Redis-Dokumentation: https://redis.io/documentation
  • Offizielle MySQL-Dokumentation: https://dev.mysql.com/doc/

Das obige ist der detaillierte Inhalt vonAnwendung der Warteschlangentechnologie bei der Nachrichtendeduplizierung und Nachrichten-Idempotenz in PHP und MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage