พื้นหลัง
ฉันกำลังทำงานกับแอปพลิเคชัน 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
การสนับสนุนในดีเซล