Baris gilir penyahduplikasian mesej dan kaedah pemprosesan mati pucuk dalam PHP dan MySQL

王林
Lepaskan: 2023-10-15 10:42:02
asal
1009 orang telah melayarinya

Baris gilir penyahduplikasian mesej dan kaedah pemprosesan mati pucuk dalam PHP dan MySQL

Cara mengendalikan penyahduplikasian mesej dan mati pucuk mesej dalam baris gilir dalam PHP dan MySQL

Dalam pembangunan sebenar, kami sering Menggunakan baris gilir mesej untuk memproses tak segerak tugas untuk meningkatkan prestasi dan kebolehpercayaan sistem. Walau bagaimanapun, apabila menggunakan baris gilir, kami sering menghadapi masalah dengan penyahduplikasian mesej dan pemprosesan idempoten. Artikel ini akan memperkenalkan beberapa kaedah biasa untuk mengendalikan penyahduplikasian mesej dan mati pucuk mesej dalam PHP dan MySQL, dan memberikan contoh kod khusus.

  1. Kaedah pemprosesan deduplikasi mesej

Deduplikasi mesej bermakna jika mesej yang sama sudah wujud dalam baris gilir mesej, ia tidak akan diulang dengan. Terdapat banyak cara untuk mengendalikan penyahduplikasian mesej. Berikut ialah kaedah pemprosesan penyahduplikasian berasaskan Redis:

a) Gunakan koleksi pesanan Redis ZADD

Pertama sekali, kami boleh menggunakan koleksi pesanan Redis untuk memproses pemprosesan penyahduplikasian mesej. Kami menggunakan pengecam unik mesej sebagai ahli set yang dipesan, dan cap masa mesej sebagai skor set yang dipesan. Apabila mesej baharu diterima, kami boleh menggunakan arahan ZADD untuk menambah pengecam unik dan cap masa mesej pada koleksi yang dipesan. Kemudian, kita boleh menggunakan arahan ZSCORE untuk menanyakan cap masa mesej Jika cap masa berada dalam julat ambang tertentu, mesej itu dianggap sudah wujud dan tidak akan diproses lagi.

Berikut ialah contoh kod penyahduplikasian mesej berdasarkan 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;
}
Salin selepas log masuk

Dalam kod di atas, kami mula-mula menjananya melalui fungsi generateUniqueId Pengecam unik mesej. Kemudian, gunakan perintah zscore untuk menanyakan cap masa mesej untuk menentukan sama ada mesej itu sudah wujud dan cap masa berada dalam julat tertentu. Jika mesej sudah wujud, tiada pemprosesan dilakukan Jika tidak, mesej akan diproses dan pengecam unik serta cap masa mesej itu ditambahkan pada set tertib. 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;
}
Salin selepas log masuk

在上面的代码中,我们通过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;
}
Salin selepas log masuk

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

b) Menggunakan indeks unik jadual MySQL

Selain Redis, kami juga boleh menggunakan indeks unik jadual MySQL untuk menyahduplikasi mesej. Kita boleh mencipta jadual mesej yang mengandungi medan indeks unik untuk menyimpan pengecam unik mesej. Apabila mesej baharu diterima, kami cuba memasukkan rekod ke dalam jadual mesej Jika sisipan gagal, mesej sudah wujud dan tidak akan diproses lagi. Jika tidak, proses mesej.

Berikut ialah contoh kod penyahduplikasian mesej berdasarkan MySQL: #🎜🎜#rrreee#🎜🎜#Dalam kod di atas, kami menjana mesej melalui fungsi generateUniqueId yang unik pengecam. Kemudian, cuba masukkan rekod ke dalam jadual message_deduplication, menggunakan pernyataan INSERT IGNORE untuk mengelak daripada memasukkan rekod pendua. Jika sisipan berjaya, ia bermakna mesej tidak wujud dan mesej akan diproses jika tidak, ia bermakna mesej sudah wujud dan tiada pemprosesan selanjutnya akan dilakukan. #🎜🎜#
    #🎜🎜#Mesej mati pucuk kaedah pemprosesan#🎜🎜##🎜🎜##🎜🎜#Mesej mati pucuk merujuk kepada berbilang pemprosesan mesej yang sama, hanya akan ada kesan perniagaan . Terdapat beberapa cara untuk mengendalikan ketidakupayaan mesej. Berikut ialah kaedah pemprosesan idempotensi berasaskan pangkalan data: #🎜🎜##🎜🎜#a) Tanya status pangkalan data sebelum memproses mesej #🎜🎜##🎜🎜#Apabila memproses mesej, kita boleh mencipta jadual status A yang digunakan untuk merekodkan status pemprosesan mesej. Apabila mesej baharu diterima, jadual status pertama kali disoal untuk menentukan sama ada mesej telah diproses. Jika mesej telah diproses, tiada pemprosesan dilakukan jika tidak, mesej diproses dan status pemprosesan mesej dikemas kini dalam jadual status. #🎜🎜##🎜🎜#Berikut ialah contoh kod pemprosesan mati pucuk mesej berdasarkan MySQL: #🎜🎜#rrreee#🎜🎜#Dalam kod di atas, kami mula-mula lulus fungsi generateUniqueId Generates pengecam unik untuk mesej. Kemudian, tentukan status pemprosesan mesej dengan menanyakan jadual message_processing. Jika status pemprosesan diproses, tiada pemprosesan selanjutnya akan dilakukan Jika status pemprosesan tidak diproses, mesej akan diproses dan status pemprosesan akan dikemas kini untuk diproses. #🎜🎜##🎜🎜#Ringkasan: #🎜🎜##🎜🎜#Di atas ialah beberapa kaedah biasa untuk mengendalikan penyahduplikasian mesej dan mati pucuk mesej dalam PHP dan MySQL. Dalam pembangunan sebenar, kita boleh memilih kaedah yang sesuai mengikut keperluan khusus dan seni bina sistem. Sama ada pemprosesan deduplikasi berasaskan Redis atau pemprosesan idempoten berasaskan MySQL, ia boleh membantu kami memproses mesej dengan lebih baik dalam baris gilir dan meningkatkan kebolehpercayaan dan prestasi sistem. #🎜🎜#

Atas ialah kandungan terperinci Baris gilir penyahduplikasian mesej dan kaedah pemprosesan mati pucuk dalam PHP dan MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!