ข้ามไปยังเนื้อหา

บล็อก

การบล็อก Rust Async, Rayon และแอปพลิเคชันสมัยใหม่

“การบล็อก” หมายถึงอะไรใน async Rust เมื่อ Rayon เหมาะกับงานที่เกี่ยวข้องกับ CPU และเหตุใด Rust จึงยังคงแข็งแกร่งสำหรับ APIs, Edge, Agent และแพลตฟอร์ม CI/CD

  • Balinder Walia
  • อ่าน 1 นาที
  • Updated

TenthMatrixกล่าวถึงสาเหตุที่ Rust ยังคงเป็นตัวเลือกระดับเฟิร์สคลาสสำหรับแอปพลิเคชันสมัยใหม่ และความหมายของ "การบล็อก" จริงๆ เมื่อคุณผสม Tokio เข้ากับงานหนัก CPU แรงบันดาลใจจากAsync ของ Alice Ryhl: อะไรคือการบล็อก?(ส่วน Rayon) เจาะลึก: บทความยาว

Rust async blocking and Rayon for modern applications

สิ่งสำคัญที่สุดใน async Rust “การบล็อก” หมายความว่าให้รันไทม์เวิร์กเวอร์อยู่ห่างจาก.awaitนานพอที่จะทำให้งานอื่นๆ หยุดทำงาน ย้ายงาน CPU ที่มีราคาแพงออกจากพูลของ Tokio ซึ่งมักจะใช้Rayonบวกกับช่อง oneshot และรักษาเส้นทางอะซิงก์ที่ตอบสนองต่อ API, Edge Proxies, เอเจนต์ และ Control Plane CI/CD

เหตุใด Rust จึงชนะสล็อตแอปพลิเคชั่นสมัยใหม่

ทีม

เลือก Rust เมื่อพวกเขาต้องการความปลอดภัยของหน่วยความจำโดยไม่ต้องเสียภาษี GC หยุดชั่วคราว เวลาแฝงที่คาดการณ์ได้ภายใต้ภาระงาน และความสอดคล้องที่ระบบประเภทช่วยให้คุณทำงานได้อย่างถูกต้อง การรวมกันนั้นจะแสดงทุกที่ที่ TenthMatrix บิวด์: API ที่มีปริมาณงานสูง, Edge Gateway, รันไทม์ของตัวแทน และส่วนควบคุมการเลื่อนระดับที่ไม่สามารถหยุดทำงานเมื่อมีงาน CPU พุ่งสูงขึ้น

ไม่ใช่ “Rust สำหรับทุกสิ่ง” แดชบอร์ดPolyglot Benchmarksของเราและโพสต์ร่วม - บล็อกบทความ/- เปรียบเทียบ Rust กับสแต็ค Go, Bun, JVM และขอบการเขียนสคริปต์บนปริมาณงาน HTTP เดียวกัน Rust มักจะนำไปสู่แถวที่ผูกกับ CPU และแถวที่มีการทำงานพร้อมกันจำนวนมาก รันไทม์อื่นๆ จะชนะตามความเร็วหรือการแปลงขอบ ประเด็นคือหลักฐาน แล้วก็ ADR

“การบล็อก” หมายถึงอะไรใน async Rust

Async runtimes (Tokio และเพื่อนๆ) สลับงานที่จุด.awaitหากงานของคุณเปลือง CPU ในระดับมิลลิวินาทีหรืออยู่ในโหมดสลีปด้วยstd::thread::sleepโดยไม่รอ ผู้ปฏิบัติงานจะไม่สามารถจัดกำหนดการบุคคลอื่นบนเธรดนั้นได้ ภายในเครื่องคุณอาจไม่สังเกตเห็น (มีคอร์บางตัวซ่อนจุดบกพร่อง) ในการผลิต คุณจะไม่มีพนักงานเหลืออยู่และส่วนแฝงของความล่าช้าจะระเบิด

หลักง่ายๆ จากระบบนิเวศ: อยู่ภายในช่วงสิบถึงหลายร้อยไมโครวินาทีระหว่างการรอคอยบริการที่มีความอ่อนไหวต่อความหน่วง — และปฏิบัติต่อสิ่งใดก็ตามอีกต่อไปเสมือนเป็นงานที่เป็นของที่อื่น

เมื่อ Rayon ช่วย (ผูกกับ CPU)

  • spawn_blocking— การบล็อกพูลของ Tokio: เหมาะสำหรับการซิงค์ IO (ระบบไฟล์ การบล็อกไดรเวอร์ DB); ไม่เหมาะสมสำหรับ CPU ที่มีน้ำหนักมากเนื่องจากสามารถสมัครสมาชิกคอร์มากเกินไปได้
  • Rayon— เธรดพูลขนาดเล็กขนาด CPU สำหรับตัววนซ้ำแบบขนานและการคำนวณราคาแพง บริดจ์ด้วยrayon::spawn+tokio::sync::oneshotดังนั้นงาน async รอผลลัพธ์โดยไม่บล็อกเธรดรันไทม์
  • เธรดเฉพาะ— สำหรับการวนซ้ำตลอดไป (ตัวจัดการการเชื่อมต่อ ผู้ปฏิบัติงานที่มีอายุการใช้งานยาวนาน) ที่ต้องไม่ใช้ความจุพูลอย่างถาวร

รูปแบบ Rayon + oneshot นั้นเป็นสิ่งที่ Alice Ryhl ดำเนินการในส่วนRayon- การดำเนินการของ TenthMatrix คือวิธีที่ตัวเลือกเหล่านั้นลงจอดในตัวแทนจัดส่งและแพลตฟอร์มของ Polyglot Estate ไม่ใช่การพิมพ์ซ้ำของบทช่วยสอน

โดยที่สิ่งนี้ปรากฏในผลิตภัณฑ์ TenthMatrix

  • APIs และ edge— ให้คำขอของผู้ปฏิบัติงานฟรีสำหรับ IO; พัดลม CPU แปลงเป็น Rayon เมื่อเส้นทางลัดต้องการ
  • Agent— การฝังการเตรียมการ การประเมินแบทช์ และการดำเนินการด้านเครื่องมือไม่ควรทำให้ลูปการประสานหยุดชะงัก
  • CI/CD แพลตฟอร์ม— การตรวจสุขภาพและกลไกการส่งเสริมการขาย (ดูRing Promoter) ยังคงตอบสนองในขณะที่งานตรวจสอบที่หนักกว่าดำเนินไปนอกระบบ
  • Kubernetes ดำเนินการ— โปรแกรมควบคุมเหตุการณ์ เช่นKubePilotจำเป็นต้องมีลูปควบคุมที่รวดเร็ว แม้ว่าการวิเคราะห์จะหนัก CPU ก็ตาม

อ่าน

ถัดไป
  1. บทความขนาดยาว— เอกสารสรุป รูปแบบโค้ด และบันทึกสถาปัตยกรรม
  2. polyglot-benchmarks.fictionally.org— Rust แบบสดเทียบกับหลักฐานอื่นๆ
  3. Alice Ryhl —Async: การบล็อกคืออะไร?

เผยแพร่โดยTenthMatrix.