Python Multiprocessing กับ Queue กับ ZeroMQ IPC


10

ฉันไม่ว่างเขียนโปรแกรมประยุกต์ใช้งูหลามZeroMQและการดำเนินการการเปลี่ยนแปลงของรูปแบบ Majordomo ตามที่อธิบายไว้ในZGuide

ฉันมีนายหน้าเป็นตัวกลางระหว่างชุดคนงานและลูกค้า ฉันต้องการบันทึกข้อมูลอย่างละเอียดสำหรับทุกคำขอที่เข้ามา แต่ฉันไม่ต้องการให้นายหน้าทำอย่างนั้นเสียเวลา นายหน้าควรส่งคำขอบันทึกข้อมูลนั้นไปยังอย่างอื่น

ฉันคิดสองวิธี: -

  1. สร้างคนงานที่มีไว้สำหรับการเข้าสู่ระบบและใช้การขนส่ง ZeroMQ IPC เท่านั้น
  2. ใช้การประมวลผลหลายตัวพร้อมกับคิว

ฉันไม่แน่ใจว่าอันไหนดีกว่าหรือเร็วกว่าสำหรับเรื่องนั้น ตัวเลือกแรกทำให้ฉันสามารถใช้คลาสพื้นฐานของผู้ปฏิบัติงานปัจจุบันที่ฉันใช้สำหรับผู้ปฏิบัติงานปกติอยู่แล้ว แต่ตัวเลือกที่สองดูเหมือนจะเร็วกว่าที่จะใช้

ฉันต้องการคำแนะนำหรือความเห็นด้านบนหรืออาจเป็นวิธีแก้ไขปัญหาอื่น

คำตอบ:


4

ฉันชอบวิธีการใช้เครื่องมือมาตรฐานเหมือนที่โจนาธานเสนอ คุณไม่ได้พูดถึงระบบปฏิบัติการที่คุณใช้งานอยู่ แต่มีทางเลือกอื่นที่ตามมาด้วยจิตวิญญาณเดียวกันนี้คือการใช้โมดูลการบันทึกมาตรฐานของ Python พร้อมกับlogging.handlers.SysLogHandlerและส่งข้อความการบันทึกไปยังบริการrsyslog (มีอยู่ใน linux / unix ใด ๆ แต่ฉัน คิดว่ายังมีตัวเลือก windowsแต่ฉันไม่เคยใช้อันนั้น)

โดยพื้นฐานแล้วทั้งระบบใช้สิ่งเดียวกับที่คุณคิด กระบวนการโลคัลของคุณจัดคิวข้อความบันทึกที่จะจัดการ / ดำเนินการ / เขียนโดยบุคคลอื่น ในกรณีนี้คนอื่น ( rsyslog) เป็นบริการที่เป็นที่รู้จักและพิสูจน์แล้วว่ามีฟังก์ชั่นและความยืดหยุ่นในตัวมากมาย

ข้อดีอีกประการของวิธีนี้คือผลิตภัณฑ์ของคุณจะผสานรวมที่ดีขึ้นมากกับเครื่องมือดูแลระบบอื่น ๆ ที่สร้างขึ้นบน syslog และคุณไม่จำเป็นต้องเขียนโค้ดใด ๆ เพื่อรับตัวเลือกนั้น


1
+1 สำหรับข้อเสนอแนะที่หลีกเลี่ยงการสร้างล้อใหม่ ฉันจะไม่รังเกียจที่จะสืบทอดระบบที่ออกแบบมาในลักษณะนี้ มันทำให้งานสำเร็จเป็นอย่างดี แต่ก็ให้อิสระภาพมากมายสำหรับการดัดแปลงในอนาคต
หลบเลี่ยง

2

คุณอาจต้องการพิจารณาความเป็นไปได้ที่สามสำหรับการนำการบันทึกระยะไกลมาใช้ หากคุณใช้โมดูลการบันทึก Python มาตรฐานคุณสามารถพิจารณาใช้logging.QueueHandlerคลาสในพนักงานลูกค้าและโบรกเกอร์และlogging.QueueListenerคลาสในกระบวนการบันทึกระยะไกลของคุณ

แทนการใช้หลามปกติmultiprocessing.Queueการขนส่งระหว่างขั้นตอนการสมัครและขั้นตอนการเข้าสู่ระบบของคุณใช้ของคุณเองQueueระดับทดแทนการใช้ ZeroMQ Queueกับการพิมพ์เป็ดจะมีชั้นเรียนของคุณจะเป็นแบบเลื่อนแทนมาตรฐานหลาม ด้วยวิธีนี้แอปพลิเคชันของคุณจะสามารถทำงานไม่เปลี่ยนแปลงในสภาพแวดล้อมใด ๆ จากคอมพิวเตอร์แบบมัลติคอร์เดียวผ่านศูนย์ข้อมูลแบบกระจาย

ในการสรุปให้ใช้ตัวบันทึก Python มาตรฐานกับQueueHandlerพนักงานลูกค้าและโบรกเกอร์ทั้งหมดของคุณและสร้างกระบวนการที่เป็นอิสระโดยยึดตามQueueListenerและloggingตัวจัดการPython ที่คุณเลือกเพื่อจัดการกับการยกการบันทึกที่หนักหน่วง


ฉันใช้ Python 2.7 ฉันเชื่อว่าคลาส QueueHandler พร้อมใช้งานจาก Python 3.2 เท่านั้น
Imraan

การรับรหัสจาก Python 3 นั้นง่ายมากและใช้งานโดยตรงเป็นส่วนหนึ่งของแอพของคุณ
โจนาธาน

ฉันจะลองและบอกให้คุณรู้ว่ามันใช้งานได้หรือไม่
Imraan

0

เหล่านี้เป็นวิธีที่แตกต่างกันอย่างสิ้นเชิงแต่ละคนมีข้อดีและข้อเสียของตัวเองซึ่งคุณจะเห็นปรากฎว่าในช่วงการพัฒนาในภายหลัง:

ฉันคิดสองวิธี: -

  1. สร้างคนงานที่มีไว้สำหรับการเข้าสู่ระบบและใช้การขนส่ง ZeroMQ IPC เท่านั้น
  2. ใช้การประมวลผลหลายตัวพร้อมกับคิว

วิธีหนึ่งที่คุณสามารถลองได้คือให้ผู้ทำบันทึกการทำงานเพิ่มเติมดังเช่นในวิธีที่ 1 คุณสามารถให้พนักงานของคุณเข้าสู่คลัสเตอร์การบันทึก memcache และผู้ปฏิบัติงานบันทึกการทำงานจะตรวจสอบโหลดทรัพยากรปัจจุบันและเมื่อทำการโหลดพารามิเตอร์ทรัพยากรที่กำหนด ผู้ปฏิบัติงานบันทึกไปยังอุปกรณ์ที่ จำกัด ของ IOPs (เช่นฮาร์ดดิสก์)

ฉันชอบแนวทางของโจนาธานกับข้อแม้ที่ฉันใช้ Python 2.x เป็นส่วนใหญ่และคุณอาจต้องตั้งค่าแบ็คเอนด์ของคุณเองเพื่อผลักดันซองจดหมายประสิทธิภาพ

แก้ไขให้ถูกต้องหากฉันผิด แต่สิ่งที่ฉันทำก็คือคุณกำลังทำงานที่ต้องใช้ข้อมูลจำนวนมากโดยที่ IOP ของที่เก็บข้อมูลเป็นคอขวดของคุณ

วิธีที่สะดวกยังคงเป็นการอนุญาตให้นายหน้าทำการbrokerageบันทึก - ในแบบฟอร์มตามที่อธิบาย - พร้อมกับข้อเสียทั้งหมดของอินสแตนซ์โบรกเกอร์กลาง ตัวอย่างเช่นหากนายหน้าอยู่ในความต้องการสูงเช่นนี้ที่ไม่เคยมีห้องหายใจให้เขียนบันทึก memcached กลับไปที่การจัดเก็บคุณจะต้องใช้วิธีการอื่น

ในที่สุดคุณอาจท้ายด้วยโมเดลนายหน้า นั่นคือกับคนงานที่จัดการงานของพวกเขากันเอง ในตัวอย่างง่ายๆผ่านอัลกอริธึมการกระจายแบบวนรอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.