Rumah  >  Artikel  >  pangkalan data  >  Cara melaksanakan penjadualan tugas berdasarkan kunci yang diedarkan Redis

Cara melaksanakan penjadualan tugas berdasarkan kunci yang diedarkan Redis

WBOY
WBOYke hadapan
2023-05-28 13:37:30666semak imbas

Dalam proses pengumpulan data berskala besar yang diedarkan, pengurusan sumber maklumat amat penting. Bagi memastikan tugasan yang sama hanya boleh diproses oleh seorang pengumpul pada masa yang sama, keunikan penjadualan tugas perlu dipastikan. Biasanya apabila kita menjalankan pengumpulan data yang diedarkan, biasanya akan ada modul penjadualan, yang tanggungjawab utamanya adalah untuk mengagihkan tugas pengumpulan dan memastikan keunikan tugas.

Oleh kerana ia diedarkan, ia melibatkan berbilang pelayan (berbilang mesin), setiap pelayan melibatkan berbilang pengumpul (berbilang proses), dan setiap pengumpul mungkin melibatkan berbilang benang , Oleh itu, mekanisme kunci dalam tugas modul penjadualan amat penting. Bergantung pada seni bina pelaksanaan aplikasi, kaedah pelaksanaan kunci biasanya boleh dibahagikan kepada jenis berikut:

  • Jika pengendali adalah satu proses dan berbilang benang, di bawah python , anda boleh Gunakan objek Kunci modul benang untuk menyekat akses segerak kepada pembolehubah kongsi untuk mencapai keselamatan benang.

  • Dalam kes mesin tunggal dan berbilang proses, di bawah python, anda boleh menggunakan objek Lock multiprocessing untuk mengendalikannya.

  • Dalam kes penggunaan berbilang mesin dan berbilang proses, anda perlu bergantung pada komponen pihak ketiga (objek kunci storan) untuk melaksanakan kunci penyegerakan yang diedarkan.

Memandangkan modul penjadualan ialah mekanisme pemprosesan berbilang mesin, berbilang proses dan berbilang benang, ia konsisten dengan kaedah ketiga.

Kaedah pelaksanaan kunci teragih

Kaedah pelaksanaan kunci teragih arus perdana semasa adalah seperti berikut:

  • Dilaksanakan berasaskan pada pangkalan data, seperti mysql

  • Dilaksanakan berdasarkan cache, seperti redis

  • dilaksanakan berdasarkan zookeeper

Setiap kaedah pelaksanaan mempunyai kelebihan tersendiri Selepas pertimbangan menyeluruh, Redis adalah pilihan yang paling sesuai. Sebab utama ialah:

  • Redis beroperasi berdasarkan memori, dan kelajuan capaian lebih pantas daripada pangkalan data Di bawah keselarasan tinggi, prestasi selepas penguncian tidak akan jatuh terlalu banyak

  • redis boleh menetapkan masa untuk hidup (TTL) bagi nilai utama

  • Redis mudah digunakan dan mempunyai overhed pelaksanaan keseluruhan yang rendah

Walau bagaimanapun, kunci teragih yang dilaksanakan menggunakan redis juga perlu memenuhi syarat berikut:

  1. Hanya satu utas boleh menduduki kunci pada masa yang sama. Benang lain mesti menunggu sehingga kunci dilepaskan

  2. Kendalian kunci mesti memenuhi atomicity

  3. Tiada kebuntuan akan berlaku, seperti apabila kunci telah diperoleh Benang tiba-tiba terkeluar secara tidak normal sebelum melepaskan kunci, menyebabkan benang lain menunggu dalam gelung untuk kunci dilepaskan

  4. Tambahan dan pelepasan kunci mesti ditetapkan oleh benang yang sama

Kami menggunakan redis untuk melaksanakan kunci penyegerakan yang diedarkan untuk memastikan ketekalan data, yang perlu memenuhi ciri-ciri berikut:

  • Memuaskan eksklusiviti bersama, hanya satu utas boleh memperoleh kunci pada masa yang sama

  • Gunakan ttl redis untuk memastikan bahawa tiada jalan buntu akan berlaku, tetapi ia juga akan menyebabkan masalah kerana tamat tempoh kunci Masalah berbilang benang yang menduduki kunci pada masa yang sama memerlukan kami menetapkan masa tamat tempoh kunci dengan munasabah untuk mengelakkan

  • Gunakan keunikan kunci untuk memastikan bahawa kunci tidak akan dipadamkan secara tidak sengaja


Semasa operasi sebenar, saya memisahkan penjadualan modul daripada keseluruhan sistem pengumpulan dan berdasarkannya pada klien Java Jredis (JRedis ialah klien Java berprestasi tinggi yang digunakan untuk menyambung ke pangkalan data nilai kunci hash yang diedarkan Redis. Perkhidmatan bebas menggunakan Spring Boot untuk melaksanakan segerak dan fungsi tak segerak supaya pengumpul lain boleh meminta tugasan pengumpulan diproses melalui HTTP Proses pemprosesan adalah secara kasar seperti berikut:

  • Pengumpul menghantar permintaan tugas ke pusat penghantaran melalui HTTP;

  • Pusat penghantaran menentukan sama ada kunci wujud , jika wujud, set kosong akan dikembalikan terus

  • Jika kunci tidak wujud, permintaan akan dikunci, dan kemudian tugas pengumpulan yang sepadan akan diperolehi mengikut peraturan sumber; , dan kemudian memadamkan kunci

  • Pelaksanaan kod modul penjadualan adalah kira-kira seperti berikut:

Senarai statik awam RedisHashUtils redisHashUtils, permintaan HttpServletRequest,

HashServiceInterface hif, ZSetServiceInterface zScoreSet, String dicName) {

List

String dicNameLock = "Dispatcher_Task_Lock"; // Kunci penjadualan tugas;

jika (! redisHashUtils.keyIsExit(dicNameLock, lockKeyValue)) {// Tentukan 🎜>

// Tambah kunci (tulis pengecam unik tugasan ke dalam rekod); 🎜>

// Memproses logik tugas

                                                                                                         .........

; HSDI .RMove (redishhashutils, dicnamelock, lockKeyval);

Maaf, anda tidak memberikan perkataan asal yang perlu ditulis semula dan penulisan semula tidak boleh dilakukan jika tidak {

                                                                                                                                                                                                                                                                                                                          Pulihkan koleksi kosong buat sementara waktu. ...");

Maaf, anda tidak memberikan perkataan asal yang perlu ditulis semula, jadi penulisan semula tidak boleh dilakukan

} tangkap (

Pengecualian e) {e.printStackTrace();

}

kembali hasil;

}

Semasa operasi sebenar, Apabila menambah kunci, anda mesti menambah

masa tamat tempoh

pada kunci Jika tidak, jika beberapa pengecualian yang tidak diketahui berlaku, kunci mungkin tidak dilepaskan dan pengumpul tidak akan dapat mendapatkan tugas pengumpulan.

Atas ialah kandungan terperinci Cara melaksanakan penjadualan tugas berdasarkan kunci yang diedarkan Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam