GitHub เล่าประสบการณ์ทำระบบค้นหาโค้ด รัน Regular Expression กับโค้ดขนาด 115TB เขียนด้วย Rust

by lew
7 February 2023 - 12:20

GitHub เล่าถึงประสบการณ์การพัฒนาระบบค้นหาโค้ดแบบใหม่ชื่อว่า Blackbird ที่ทำให้นักพัฒนาสามารถค้นหาโค้ดด้วยคำสั่งที่ซับซ้อนแบบ regular expression กับโค้ดทั้งหมดในฐานข้อมูลของ GitHub ที่มีขนาดถึง 115TB ได้

GitHub เคยใช้ Elasticsearch สำหรับการค้นหามาก่อน และการทำดัชนี (indexing) ข้อมูลโค้ด 8 ล้านโครงการใช้เวลานานหลายเดือน ทุกวันนี้โค้ดรวมบน GitHub มีทั้งหมด 200 ล้านโครงการ ขนาดโค้ดรวม 115TB หากรัน ripgrep บนโค้ดทั้งหมดจะใช้ซีพียู 2,048 คอร์เป็นเวลา 96 วินาที ทำให้ต้องเขียนเอนจินค้นหาขึ้นมาใหม่เองโดยใช้ภาษา Rust

Blackbird เก็บข้อมูลแบบ inverted index (หาว่ามีข้อความที่กำหนดในเอกสารใดบ้าง) โดยเก็บเป็นส่วนย่อยของคำ (ngram) ขนาด 3 ตัวอักษร และการเพิ่มเอกสารจะเก็บดัชนีแยกเป็นส่วนๆ (sharding) โดยแจ้งความเปลี่ยนแปลงข้อมูลด้วย Kafka เมื่อผู้ใช้ส่งคำสั่งค้น Blackbird จะแปลงคำสั่งเป็นภาษาค้นหาเฉพาะกำหนดเงื่อนไข เช่น จะค้นหาใน repository ที่ไม่ได้เปิด public ส่วนใดบ้างและแปลงคำค้นจาก regular expression ไปเป็นคำสั่งเฉพาะที่หาจาก ngram

ตอนนี้ 99% แรกของคำค้นรันในแต่ละ shard โดยใช้เวลาระดับ 100ms โดยรวมเซิร์ฟเวอร์ 64 คอร์แต่ละเครื่องรองรับการคิวรีได้ 640 คิวรีต่อวินาที

ตอนนี้ระบบค้นหาแบบใหม่ของ GitHub ยังอยู่ในสถานะเบต้า และต้องสมัครก่อนใช้งาน

ที่มา - GitHub

Blognone Jobs Premium