rekuiper: เอนจินประมวลผลสตรีม Rust บน Edge
rekuiper เอนจินประมวลผลสตรีมเขียนด้วย Rust ใช้แรมเพียง 5-10 MB จัดการข้อความ MQTT 1 แสนข้อความต่อวินาทีบนฮาร์ดแวร์จำกัด

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- rekuiper ควบคุมหน่วยความจำให้คงที่ระหว่าง 5-10 MB ภายใต้ภาระงานหนัก
- ประมวลผลข้อมูล MQTT ได้สูงถึง 100,000 ข้อความต่อวินาทีบนซีพียูเพียง 1 คอร์
- สถาปัตยกรรมจัดการหน่วยความจำอิงตามจำนวนอุปกรณ์ ไม่ใช่จำนวนข้อความ
- รองรับ REST API และไวยากรณ์ SQL ของ LF Edge eKuiper ทั้งหมด
การวัดประสิทธิภาพงานประมวลผลสตรีมส่วนใหญ่มักมุ่งเน้นไปที่ตัวเลขเพียงชุดเดียว นั่นคือปริมาณงานสูงสุดบนเซิร์ฟเวอร์ขนาดใหญ่ แต่ตัวเลขดังกล่าวแทบไม่มีประโยชน์สำหรับอุปกรณ์ที่เอนจินเหล่านี้ต้องทำงานจริง เช่น เกตเตรย์อุตสาหกรรม ฮับ ESPHead หน่วยหัวรถยนต์ หรือเครื่องชาร์จรถยนต์ไฟฟ้า ซึ่งมักมีซีพียูเพียงหนึ่งหรือสองคอร์และหน่วยความจำฟรีเพียงไม่กี่ร้อยเมกะไบต์ ขณะที่ข้อมูลขาเข้ามุ่งหน้าผ่าน MQTT และมักจะมาแบบกระชากอย่างรุนแรงเมื่อยานพาหนะหรืออุปกรณ์จำนวนมากเชื่อมต่อกลับเข้ามาพร้อมกันหลังเกิดเหตุขัดข้อง
ในสภาพแวดล้อมเช่นนี้ มีคำถามสำคัญสองข้อที่เป็นตัวกำหนดความอยู่รอดของไปป์ไลน์ข้อมูล ซึ่งไม่ใช่ปริมาณงานสูงสุดอย่างแน่นอน ทีมงานจึงได้พัฒนาเอนจินสตรีมชื่อว่า rekuiper ขึ้นมาเพื่อตอบโจทย์ทั้งสองข้อ และสร้างเกณฑ์มาตรฐานที่ตรงไปตรงมาเพื่อตรวจสอบความสำเร็จ โดยบทความนี้พูดถึงเกณฑ์มาตรฐานพอๆ กับตัวเอนจินเอง เนื่องจากมันช่วยเปิดเผยข้อผิดพลาดในการทำงานที่การทดสอบวัดแต่ความเร็วมักจะมองข้ามไป
ผลลัพธ์สำคัญคือจากการทดสอบเวิร์กโหลด MQTT ห้าแบบจำลองการใช้งานจริง rekuiper สามารถผลิตผลลัพธ์ที่ถูกต้องและครบถ้วนที่ 100,000 ข้อความต่อวินาทีบนซีพียู 1 คอร์ในทุกเวิร์กโหลดโดยไม่พบขีดจำกัดสูงสุด แต่ผลลัพธ์ที่น่าสนใจยิ่งกว่าคือในเวิร์กโหลดแบบมีหน้าต่างเวลา (windowed workloads) หน่วยความจำของ rekuiper คงที่อยู่ระหว่าง 5 ถึง 10 เมกะไบต์ ในขณะที่เอนจินภาษา Go พุ่งสูงถึงครึ่งกิกะไบต์จนถึงหนึ่งกิกะไบต์ หรือไม่ก็ล้มเหลวไปเลย ช่องว่างดังกล่าวเกิดจากการออกแบบ ไม่ใช่ภาษาที่ใช้เขียน

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
rekuiper เป็นเอนจินประมวลผลสตรีมที่พัฒนาด้วยภาษา Rust โดยจำลองการทำงานพื้นผิวของ LF Edge eKuiper ทั้ง REST API, ไวยากรณ์ SQL, นิยามสตรีมและกฎ รวมถึงอินเทอร์เฟซบรรทัดคำสั่ง kuiper เป้าหมายคือการใช้งานร่วมกันได้โดยไม่ต้องเขียนโค้ดใหม่ทั้งหมด ผู้ใช้ที่คุ้นเคยกับ eKuiper อยู่แล้วจะสามารถใช้งาน rekuiper ได้ทันทีผ่าน API 98 เส้นทางและ 140 การทำงานที่ตรวจสอบเทียบกับ OpenAPI ของ eKuiper
การที่ rekuiper เลือกใช้ภาษา Rust ควบคู่กับการออกแบบสถาปัตยกรรมแบบ bounded memory ถือเป็นก้าวสำคัญในการแก้ปัญหาคอขวดของ Edge Computing เนื่องจากอุปกรณ์ IoT มักมีข้อจำกัดด้านฮาร์ดแวร์ การควบคุมการใช้แรมไม่ให้รั่วไหลหรือขยายตัวตามปริมาณข้อความแบบสุ่ม จึงช่วยป้องกันระบบล่มจากการขาดแคลนหน่วยความจำได้อย่างมีประสิทธิภาพ
ความแตกต่างที่สำคัญซ่อนอยู่เบื้องล่างภายใต้หลักการหน่วยความจำต้องจำกัดภายใต้โหลดหนัก การออกแบบหลักสามประการประกอบด้วย:
- ระบบสตรีมบัสภายในกระบวนการที่มีคิวจำกัดต่อผู้สมัครรับข้อมูลรายละ 4,096 รายการ
- แหล่งข้อมูล MQTT ใช้ไคลเอ็นต์ rumqttc รวบรวมข้อมูลเป็นชุดสูงสุด 1,024 รายการเพื่อลดต้นทุนการปลุกสตรีม
- ตัวประเมินผลแบบเพิ่มส่วน (incremental evaluator) ที่คำนวณหน้าต่างเวลาโดยอิงตามจำนวนอุปกรณ์แทนที่จะเก็บบันทึกทุกแถว
"หน่วยความจำของ rekuiper คงที่ระหว่าง 5 ถึง 10 MB ในขณะที่เอนจินภาษา Go พุ่งสูงถึงครึ่งกิกะไบต์ถึงหนึ่งกิกะไบต์หรือล้มเหลว"
ทีมพัฒนา rekuiper
สำหรับการจัดการกรณีลิงก์สัญญาณขาดหายเปรียบเสมือนรถยนต์ที่วิ่งเข้าอุโมงค์หรือพื้นที่ห่างไกล ตัวซิงก์สามารถเปิดใช้งานแคชตามตัวเลือกของ eKuiper ได้ โดยบันทึกที่ไม่สามารถส่งได้สำเร็จจะถูกเข้าคิวในหน่วยความจำจนถึงขีดจำกัด ก่อนจะย้ายไปบันทึกยังดิสก์เพจ เพื่อป้องกันข้อมูลสูญหายอย่างเงียบๆ
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น