ดีเซลควรถูกเรียกใช้โดยใช้ซิงค์นักแสดง, actix_web :: web :: block หรือ futures-cpupool?


10

พื้นหลัง

ฉันกำลังทำงานกับแอปพลิเคชัน actix-web โดยใช้ดีเซลผ่าน r2d2 และไม่แน่ใจว่าจะสร้างข้อความค้นหาแบบอะซิงโครนัสได้ดีที่สุดได้อย่างไร ฉันพบตัวเลือกสามตัวที่ดูเหมือนสมเหตุสมผล แต่ไม่แน่ใจว่าตัวเลือกใดดีที่สุด

โซลูชั่นที่เป็นไปได้

ซิงค์ดารา

สำหรับหนึ่งฉันสามารถใช้ตัวอย่าง actixแต่มันค่อนข้างซับซ้อนและต้องมีการสร้างแผ่นสำเร็จรูปสำเร็จรูปอย่างยุติธรรม ฉันหวังว่าจะมีทางออกที่สมเหตุสมผลมากกว่านี้

Actix_web::web::block

เป็นอีกตัวเลือกหนึ่งที่ฉันสามารถใช้actix_web::web::blockเพื่อตัดฟังก์ชันการสืบค้นของฉันในอนาคต แต่ฉันไม่แน่ใจเกี่ยวกับประสิทธิภาพของสิ่งนี้

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

หากฉันอ่านรหัสถูกต้อง r2d2 จะบล็อกเธรดเมื่อรับการเชื่อมต่อซึ่งจะบล็อกส่วนหนึ่งของคอร์แอกทีฟเว็บหลัก เช่นเดียวกับการสืบค้นฐานข้อมูล นี่จะบล็อก actix-web ทั้งหมดหรือไม่ถ้าฉันทำแบบสอบถามมากกว่าฉันมีเธรดในกลุ่มนั้น ถ้าเป็นเช่นนั้นปัญหาใหญ่

Futures-cpupool

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

เนื่องจากทั้ง r2d2 และดีเซลจะปิดกั้นมีสิ่งที่น่าประหลาดใจจำนวนมากในที่นี่

ที่สำคัญที่สุดอย่าแชร์ cpupool นี้กับสิ่งใด ๆ ที่ไม่ได้ใช้พูล r2d2 เดียวกัน (เนื่องจากเธรดทั้งหมดที่สร้างขึ้นอาจบล็อกรอการเชื่อมต่อ r2d2 ล็อคพูลทั้งหมดเมื่อมีงาน)

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

สุดท้ายให้คำนึงถึงฐานข้อมูลที่คุณใช้และประสิทธิภาพที่คุณมี ใช้การเชื่อมต่อเดียว r2d2 และเธรดเดียวในพูลอาจดีที่สุดในแอปพลิเคชันการเขียน sqlite ที่หนักหน่วงที่สุด

คำตอบเก่า ๆ

โซลูชันเก่าที่อาจใช้งานได้

https://www.reddit.com/r/rust/comments/axy0hp/patterns_to_scale_actixweb_and_diesel/

ในสาระสำคัญแนะนำ Futures-cpupool

อะไรคือวิธีที่ดีที่สุดในการปิดกั้นการปิดกั้น I / O ในอนาคตอาร์เอส?

แนะนำ Futures-cpupool สำหรับกรณีทั่วไป

โซลูชันเก่าที่ใช้ไม่ได้

https://www.reddit.com/r/rust/comments/9fe1ye/noob_here_can_we_talk_about_async_and_databases/

การแก้ไขที่ดีมากสำหรับเวอร์ชั่นเก่าของ actix-web จากสิ่งที่ฉันสามารถค้นหาการร้องขอไม่มี cpu-pool ในพวกเขาอีกต่อไป


จากความคิดเห็นในปัญหานี้ดูเหมือนว่าfutures-cpupoolเป็นวิธีแก้ไขปัญหาที่แนะนำสำหรับการขาดasyncการสนับสนุนในดีเซล
Jmb

นั่นเป็นวิธีแก้ปัญหาทั่วไปมากกว่า ฉันหวังว่าสิ่งที่จะใช้ประโยชน์จากระบบ actix ไม่น้อยไปกว่านี้ฉันจะขุดลงในฟิวเจอร์ส - cpupool ทันทีเพื่อค้นหาปัญหา
logina

ยินดีต้อนรับสู่ Stack Overflow! ดูเหมือนว่าคำถามของคุณอาจตอบโดยคำตอบของวิธีการที่ดีที่สุดในการปิดกั้นการปิดกั้น I / O ในอนาคต . ถ้าไม่ได้โปรดแก้ไขคำถามของคุณเพื่ออธิบายความแตกต่าง มิฉะนั้นเราสามารถทำเครื่องหมายคำถามนี้เป็นคำตอบแล้ว
Shepmaster

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

คำตอบ:


3

ฉันจะไปกับฟิวเจอร์ส -cpupool มันเป็นทางออกที่ดีที่สุดเนื่องจากการปิดกั้นการโต้ตอบของฉัน

การใช้ actix_web :: web :: block นั้นดีพอ แต่จะใช้เธรดพูลที่ใช้ร่วมกันใน actix (และเนื่องจากการบล็อกการโทรฉันใช้สิ่งนี้สามารถบล็อกเธรดพูลทั้งหมดและรบกวนงานอื่นที่กำหนดให้กับ actix_web)

จะเป็นการดีกว่าถ้าใช้ futures-cpupool เพื่อสร้าง threadpool แยกต่างหากต่อฐานข้อมูลสำหรับการโต้ตอบกับฐานข้อมูล วิธีนี้คุณจัดกลุ่มงานทั้งหมดที่ต้องรอซึ่งกันและกัน (เมื่อมีงานมากกว่าการเชื่อมต่อ) ลงในพูลเดียวป้องกันการบล็อกงานอื่น ๆ ที่ไม่ต้องการการเชื่อมต่อและอาจ จำกัด จำนวนเธรดไว้ที่ จำนวนการเชื่อมต่อ (เพื่อให้งานจะถูกกำหนดเวลาเฉพาะเมื่อมันจะไม่ถูกบล็อก)

ในกรณีที่คุณต้องการใช้การเชื่อมต่อฐานข้อมูลเพียงหนึ่ง (หรือน้อยมาก) นักแสดงการซิงค์เป็นตัวเลือกที่ดีทีเดียว มันจะทำหน้าที่เหมือนฟิวเจอร์ส - cpupool กับเธรดเดียวทำให้มั่นใจว่างานทั้งหมดจะถูกรันทีละครั้งยกเว้นว่าจะใช้เธรดพื้นฐานของ actix-web แทนที่จะเป็นเธรดที่แยกต่างหาก (ดีสำหรับการเชื่อมต่อเพียงเล็กน้อยเท่านั้น) . ฉันคิดว่าแผ่นหม้อน้ำขนาดใหญ่เกินกว่าจะคุ้มค่า


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