Biar saya berikan anda satu contoh Kami telah membina sistem penyegerakan mysql sebelum ini. Tekanannya masih sangat tinggi ke utuh lain Pergi ke perpustakaan mysql (mysql -> mysql). Perkara biasa ialah, sebagai contoh, pasukan data besar perlu menyegerakkan perpustakaan mysql untuk melaksanakan pelbagai operasi kompleks pada data sistem perniagaan syarikat. binlog
Apabila anda menambah, memadam atau mengubah suai sekeping data dalam mysql, akan ada 3 penambahan, pemadaman dan pengubahsuaian
log yang sepadan dengannya, kemudian ketiga-tiga entri binlog
ini akan dihantar ke MQ, dan kemudian dimakan dan dilaksanakan mengikut urutan Sekurang-kurangnya ia mesti dipastikan bahawa ia adalah mengikut urutan. Jika tidak, ia pada asalnya: tambah, ubah suai, padam tetapi anda hanya menukar pesanan dan melaksanakannya untuk memadam, mengubah suai dan menambah. binlog
Pada asalnya, apabila data ini disegerakkan, data sepatutnya telah dipadamkan pada penghujungnya, tetapi akibatnya, anda mendapat pesanan yang salah, dan data telah dikekalkan pada akhirnya, dan penyegerakan data menjadi salah; .
Mari kita lihat dahulu dua senario di mana pesanan akan menjadi tidak teratur:
- RabbitMQ: satu baris gilir, berbilang pengguna. Sebagai contoh, pengeluar menghantar tiga keping data kepada RabbitMQ, dalam susunan data1/data2/data3, dan apa yang ditolak ke dalam baris gilir memori RabbitMQ. Terdapat tiga pengguna yang menggunakan salah satu daripada tiga keping data daripada MQ Hasilnya, pengguna 2 menyelesaikan operasi terlebih dahulu dan menyimpan data2 ke pangkalan data, diikuti dengan data1/data3. Ini jelas tidak kacau.
- Kafka: Sebagai contoh, kami mencipta topik dengan tiga partition. Apabila pengeluar menulis, dia sebenarnya boleh menentukan kunci Contohnya, jika kita menentukan id pesanan sebagai kunci, maka data yang berkaitan dengan pesanan ini pasti akan diedarkan ke partition yang sama, dan data dalam partition ini mesti ada. adalah perintah.
Apabila pengguna mengeluarkan data daripada partition, mereka juga mesti teratur. Pada ketika ini, pesanan masih ok dan tidak ada kekeliruan. Seterusnya, kami mungkin membuat berbilang rangkaian dalam pengguna untuk memproses mesej secara serentak. Kerana jika pengguna menggunakan dan memproses dalam satu utas, dan pemprosesan itu memakan masa, sebagai contoh, ia mengambil masa berpuluh-puluh ms untuk memproses mesej, maka hanya berpuluh-puluh mesej boleh diproses dalam 1 saat, yang merupakan daya pemprosesan yang terlalu rendah . Jika berbilang utas berjalan serentak, pesanan mungkin menjadi kucar-kacir.
Penyelesaian
RabbitMQ
Pisah berbilang baris gilir, setiap baris gilir mempunyai satu pengguna, iaitu lebih banyak baris gilir, yang sememangnya titik yang menyusahkan atau hanya ada satu baris gilir tetapi sepadan dengan satu pengguna, dan kemudian pengguna ini menggunakan baris gilir memori secara dalaman untuk beratur, dan kemudian mengedarkan Berikan lapisan bawah pekerja yang berbeza untuk dikendalikan.
Kafka
- Topik, partition, pengguna, penggunaan single-thread dalaman, single-thread throughput adalah terlalu rendah, secara amnya ini tidak akan digunakan.
- Tulis N baris gilir memori, dan data dengan kunci yang sama akan pergi ke baris gilir memori yang sama, kemudian untuk N benang, setiap utas menggunakan satu baris gilir memori, supaya Memastikan keteraturan.
Atas ialah kandungan terperinci Bagaimanakah mysql memastikan susunan mesej?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!