Multiprosesor Python dengan Antrian vs ZeroMQ IPC

10

Saya sibuk menulis aplikasi Python menggunakan ZeroMQ dan mengimplementasikan variasi pola Majordomo seperti yang dijelaskan dalam ZGuide .

Saya memiliki broker sebagai perantara antara serangkaian pekerja dan klien. Saya ingin melakukan logging yang luas untuk setiap permintaan yang masuk, tetapi saya tidak ingin broker membuang waktu untuk melakukan itu. Pialang harus meneruskan permintaan penebangan itu ke hal lain.

Saya telah memikirkan dua cara: -

  1. Buat pekerja yang hanya untuk logging dan gunakan transportasi ZeroMQ IPC
  2. Gunakan Multiprocessing dengan Antrian

Saya tidak yakin mana yang lebih baik atau lebih cepat dalam hal ini. Opsi pertama memungkinkan saya untuk menggunakan kelas basis pekerja saat ini yang sudah saya gunakan untuk pekerja normal, tetapi opsi kedua tampaknya lebih cepat untuk diterapkan.

Saya ingin saran atau komentar di atas atau mungkin solusi yang berbeda.

Imraan
sumber

Jawaban:

4

Saya suka pendekatan menggunakan alat standar seperti apa yang diusulkan Jonathan. Anda tidak menyebutkan OS mana yang Anda kerjakan, tetapi alternatif lain yang mengikuti semangat yang sama bisa menggunakan modul logging standar Python bersama-sama dengan logging.handlers.SysLogHandlerdan mengirim pesan logging ke layanan rsyslog (tersedia di linux / unix mana saja, tapi saya pikir ada juga opsi windows , tapi saya tidak pernah menggunakan yang itu).

Intinya seluruh sistem mengimplementasikan hal yang sama yang Anda pikirkan. Proses lokal Anda mengantri pesan log untuk ditangani / diproses / ditulis oleh orang lain. Dalam hal ini, orang lain ( rsyslog) adalah layanan terkenal dan terbukti yang memiliki banyak fungsi dan fleksibilitas bawaan.

Keuntungan lain dari pendekatan ini adalah bahwa produk Anda akan terintegrasi jauh lebih baik dengan alat sysadmin lain yang dibangun di atas syslog. Dan itu bahkan tidak mengharuskan Anda untuk menulis kode apa pun untuk mendapatkan opsi itu.

DXM
sumber
1
+1 untuk saran yang menghindari menciptakan kembali roda. Saya tidak keberatan mewarisi sistem yang dirancang dengan cara ini. Ini menyelesaikan pekerjaan dengan baik, namun memberikan banyak derajat kebebasan untuk modifikasi di masa depan.
evadeflow
2

Anda mungkin ingin mempertimbangkan kemungkinan ketiga untuk menerapkan logging jarak jauh. Jika Anda menggunakan modul pendataan Python standar, Anda dapat mempertimbangkan untuk menggunakan logging.QueueHandlerkelas di pekerja Anda, klien dan broker, dan logging.QueueListenerkelas dalam proses logging jarak jauh Anda.

Alih-alih menggunakan Python normal multiprocessing.Queuesebagai transportasi antara proses aplikasi Anda dan proses logging Anda, terapkan Queuekelas pengganti Anda sendiri menggunakan ZeroMQ dengan mengetik bebek untuk membuat kelas Anda menjadi pengganti drop-in untuk Python standar Queue. Dengan cara ini aplikasi Anda akan dapat berjalan tanpa diubah di lingkungan apa pun dari satu komputer multi-inti melalui pusat data terdistribusi.

Untuk meringkas, gunakan logger Python standar dengan QueueHandlersemua pekerja, klien dan broker Anda dan buat proses independen berdasarkan QueueListenerdan loggingpawang Python (s) pilihan Anda untuk menangani pengangkatan logging yang berat.

Jonathan
sumber
Saya menggunakan Python 2.7. Saya percaya bahwa kelas QueueHandler hanya tersedia dari Python 3.2.
Imraan
Akan sangat mudah untuk mengambil kode dari Python 3 dan menggunakannya langsung sebagai bagian dari aplikasi Anda.
Jonathan
Saya akan mencobanya dan memberi tahu Anda jika berhasil
Imraan
0

Ini adalah pendekatan yang sangat berbeda, masing-masing dengan serangkaian pro dan kontra, yang kemungkinan besar akan Anda lihat pada tahap pengembangan selanjutnya:

Saya telah memikirkan dua cara: -

  1. Buat pekerja yang hanya untuk logging dan gunakan transportasi ZeroMQ IPC
  2. Gunakan Multiprocessing dengan Antrian

Salah satu cara Anda dapat mencoba adalah memiliki pekerja penebangan tambahan, seperti dalam pendekatan 1. Anda dapat membiarkan pekerja Anda login ke cluster logging memcache, dan pekerja logging memantau beban sumber daya saat ini dan setelah menentukan parameter beban sumber daya yang diberikan, log pekerja ke perangkat terbatas IOP (mis. harddisk).

Saya juga menyukai pendekatan Jonathan dengan peringatan bahwa saya kebanyakan menggunakan Python 2.x, dan bahwa Anda mungkin harus mengatur backend logging Anda sendiri untuk benar-benar mendorong kinerja-amplop.

Perbaiki saya jika saya salah, tetapi pendapat saya adalah Anda melakukan tugas yang sangat intensif data, dengan TIO penyimpanan menjadi hambatan Anda.

Cara yang masih mudah adalah membiarkan broker melakukan brokeragelogging - dalam bentuk seperti yang dijelaskan - dengan semua kelemahan instance broker sentral. Sebagai contoh, jika broker memiliki permintaan tinggi sehingga tidak pernah mendapatkan ruang bernapas untuk menulis log memcached kembali ke penyimpanan, Anda perlu mengambil pendekatan lain.

Pada akhirnya Anda mungkin berakhir dengan model tanpa perantara. Itu adalah dengan pekerja mengelola pekerjaan mereka di antara mereka sendiri. Dalam contoh sederhana, melalui algoritma round-robin Terdistribusi .

Lorenz Lo Sauer
sumber