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:
Hanya satu utas boleh menduduki kunci pada masa yang sama. Benang lain mesti menunggu sehingga kunci dilepaskan
Kendalian kunci mesti memenuhi atomicity
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
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:
List
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!