Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Senario aplikasi penyahduplikasian mesej baris gilir dan mati pucuk mesej dalam PHP dan MySQL

Senario aplikasi penyahduplikasian mesej baris gilir dan mati pucuk mesej dalam PHP dan MySQL

WBOY
WBOYasal
2023-10-15 12:06:121392semak imbas

Senario aplikasi penyahduplikasian mesej baris gilir dan mati pucuk mesej dalam PHP dan MySQL

Senario aplikasi deduplikasi mesej baris gilir dan mati pucuk mesej dalam PHP dan MySQL

Pengenalan:
Dengan perkembangan berterusan teknologi Internet, baris gilir telah menjadi salah satu komponen asas yang penting dalam pelbagai sistem teragih . Dalam proses permohonan baris gilir, penyahduplikasian mesej dan hilang upaya mesej adalah dua masalah biasa, terutamanya dalam senario konkurensi tinggi. Artikel ini akan memperkenalkan secara terperinci senario aplikasi deduplikasi mesej baris gilir dan mati pucuk mesej dalam PHP dan MySQL, dan menyediakan contoh kod khusus.

1. Gambaran keseluruhan penyahduplikasian mesej dalam baris gilir
Penyahduplikasian mesej bermakna dalam sistem baris gilir, mesej yang sama hanya boleh diproses sekali untuk mengelakkan pemprosesan berulang. Untuk sistem beratur, mesej selalunya tidak dapat dielakkan dihantar berulang kali Contohnya, keabnormalan rangkaian, mekanisme cuba semula dan faktor lain boleh menyebabkan pertindihan mesej. Oleh itu, kita perlu melakukan pemprosesan deduplikasi mesej di sisi pengguna.

1.1 Kaedah penyahduplikasian
Terdapat dua kaedah penyahduplikasian mesej biasa: penyahduplikasian berasaskan Redis dan penyahduplikasi berasaskan pangkalan data. Penyahduplikasian berasaskan Redis dilaksanakan melalui struktur data pengumpulan Setiap kali mesej digunakan, Redis mula-mula bertanya sama ada mesej itu telah diproses, langkau ia, logik perniagaan yang sepadan akan dilaksanakan ditambahkan pada koleksi Redis. Penyahduplikasian berasaskan pangkalan data dicapai dengan mewujudkan indeks unik dalam pangkalan data Setiap kali mesej digunakan, pangkalan data akan ditanya untuk melihat sama ada rekod mesej itu sudah wujud, jika tidak, ia akan dilangkau logik perniagaan dilaksanakan dan Masukkan rekod mesej ke dalam pangkalan data.

1.2 contoh kod PHP
Andaikan kita menggunakan Redis sebagai medium storan untuk penyahduplikasian mesej Berikut ialah contoh kod:

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

// 判断消息是否已经处理过
function isMessageProcessed($message)
{
    global $redis;
    return $redis->sIsMember('processed_messages', $message);
}

// 处理消息并进行去重操作
function processMessage($message)
{
    global $redis;
    if (!isMessageProcessed($message)) {
        // 执行业务逻辑
        // ...

        // 将消息加入到已处理消息集合中
        $redis->sAdd('processed_messages', $message);
    }
}

// 消费消息
function consumeMessage($message)
{
    processMessage($message);
}

$message = 'example_message';
consumeMessage($message);

2 Gambaran keseluruhan ketidakupayaan mesej dalam baris gilir
Impotensi mesej bermakna untuk mesej yang sama, berbilang Diproses. beberapa kali, hasil pemprosesan akhir kekal konsisten. Idempotensi mesej adalah sangat penting dalam sistem teragih, kerana dalam situasi konkurensi tinggi, mesej yang sama mungkin diproses oleh berbilang pengguna pada masa yang sama Jika tiada jaminan idempotence, ketidakkonsistenan data akan berlaku.

2.1 Cara untuk melaksanakan mati pucuk
Terdapat tiga cara biasa untuk melaksanakan mati pucuk: nombor siri + jadual idempoten, anotasi tersuai idempoten dan kekangan keunikan. Antaranya, nombor jujukan + jadual idempoten dibuat dengan mencipta jadual idempoten dalam pangkalan data Sebelum memproses mesej, tanya jadual idempoten terlebih dahulu untuk menentukan sama ada mesej telah diproses, langkaunya, jika tidak, laksanakan perniagaan yang sepadan dan masukkan rekod mesej ke dalam jadual idempoten. Anotasi tersuai idempoten mengenal pasti operasi idempoten melalui anotasi tersuai Sebelum kaedah dilaksanakan, ia terlebih dahulu ditentukan sama ada kaedah itu telah dilaksanakan, ia akan dilangkau, jika tidak, logik perniagaan yang sepadan akan dilaksanakan. Kekangan unik dicapai dengan mewujudkan indeks unik dalam pangkalan data Apabila rekod pendua dijana semasa pemprosesan mesej, pangkalan data akan menapis rekod pendua secara automatik.

2.2 contoh kod MySQL
Berikut ialah contoh kod yang menggunakan MySQL untuk melaksanakan mati pucuk mesej:

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'password');

// 判断消息是否已经处理过
function isMessageProcessed($message)
{
    global $pdo;
    $stmt = $pdo->prepare('SELECT COUNT(*) FROM processed_messages WHERE message = :message');
    $stmt->execute([':message' => $message]);
    return $stmt->fetchColumn() > 0;
}

// 处理消息并实现幂等性
function processMessage($message)
{
    global $pdo;
    if (!isMessageProcessed($message)) {
        // 执行业务逻辑
        // ...

        // 插入处理过的消息记录
        $stmt = $pdo->prepare('INSERT INTO processed_messages (message) VALUES (:message)');
        $stmt->execute([':message' => $message]);
    }
}

// 消费消息
function consumeMessage($message)
{
    processMessage($message);
}

$message = 'example_message';
consumeMessage($message);

Kesimpulan:
Dalam penerapan baris gilir, deduplikasi mesej dan mati pucuk mesej adalah dua isu yang sangat penting . Melalui contoh kod khusus berdasarkan Redis dan MySQL yang diperkenalkan dalam artikel ini, masalah pemprosesan mesej berulang dan ketekalan data dapat diselesaikan dengan berkesan, dan kebolehpercayaan dan kestabilan sistem dapat dipertingkatkan. Dalam aplikasi praktikal, adalah perlu untuk memilih penyelesaian deduplikasi dan mati pucuk yang sesuai berdasarkan senario perniagaan tertentu, dan melakukan penalaan dan pengoptimuman yang sepadan seperti yang diperlukan.

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

Kenyataan:
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