Heim  >  Artikel  >  Backend-Entwicklung  >  Methoden zur Warteschlangen-Nachrichtendeduplizierung und Nachrichten-Idempotenz-Verarbeitung in PHP und MySQL

Methoden zur Warteschlangen-Nachrichtendeduplizierung und Nachrichten-Idempotenz-Verarbeitung in PHP und MySQL

王林
王林Original
2023-10-15 10:30:111028Durchsuche

Methoden zur Warteschlangen-Nachrichtendeduplizierung und Nachrichten-Idempotenz-Verarbeitung in PHP und MySQL

Methoden zur Verarbeitung der Nachrichtendeduplizierung und Nachrichten-Idempotenz von Warteschlangen in PHP und MySQL

In der tatsächlichen Entwicklung verwenden wir häufig Nachrichtenwarteschlangen, um asynchrone Aufgaben zu verarbeiten und die Leistung und Zuverlässigkeit des Systems zu verbessern. Bei der Verwendung von Warteschlangen treten jedoch häufig Probleme mit der Deduplizierung von Nachrichten und der idempotenten Verarbeitung auf. In diesem Artikel werden einige gängige Methoden zum Umgang mit Nachrichtendeduplizierung und Nachrichten-Idempotenz in PHP und MySQL vorgestellt und spezifische Codebeispiele gegeben.

  1. Methode zur Verarbeitung der Nachrichtendeduplizierung

Nachrichtendeduplizierung bedeutet, dass dieselbe Nachricht nicht wiederholt verarbeitet wird, wenn sie bereits in der Nachrichtenwarteschlange vorhanden ist. Es gibt verschiedene Möglichkeiten, die Deduplizierung von Nachrichten zu handhaben. Das Folgende ist eine auf Redis basierende Deduplizierungsverarbeitungsmethode:

a) Verwendung des geordneten Redis-Satzsatzes ZADD

Zunächst können wir den geordneten Satz von Redis verwenden, um die Nachrichtendeduplizierungsverarbeitung durchzuführen. Wir verwenden die eindeutige Kennung der Nachricht als Mitglied des geordneten Satzes und den Zeitstempel der Nachricht als Bewertung des geordneten Satzes. Wenn eine neue Nachricht empfangen wird, können wir mit dem Befehl ZADD die eindeutige Kennung und den Zeitstempel der Nachricht zur geordneten Sammlung hinzufügen. Dann können wir den ZSCORE-Befehl verwenden, um den Zeitstempel der Nachricht abzufragen. Wenn der Zeitstempel innerhalb eines bestimmten Schwellenwertbereichs liegt, wird davon ausgegangen, dass die Nachricht bereits vorhanden ist und nicht mehr verarbeitet wird.

Das Folgende ist ein Codebeispiel für die Nachrichtendeduplizierung basierend auf Redis:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

function processMessage($message) {
    $messageId = generateUniqueId($message);
    $timestamp = time();

    // 判断消息是否已经存在
    $existingTimestamp = $redis->zscore('message:deduplication', $messageId);

    // 如果消息存在并且时间戳在一定范围内,则不进行处理
    if ($existingTimestamp && $timestamp - $existingTimestamp <= 60) {
        return;
    }

    // 处理消息
    // ...

    // 将消息的唯一标识和时间戳添加到有序集合中
    $redis->zadd('message:deduplication', $timestamp, $messageId);
}

function generateUniqueId($message) {
    // 生成消息的唯一标识
    // ...
    return $uniqueId;
}

Im obigen Code generieren wir zunächst die eindeutige Kennung der Nachricht über die Funktion generateUniqueId. Verwenden Sie dann den Befehl zscore, um den Zeitstempel der Nachricht abzufragen, um festzustellen, ob die Nachricht bereits existiert und der Zeitstempel innerhalb eines bestimmten Bereichs liegt. Wenn die Nachricht bereits vorhanden ist, wird keine Verarbeitung durchgeführt. Andernfalls wird die Nachricht verarbeitet und die eindeutige Kennung und der Zeitstempel der Nachricht zum geordneten Satz hinzugefügt. generateUniqueId函数生成消息的唯一标识。然后,通过zscore命令查询消息的时间戳,判断消息是否已经存在,并且时间戳在一定范围内。如果消息已经存在,则不进行处理,否则,进行消息的处理,并将消息的唯一标识和时间戳添加到有序集合中。

b) 使用MySQL表的唯一索引

除了Redis,我们还可以利用MySQL表的唯一索引来进行消息的去重处理。我们可以创建一个消息表,表中包含一个唯一索引字段,用来存储消息的唯一标识。当收到一条新消息时,我们尝试向消息表中插入一条记录,如果插入失败,则说明消息已经存在,不再进行处理。否则,进行消息的处理。

下面是一个基于MySQL的消息去重处理的代码示例:

<?php
$mysqli = new mysqli('localhost', 'username', 'password', 'database');

function processMessage($message) {
    $messageId = generateUniqueId($message);

    $sql = "INSERT IGNORE INTO message_deduplication (message_id) VALUES ('$messageId')";

    if ($mysqli->query($sql)) {
        // 插入成功,处理消息
        // ...
    } else {
        // 消息已经存在,不再处理
    }
}

function generateUniqueId($message) {
    // 生成消息的唯一标识
    // ...
    return $uniqueId;
}

在上面的代码中,我们通过generateUniqueId函数生成消息的唯一标识。然后,尝试向message_deduplication表中插入一条记录,使用INSERT IGNORE语句避免插入重复的记录。如果插入成功,则说明消息不存在,进行消息的处理;否则,说明消息已经存在,不再进行处理。

  1. 消息幂等性处理方法

消息幂等性是指对于同一条消息的多次处理,只会产生一次业务影响。处理消息幂等性的方法有多种。下面给出一种基于数据库的幂等性处理方法:

a) 在处理消息前查询数据库状态

在处理消息时,我们可以在数据库中创建一个状态表,用来记录消息的处理状态。当收到一条新消息时,首先查询状态表,判断消息是否已经处理。如果消息已经处理,则不进行处理;否则,进行消息的处理,并将消息的处理状态更新到状态表中。

下面是一个基于MySQL的消息幂等性处理的代码示例:

<?php
$mysqli = new mysqli('localhost', 'username', 'password', 'database');

function processMessage($message) {
    $messageId = generateUniqueId($message);

    // 查询处理状态
    $sql = "SELECT status FROM message_processing WHERE message_id = '$messageId'";
    $result = $mysqli->query($sql);

    if ($result && $result->num_rows > 0) {
        $row = $result->fetch_assoc();
        $status = $row['status'];

        // 如果处理状态为已处理,则不再处理
        if ($status == 1) {
            return;
        }
    }

    // 处理消息
    // ...

    // 更新处理状态
    $sql = "INSERT INTO message_processing (message_id, status) VALUES ('$messageId', 1) ON DUPLICATE KEY UPDATE status = 1";
    $mysqli->query($sql);
}

function generateUniqueId($message) {
    // 生成消息的唯一标识
    // ...
    return $uniqueId;
}

在上面的代码中,我们首先通过generateUniqueId函数生成消息的唯一标识。然后,通过查询message_processing

b) Verwenden Sie den eindeutigen Index der MySQL-Tabelle

Zusätzlich zu Redis können wir auch den eindeutigen Index der MySQL-Tabelle verwenden, um Nachrichten zu deduplizieren. Wir können eine Nachrichtentabelle erstellen, die ein eindeutiges Indexfeld enthält, um die eindeutige Kennung der Nachricht zu speichern. Wenn eine neue Nachricht empfangen wird, versuchen wir, einen Datensatz in die Nachrichtentabelle einzufügen. Wenn das Einfügen fehlschlägt, bedeutet dies, dass die Nachricht bereits vorhanden ist und nicht mehr verarbeitet wird. Andernfalls verarbeiten Sie die Nachricht.

Das Folgende ist ein Codebeispiel für die Nachrichtendeduplizierung auf Basis von MySQL: 🎜rrreee🎜Im obigen Code generieren wir die eindeutige Kennung der Nachricht über die Funktion generateUniqueId. Versuchen Sie dann, einen Datensatz in die Tabelle message_deduplication einzufügen, indem Sie die Anweisung INSERT IGNORE verwenden, um das Einfügen doppelter Datensätze zu vermeiden. Wenn das Einfügen erfolgreich ist, bedeutet dies, dass die Nachricht nicht vorhanden ist und die Nachricht verarbeitet wird. Andernfalls bedeutet dies, dass die Nachricht bereits vorhanden ist und keine weitere Verarbeitung durchgeführt wird. 🎜
    🎜Methode zur Nachrichten-Idempotenz-Verarbeitung🎜🎜🎜Nachrichten-Idempotenz bedeutet, dass die mehrfache Verarbeitung derselben Nachricht nur eine geschäftliche Auswirkung hat. Es gibt verschiedene Möglichkeiten, mit Nachrichten-Idempotenz umzugehen. Das Folgende ist eine datenbankbasierte idempotente Verarbeitungsmethode: 🎜🎜a) Fragen Sie den Datenbankstatus ab, bevor Sie die Nachricht verarbeiten. 🎜🎜Bei der Verarbeitung der Nachricht können wir eine Statustabelle in der Datenbank erstellen, um den Verarbeitungsstatus der Nachricht aufzuzeichnen. Beim Empfang einer neuen Nachricht wird zunächst die Statustabelle abgefragt, um festzustellen, ob die Nachricht verarbeitet wurde. Wenn die Nachricht verarbeitet wurde, wird sie nicht verarbeitet; andernfalls wird die Nachricht verarbeitet und der Verarbeitungsstatus der Nachricht wird in der Statustabelle aktualisiert. 🎜🎜Das Folgende ist ein Codebeispiel für die Verarbeitung von Nachrichten-Idempotenz auf Basis von MySQL: 🎜rrreee🎜Im obigen Code generieren wir zunächst die eindeutige Kennung der Nachricht über die Funktion generateUniqueId. Bestimmen Sie dann den Verarbeitungsstatus der Nachricht, indem Sie die Tabelle message_processing abfragen. Wenn der Verarbeitungsstatus „Verarbeitet“ ist, wird keine weitere Verarbeitung durchgeführt. Wenn der Verarbeitungsstatus „Unverarbeitet“ lautet, wird die Nachricht verarbeitet und der Verarbeitungsstatus wird auf „Verarbeitet“ aktualisiert. 🎜🎜Zusammenfassung: 🎜🎜Die oben genannten sind einige gängige Methoden zum Umgang mit Nachrichtendeduplizierung und Nachrichten-Idempotenz in PHP und MySQL. In der tatsächlichen Entwicklung können wir die geeignete Methode entsprechend den spezifischen Anforderungen und der Systemarchitektur auswählen. Unabhängig davon, ob es sich um eine Redis-basierte Deduplizierungsverarbeitung oder eine MySQL-basierte idempotente Verarbeitung handelt, können sie uns dabei helfen, Nachrichten in der Warteschlange besser zu verarbeiten und die Zuverlässigkeit und Leistung des Systems zu verbessern. 🎜

Das obige ist der detaillierte Inhalt vonMethoden zur Warteschlangen-Nachrichtendeduplizierung und Nachrichten-Idempotenz-Verarbeitung in PHP und MySQL. 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