เนื้อหาในเว็บไซต์นี้ได้รับการแปลโดยใช้ปัญญาประดิษฐ์ (AI) หรือเทคโนโลยีการแปลด้วยเครื่อง และอาจมีข้อผิดพลาด

Skip to content

Roblox ใช้ Theta Sketches อย่างไรในการขยายการวิเคราะห์ผู้สร้าง

SEO image for Roblox Appoints Naveen Chopra as Chief Financial Officer

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

การสร้างระบบวิเคราะห์ข้อมูลที่ทันสมัยซึ่งผู้สร้าง Roblox หลายล้านคนพึ่งพาอยู่นั้นเป็นความท้าทายที่สำคัญ เพื่อรับมือกับสิ่งนี้ เราได้ปรับปรุงประสิทธิภาพของเครื่องมือค้นหาข้อมูลเชิงวิเคราะห์ของเราให้สามารถรองรับคลัสเตอร์การประมวลผลที่มี 120 คอร์ เพื่อให้บริการมากกว่า 6 ล้านคำค้นหาต่อวัน จากผู้เข้าชมประมาณ 300,000 คนต่อวัน ที่เข้าถึงข้อมูล 86 TB หัวใจสำคัญของโซลูชันของเราคือฐานข้อมูลการประมวลผลเชิงวิเคราะห์ออนไลน์ (OLAP) ที่เราเลือกใช้เนื่องจากความสามารถในการขยายตัวและการผสานรวมกับอัลกอริธึมการประมาณค่า ด้วยการใช้เทคนิคการรวมข้อมูลหลายรูปแบบร่วมกับอัลกอริธึม HyperLogLog และ Theta Sketch เราจึงสามารถให้บริการวิเคราะห์ข้อมูลสำหรับประสบการณ์บน Roblox ได้หลายล้านรายการ1 

คู่มือเบื้องต้นเกี่ยวกับการวิเคราะห์ข้อมูลแบบ OLAP

ยิ่งมีการค้นหาข้อมูลมากเท่าใด ก็ยิ่งใช้เวลานานขึ้นในการสร้างผลลัพธ์ เมื่อเราสามารถลดปริมาณข้อมูลที่จำเป็นและเร่งกระบวนการวิเคราะห์ได้ ผู้สร้างจะสามารถได้รับข้อมูลเชิงลึกที่ใกล้เคียงกับเวลาจริงจากการกระทำของพวกเขา เทคนิคบางส่วนที่เราใช้ ได้แก่:

  1. การจัดเก็บข้อมูลแบบคอลัมน์: OLAP, Druid, อ่านเฉพาะคอลัมน์ที่จำเป็นเท่านั้น
  2. ตัวกรองการแบ่งส่วนและการจัดเรียง: OLAP จะอ่านเฉพาะไฟล์ที่เกี่ยวข้องซึ่งมีการจัดทำดัชนีโดยตรงไปยังบล็อกข้อมูลที่จำเป็นเท่านั้น
  3. สรุป: OLAP จะรวบรวมเหตุการณ์บางส่วนโดยใช้การจัดกลุ่มที่เหมือนกัน

Rollups โดยเฉพาะอย่างยิ่ง ช่วยให้ OLAP สามารถทำงานระหว่างเครื่องมือค้นหา SQL ที่ใหญ่ที่สุด เช่น Spark หรือ Presto (ที่มีความหน่วงเวลาเป็นสิบวินาที) และการค้นหาแบบจุดหรือ SQL ที่จำกัด ซึ่งโดยปกติจะให้บริการข้อมูลที่ถูกรวมทั้งหมดแล้ว ด้วย rollups การค้นหาจะกลายเป็นแบบกำหนดโดยกลุ่มของมิติ ส่งผลให้การลดจำนวนแถวทั้งหมดลดลงอย่างมาก เมื่อพิจารณาเหตุการณ์ดิบจำนวนหลายพันล้านหรือแม้กระทั่งหลายล้านล้านเหตุการณ์ การรวบรวมเหตุการณ์เหล่านี้เป็นกลุ่มๆ หลายล้านกลุ่มที่สามารถรวมกันได้ด้วยความล่าช้าน้อยกว่าหนึ่งวินาทีนั้นจะมีประสิทธิภาพมากกว่ามาก ตัวอย่างเช่น: 

ในขณะที่ rollups มอบข้อได้เปรียบด้านการลดขนาดตามที่กล่าวไว้ข้างต้น แต่ก็มีตัวชี้วัดบางประเภทที่ไม่สามารถลดได้ เช่น การค้นหาที่ต้องการการจัดเรียงข้อมูลดิบทั้งหมด เช่น การนับจำนวนที่ไม่ซ้ำกัน การหาเปอร์เซ็นไทล์ และการค้นหาความถี่

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

การวิเคราะห์ภาระงานของ Roblox

ที่ Roblox เราให้ผู้สร้างมีแดชบอร์ดกลางที่พวกเขาสามารถค้นหาข้อมูลเชิงลึกที่สำคัญที่สุดได้ ซึ่งรวมถึง: 

  • การมีส่วนร่วม: ผู้ใช้งานรายวัน (DAU), ผู้ใช้งานรายเดือน (MAU), การรักษาผู้ใช้, และช่องทาง 
  • การสร้างรายได้: รายได้, รายได้เฉลี่ยต่อผู้ใช้, ยอดขาย, และเศรษฐกิจ
  • ข้อมูลการได้มา 
  • การปรับแต่งภาพขนาดย่อและผลลัพธ์การทดลอง
  • หน้าแรก การวิเคราะห์คำแนะนำ
  • และยังมีอีกมากมายที่จะตามมา 
เมื่อเราสร้างระบบของเรา เราให้ความสำคัญกับการเพิ่มประสิทธิภาพการค้นหาในกรณีที่แย่ที่สุด ซึ่งโดยทั่วไปแล้วจะเป็นการนับจำนวนที่แตกต่างกันขนาดใหญ่ (>100 ล้าน UUID) เช่น MAU สำหรับประสบการณ์ยอดนิยม ซึ่งอาจทำให้เวลาในการโหลดช้าลงจากไม่กี่วินาทีเป็นหลายนาที เราได้สร้างกรอบการประมาณเชิงสถิติเพื่อรักษาการสืบค้นให้อยู่ในความล่าช้าไม่เกินสองวินาที เราได้ปรับใช้เทคนิค HyperLogLog และ Theta Sketch จากไลบรารีมาตรฐานอุตสาหกรรม ซึ่งช่วยลดการสืบค้นกรณีที่เลวร้ายที่สุดจากการอ่านมากกว่า 100 ล้านแถวเหลือประมาณ 5 ล้านแถว
การเลือกและปรับแต่งเครื่องมือค้นหาข้อมูล
หลังจากที่เราได้เลือกโซลูชัน OLAP ของเราแล้ว เราได้โหลดข้อมูลการมีส่วนร่วมเป็นระยะเวลาหกเดือน และทดสอบประสิทธิภาพของระบบภายใต้สภาวะกดดันสูงสุด ด้วยจำนวนคอร์ประมาณ 100 คอร์และหน่วยความจำ 500 GB เราพบว่าเราสามารถรวมวัตถุ Theta Sketch แบบไบนารีจำนวน 5 ล้านชิ้น (รวมประมาณ 100 MB) แบบสุ่มได้ภายในสองวินาที การทดสอบนี้ทำบนการค้นหาแบบ cold-start ที่อ่านข้อมูลจากดิสก์โดยไม่เข้าถึงแคชในหน่วยความจำเลย ตัวเลือกการจัดเก็บข้อมูลแบบเครือข่าย เช่น การอ่านจาก S3 ซึ่ง Clickhouse และ Duckdb มีให้โดยค่าเริ่มต้น แสดงประสิทธิภาพที่แย่กว่ามาก 
การเอาชนะความท้าทายด้านประสิทธิภาพ

ในรอบสุดท้ายของการทดสอบเงาการผลิต เราพบความท้าทายที่สำคัญ: ประสิทธิภาพการค้นหา MAU ของเราจำเป็นต้องได้รับการเสริมหลังจากเปลี่ยนจากการค้นหาขนาดใหญ่เพียงครั้งเดียวเป็นรูปแบบการรวมข้อมูลรายวัน สิ่งเหล่านี้มีความสำคัญอย่างยิ่งสำหรับการแสดงผลข้อมูลการวิเคราะห์ผู้สร้างของเรา 

เราพบว่าโครงสร้างของคำค้นหาส่งผลกระทบอย่างมากต่อประสิทธิภาพพื้นฐานของโซลูชัน OLAP ของเรา คำค้นหาแบบมาตรฐานที่มีหลายขั้นตอนในการประมวลผล (เช่น คำสั่ง "GROUP BY" ที่ซ้อนกัน) มักจะผลักงานจำนวนมากไปยังโหนดตัวกลางที่มีน้ำหนักเบา 

นี่คือปัญหาบิ๊กดาต้าแบบคลาสสิกที่บางส่วนของคำสั่งค้นหาถูกนำไปประมวลผลบนโหนดให้บริการขนาดเล็กที่มีความสำคัญ เราคาดหวังว่าโครงสร้างข้อมูลแบบประมาณการของเราจะทำงานเหมือนการนับหรือการรวมค่าอย่างง่าย แต่เราพบว่ามันมีพฤติกรรมที่แตกต่างออกไปอย่างมาก 

รูปด้านล่างแสดงปัญหาที่เกิดขึ้น โดยแสดงให้เห็นว่าโหนดในอดีตของเราจะทำการรวมข้อมูลบางส่วนอย่างไร โดยจะรวบรวม Theta Sketch สำหรับแต่ละวันแล้วส่งข้อมูลกลับไปยังโบรกเกอร์ จากนั้นโบรกเกอร์จะพยายามรวม Sketch รายวันขนาดใหญ่แต่ละรายการให้เป็นค่ารายเดือนเพียงค่าเดียวต่อวัน สำหรับ 30 วันของ MAU นี่หมายถึงการรวม Theta Sketches ขนาดสูงสุด 1,800 รายการบนตัวกลาง ซึ่งส่งผลให้การค้นหาช้าลง มีแนวโน้มล้มเหลว และทำให้ CPU ของตัวกลางทำงานหนักเกินไป 

วิธีแก้ปัญหาของเราคือการใช้ OLAP ด้วยจำนวนผู้ทำงานขนาดใหญ่ในอดีตที่น้อยลง เพื่อเพิ่มประสิทธิภาพการเก็บข้อมูลในหน่วยความจำสำหรับแหล่งข้อมูลที่ต้องใช้การค้นหาแบบประมาณค่า ในทางปฏิบัติ วิธีนี้ทำให้การรวมข้อมูลซึ่งอาจต้องใช้ข้อมูลมากกว่า 100 MB กลับมาดำเนินการที่โหนดเก็บข้อมูลในอดีตของเรา

เพื่อให้บรรลุเป้าหมายนี้ใน SQL เราใช้การเชื่อมโยงแบบอินไลน์ (inline join) เพื่อให้การค้นหาข้อมูลสามารถส่งต่อข้อมูลที่จำเป็นไปยังโหนดประวัติศาสตร์ได้ และเตรียมการค้นหาข้อมูลพร้อมรายการวันที่ของผลลัพธ์แบบอินไลน์ไว้ วันที่ของผลลัพธ์แต่ละวันสามารถรวบรวมข้อมูลที่เกี่ยวข้องได้จากส่วนของโหนดประวัติศาสตร์ จากนั้นข้อมูลจะถูกส่งกลับไปยังโบรกเกอร์ ซึ่งผลลัพธ์จะถูกผสานรวมอย่างรวดเร็วเป็นแผนที่เดียวของวันที่ของผลลัพธ์กับข้อมูลเมตริก ตามที่เห็นด้านล่าง

การปรับปรุงประสิทธิภาพครั้งนี้มีผลกระทบอย่างมากต่อประสิทธิภาพของคำค้นหาขนาดใหญ่ สำหรับการแยกประเภทผู้ใช้รายเดือน (MAU) ตามประเทศของประสบการณ์หลัก ประสิทธิภาพเฉลี่ยของคำค้นหาดีขึ้นถึง 5 เท่า (จาก 17.53 วินาที เป็น 3.23 วินาที) ตามที่แสดงในแผนภูมิด้านล่าง นอกจากนี้ เรายังสังเกตเห็นการลดเวลาการใช้ CPU บนบрокเกอร์ลงถึง 50 เท่า (จาก 16.83 วินาที เหลือ 0.34 วินาที) 

แม้ว่าผลลัพธ์จะแตกต่างกันไป แต่สิ่งนี้เน้นย้ำถึงความสำคัญของการจัดการกับกระบวนการที่ซับซ้อน (เช่น การรวมภาพร่างหลายล้านภาพ) ด้วยความระมัดระวัง การสมมติว่ากระบวนการเหล่านี้เทียบเท่ากับการรวมข้อมูลแบบง่ายอาจนำไปสู่ปัญหาด้านประสิทธิภาพที่สำคัญ โดยเฉพาะในระบบที่มีการรวมข้อมูลจากฝั่งไคลเอนต์ในขั้นตอนสุดท้ายบ่อยครั้ง

โรลอัพและลูกบาศก์ธีโอเรียทเธต้า

การค้นหาข้อมูลเชิงลึกเฉลี่ยบนแพลตฟอร์มของเรา มีการแยกข้อมูลน้อยมาก และแทบไม่แตะมิติข้อมูลที่มีความหลากหลายสูง (เช่น ประเทศ) ด้วยเหตุนี้ เราจึงตัดสินใจคัดลอกข้อมูลของเรา สร้างตารางรวมที่มีมิติข้อมูลน้อยลง ซึ่งเพียงพอสำหรับการค้นหาข้อมูลมากกว่า 98% ของการค้นหาทั้งหมดของเรา ตารางนี้มีประสิทธิภาพดีขึ้นถึงสี่เท่าเมื่อเทียบกับการค้นหาข้อมูลเฉลี่ย

เรายังได้สำรวจ theta cube หรือแนวทางทั่วไปเพื่อเชื่อมช่องว่างระหว่างตาราง rollup พื้นฐานกับตารางดิบอย่างสมบูรณ์ผ่านการตัดเซตประมาณค่า วิธีนี้แก้ไขข้อจำกัดพื้นฐาน: ตาราง rollup สูญเสียข้อได้เปรียบเมื่อการค้นหาต้องเข้าถึงหลายชั้นของมิติที่มีคาร์ดินัลสูง นั่นเป็นเพราะแต่ละมิติทำให้คาร์ดินัลของ rollup ขยายตัวเป็น ∏dim (ผลคูณของมิติ)

เราออกแบบระบบที่จะรวบรวมข้อมูลตามกลุ่มมิติที่มีลักษณะร่วมกัน โดยมีการจำกัดจำนวนสูงสุด (cardinality cap) ซึ่งช่วยให้สามารถทำการค้นหาแบบรวมยอด (rollup) สำหรับข้อมูลใดๆ ในกลุ่มนั้นได้ จากนั้น เมื่อต้องการค้นหาการรวมกันของมิติจากหลายกลุ่ม เราจะพยายามทำการเชื่อมโยงแบบประมาณการ (approximate join4) ระหว่างชุดข้อมูล และส่งคืนผลลัพธ์ของเมตริกพร้อมกับการประมาณค่าความผิดพลาด การค้นหาที่มีค่าประมาณความผิดพลาดสูงจะถูกส่งต่อไปยังตารางดิบ (raw table) ซึ่งตัวกรองจำนวนมากควรช่วยให้เกิดการปรับปรุงประสิทธิภาพแบบ pushdown ได้มาก

วิธีการแบบลูกบาศก์ธีตา (Theta cube) นี้สลับมิติ ส่งผลให้เกิดการขยาย ∑dim (ผลรวมของมิติ) สำหรับจำนวนแถวแทนการขยาย ∏dim แน่นอนว่าสิ่งนี้อาจแลกมาด้วยความแม่นยำ ซึ่งเป็นพลวัตที่แปรผันตรงกับขนาดการทับซ้อนกัน5 ระหว่างกลุ่มมิติทั้งสอง เหตุผลพื้นฐานเกี่ยวข้องโดยตรงกับวิธีที่ Theta Sketches จัดเก็บรายการที่เรียงลำดับแบบ K-style จากด้านล่าง ซึ่งจะเพิ่มการชนกันให้สูงสุดระหว่างสองชุดที่มีการทับซ้อนกันโดยธรรมชาติสูง

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

สำหรับ Roblox, โซลูชันนี้จะเหมาะกับการนำไปใช้ในระดับต่อไปของเรา—อาจเหมาะสำหรับการวิเคราะห์แบบไดนามิกของฟันเนลหรือเหตุการณ์ที่กำหนดเอง—ในขณะที่แบบจำลองแบบรวมแบบง่ายในปัจจุบันของเราสามารถตอบสนองความต้องการในปัจจุบันได้

การสร้างแพลตฟอร์มบริการตนเอง

เมื่อเราปรับแต่งตัวกลางของเราให้เหมาะสมแล้ว เราจึงหันมาสร้างเครื่องมือสำหรับการนำเข้าข้อมูลและการสืบค้นชุดข้อมูลที่เพิ่มเข้าไปในโซลูชัน OLAP ของเรา เราได้สร้างไลบรารี UDAF สำหรับ Spark และ Trino แบบโอเพนซอร์สสำหรับฟังก์ชัน datasketch ของเรา ทำให้ Spark สามารถใช้รูปแบบข้อมูล datasketch แบบไบนารีเดียวกันกับ OLAP6 ของเรา สิ่งนี้ช่วยให้ภาระงานประมวลผลส่วนใหญ่ยังคงอยู่ใน Spark และช่วยมาตรฐานการประมาณค่าให้สอดคล้องกันทั่วทั้ง Roblox ซึ่งอาจช่วยลดค่าใช้จ่ายในการประมวลผลได้สูงสุดถึง 80% สำหรับชุดข้อมูลบางประเภท

เราได้ทำให้กระบวนการเริ่มต้นใช้งานง่ายขึ้นด้วยการขยายส่วนขยายภายในสำหรับตัวจัดตารางงานแบบแบทช์ของเรา และกำหนด API แบบ dataframe เพื่อช่วยแนะนำให้นักพัฒนาตัดสินใจเกี่ยวกับมาตรการและมิติที่ชัดเจน ลดผลกระทบจากคำถามที่ยังไม่ได้รับการแก้ไข นอกจากนี้ เรายังได้เปิดเผยตัวอย่างเวิร์กโฟลว์บางส่วนที่แสดงวิธีการโหลดและสอบถามข้อมูลนี้ในระบบ OLAP ของเราในรูปแบบโอเพนซอร์สอีกด้วย

ชุดข้อมูลวิเคราะห์ที่ได้รับการปรับให้เหมาะสมของเราตอนนี้ให้ข้อมูลเชิงลึกที่ลึกซึ้งแก่ผู้สร้างของเรา การปรับให้เหมาะสมของเราได้ปรับปรุงประสิทธิภาพเฉลี่ยขึ้น 4 เท่า และประสิทธิภาพในกรณีที่แย่ที่สุดขึ้น 50 เท่า แพลตฟอร์มบริการตนเองช่วยให้ทีม Creator Analytics ของเราสามารถปรับปรุงชุดข้อมูลใหม่สำหรับนักพัฒนาต่อไปได้ เรารู้สึกตื่นเต้นที่จะได้เห็นนักพัฒนาทุกขนาดใช้เครื่องมือเหล่านี้เพื่อสร้างประสบการณ์ที่น่าทึ่งบน Roblox

1 คำนวณจากจักรวาลที่ไม่ซ้ำกันในช่วง 60 วันที่ผ่านมาที่มีการเข้าถึงใด ๆ
2 เหมือนกับคำค้นหา
MAU แบบง่ายนี้ 3 ผลลัพธ์มาจากวันที่ 21-28 มีนาคม 2025
4 ดำเนินการดังนี้: SELECT c.experience_id, c.country, p.platform, THETA_INTERSECT(c.user_theta, p.user_theta) จาก (select experience_id, country, user_theta from theta_cube where agg_level = country) c union (select experience_id, platform, user_theta from theta_cube where agg_level = platform) p
5 https://datasketches.apache.org/docs/Theta/ThetaSketchSetOpsAccuracy.html
6 ผ่านฟังก์ชัน sql ของ druid COMPLEX_DECODE_BASE64('HLLSketch', sketch_col_name ).