29 คะแนน โดย leelou2 2025-01-06 | 17 ความคิดเห็น | แชร์ทาง WhatsApp

หลังจากทำโปรเจกต์ URL Shortener แล้วปรับปรุง จากนั้นก็ทำใหม่แล้วปรับปรุงอีก... วนซ้ำแบบนี้ ในที่สุดก็ได้สร้างโปรเจกต์โอเพนซอร์ส v9 ฉบับสุดท้ายจริง ๆ เสียที

🚀 Github : https://github.com/lee-lou2/rust-url-shortener


ระหว่างเตรียมโปรเจกต์ ผมพยายามรักษาข้อกำหนดด้านล่างนี้ให้ได้อย่างเคร่งครัด

ข้อกำหนด

  1. ต้องสร้าง Short URL ได้เร็วมาก
  • ต้องไม่ช้าลงเพียงเพราะข้อมูลมีจำนวนมากขึ้น
  • ไม่ว่าจะขอใช้งานเมื่อไร ในสถานการณ์แบบไหน หรือใช้ข้อมูลใดในการร้องขอ ก็ต้องเร็วเสมอ
  1. ตอนเปลี่ยนเส้นทางจาก Short URL ไปยัง Original URL ก็ต้องเร็วเช่นกัน
  • จริง ๆ ข้อนี้ก็เป็นเรื่องที่ควรเป็นอยู่แล้ว... 😅
  1. ต้องมีฟีเจอร์เสริมที่ตอบโจทย์ผู้ใช้หลากหลายรูปแบบ
  • หากต้องการ ต้องสามารถเปลี่ยนเส้นทางไปยัง URL ที่ต่างกันตามแต่ละแพลตฟอร์มได้
  • หากต้องการ ผู้ใช้ต้องสามารถตรวจสอบข้อมูลการเข้าถึง URL ที่ตนสร้างขึ้นได้

เพื่อให้ตอบโจทย์ข้อกำหนดเหล่านี้ จึงพัฒนาออกมาตามแนวทางด้านล่าง

สิ่งที่นำมาใช้

Q. จะสร้าง Short Key อย่างไรให้เร็วโดยไม่ขึ้นกับปริมาณข้อมูล?
A.
โดยทั่วไปมีหลายวิธีในการสร้าง Short Key
วิธีแรก คือสร้างค่าที่สุ่มขึ้นมา แล้วตรวจสอบในฐานข้อมูลว่ามีอยู่หรือไม่ ถ้าไม่มีจึงนำค่านั้นมาใช้ได้เลย แต่กรณีนี้มีความยุ่งยากตรงที่ต้องเช็กในฐานข้อมูลและอาจต้องสร้างใหม่อีกครั้ง นอกจากนี้เมื่อมีข้อมูลอยู่มากแล้ว หรือถึงจุดที่ต้องเปลี่ยนจำนวนหลักของ Short Key ก็อาจทำให้เกิดความหน่วงได้มาก
วิธีที่สอง คือสร้าง Short Key แบบสุ่มเตรียมไว้ล่วงหน้าแล้วค่อยนำมาจับคู่ วิธีนี้สามารถสร้าง Short URL ได้เร็วเสมอเพราะแค่นำ Short Key ที่เตรียมไว้มาแมตช์ แต่ก็ยังไม่ใช่คำตอบที่สมบูรณ์ เพราะการเตรียมไว้ล่วงหน้าก็มีขีดจำกัด และยังมีกรณีที่ต้องคำนึงถึงเพิ่ม เช่น หากมีการสร้าง Short URL มากกว่าจำนวนที่เตรียมไว้
แล้วจะมีวิธีที่ดีกว่านี้อีกไหม?
หลังจากคิดอยู่นาน ผมจึงใช้วิธีตามด้านล่าง คือผสานสตริงสุ่ม 4 ตัวอักษรเข้ากับสตริงที่สร้างจาก PK รายละเอียดของแต่ละค่าสามารถดูได้จากคำอธิบายด้านล่าง ลำดับการทำงานมีดังนี้ เมื่อผู้ใช้ร้องขอสร้าง Short URL ระบบจะสร้างสตริงสุ่ม 4 ตัวอักษรก่อน แล้วบันทึกลงฐานข้อมูลตามนั้น จากนั้นนำ PK ที่ได้รับตอนบันทึกมาสร้างเป็นสตริงด้วยวิธีที่อธิบายไว้ด้านล่าง แล้วนำสตริงสุ่มที่สร้างไว้ตอนแรกมารวมกับสตริงของ PK เพื่อสร้างเป็น Short Key วิธีนี้ทำให้ไม่ว่าจะมีข้อมูลสะสมมากแค่ไหน ก็ยังสร้างได้อย่างรวดเร็ว ปลอดภัย และไม่ซ้ำกัน

  • สุ่ม 4 ตัวอักษรคืออะไร?
    สตริงสุ่ม 4 ตัวอักษรในที่นี้ คือสตริงที่สุ่มจริงจากตัวอักษรภาษาอังกฤษพิมพ์เล็ก/พิมพ์ใหญ่และตัวเลข สตริงนี้สามารถซ้ำกันได้ไม่มีปัญหา
  • แปลง PK เป็นสตริง?
    ต่อมาคือค่าส่วนที่สอง สตริงของ PK สมมติว่าเราจะสร้างสตริงตามลำดับโดยผสมตัวอักษรภาษาอังกฤษพิมพ์เล็ก/พิมพ์ใหญ่และตัวเลข ลำดับคือ a -> z, A -> Z, 0 -> 9 ถ้าอย่างนั้น a จะเป็นค่าลำดับแรก b คือ 2, c คือ 3, ... และจะสามารถประกอบค่าไปตามลำดับได้ เมื่อสร้างถึง 9 ครบแล้ว ก็สามารถเพิ่มจำนวนหลักต่อเป็น aa, ab, ac แบบนี้ได้เช่นกัน เมื่อลำดับถูกสร้างแบบนี้ ก็จะมีดัชนีที่สอดคล้องกับแต่ละสตริง เช่น ดัชนีของ a ก็คือ 1 ตรงนี้เองคือวิธีการ ให้ PK เป็นดัชนี แล้วเพียงค้นหาสตริงที่ตรงกับ PK นั้นก็พอ

Q. ถ้าต้องการให้เปลี่ยนจาก Short URL ไปยัง Original URL ได้เร็ว ต้องทำอย่างไร?
A.
ข้อนี้เรียบง่ายมาก คือใช้แคช มีหลายบริการให้เลือกใช้ แต่ในโปรเจกต์นี้ใช้ memory cache เพื่อให้ค้นหาข้อมูลได้อย่างรวดเร็ว นอกจากนี้ ฟีเจอร์เสริมอื่น ๆ ที่นอกเหนือจากการค้นหาข้อมูลแล้วเปลี่ยนเส้นทาง ก็ประมวลผลด้วย lightweight thread

Q. แล้วมีฟีเจอร์เสริมอะไรบ้างที่ทำไว้?
A.
อย่างแรก คือทำให้สามารถเปลี่ยนเส้นทางไปยัง URL ที่ต่างกันตามแพลตฟอร์มได้ โดยรับ DeepLink พื้นฐานของ iOS และ Android มาเก็บไว้ และเผื่อกรณีที่ไม่สามารถย้ายไป DeepLink ได้ ก็รับ FallbackUrl เพิ่มเติมด้วย นอกจากนี้ยังรับ URL สำหรับกรณีเข้าใช้งานจากเดสก์ท็อป เพื่อรองรับทุกกรณี
อย่างที่สอง เพื่อให้ผู้ใช้ตรวจสอบบันทึกการเข้าถึงได้ในช่วงเวลาที่มีการเปลี่ยนเส้นทางไปยัง Original URL จึงเพิ่มฟีเจอร์รับ webhook URL และทุกครั้งที่มีการเปลี่ยนเส้นทางไปยัง Original URL ระบบจะเรียก webhook URL นั้น ปัจจุบันตั้งค่าให้ส่งเฉพาะ User Agent และข้อมูลของ Short URL
อย่างที่สาม ตอนสร้าง Short URL สามารถกรอกข้อมูลของแท็ก Head เพิ่มเติมได้ จุดประสงค์ของฟีเจอร์นี้คือเพื่อ custom og tag หากไม่ได้กรอกแท็กดังกล่าว ระบบจะบันทึกข้อมูล head ของ Default URL แทน


โปรเจกต์นี้พัฒนาด้วย Rust จริง ๆ แล้วผมเพิ่งเรียน Rust มาได้เพียง 2 เดือนเท่านั้น ตอนแรกผมพัฒนาโปรเจกต์ URL Shortener ด้วย FastAPI จากนั้นก็เคยทำด้วย Golang มาก่อน แล้วหลังจากได้เรียน Rust ก็หลงเสน่ห์ของมันอย่างมาก จนกลับมาสร้างโปรเจกต์ URL Shortener เวอร์ชันที่ยกระดับเต็มที่ขึ้นมาอีกครั้ง

ตอนนี้ผมยังไม่คุ้นเคยกับไวยากรณ์, ownership, lifetime ฯลฯ มากนัก จึงอาจยังมีส่วนที่ไม่สมบูรณ์ในเชิงโค้ดอยู่บ้าง ฝากติดตาม ให้กำลังใจ และส่งฟีดแบ็กกันด้วยนะครับ 🙏

ขอบคุณที่อ่านจนจบ

17 ความคิดเห็น

 
leelou2 2025-01-09

ผมได้ลงโปรเจกต์อื่นไว้ด้วย ฝากติดตามกันเยอะ ๆ นะครับ 🎉
https://th.news.hada.io/topic?id=18647

 
po5678 2025-01-07

เป็นโปรเจกต์ที่ยอดเยี่ยมมากครับ
ถ้ารองรับ Docker ได้อย่างที่เขียนไว้ก็น่าจะดีมากเลยครับ!

 
leelou2 2025-01-07

ขอบคุณครับ 👏 เดี๋ยวจะเพิ่ม Docker แล้วอัปโหลดไว้ภายในสัปดาห์นี้นะครับ 🙇‍♂️

 
po5678 2025-01-07

ไม่ทราบว่าจำเป็นต้องกรอกอีเมลหรือเปล่าครับ/คะ? เพิ่งรู้ว่าถ้าไม่ยืนยันอีเมล จะไม่สามารถสร้างเว็บฮุคหรือสร้างที่อยู่ได้

 
leelou2 2025-01-07

หากคุณต้องการใช้เฉพาะภายในและต้องการการปรับแต่งเพิ่มเติม ผมจะแยกปรับแต่งให้ต่างหากโดยไม่เกี่ยวกับโปรเจกต์นี้ครับ!

 
leelou2 2025-01-07

ใช่ครับ เพื่อให้ใช้งานเป็นบริการสาธารณะได้ ผมเลยตั้งค่าให้ต้องรับอีเมลเป็นข้อมูลบังคับไว้ครับ (ใช้การยืนยันอีเมลโดยไม่ต้องสมัครสมาชิก)

เดี๋ยวจะลองพิจารณาแนวทางแก้ไขให้ตอนกรอก JWT ไม่จำเป็นต้องมีอีเมลด้วยอีกครั้งนะครับ 🙏

 
po5678 2025-01-07

โอ้ ผมลองติดตั้ง Ubuntu Lightsail แล้วทำตามดู แต่มีหลายอย่างที่ต้องลงเพิ่มทั้ง SSL, pkg-config, sqlite, cargo :) เดิมทีผมอยากใช้ส่วน https ด้วย Cloudflare Tunnel แทน NPM แต่สุดท้ายก็รู้สึกว่ายากสำหรับผมอยู่ดี hehe.. จะรอเวอร์ชัน Docker นะครับ! กำลังกลุ้มเรื่องที่ dynamic link หายไปพอดี แบบนี้ดีมากเลยครับ

 
leelou2 2025-01-07

เพิ่ม Dockerfile และคำสั่งที่สามารถรันได้ (deploy.sh) แล้ว 🎉

 
leelou2 2025-01-07

จะรีบเพิ่ม Docker ให้เร็วที่สุดครับ 555

 
po5678 2025-01-07

โอ้ แต่ก็รันได้จริงนะ! ทำได้ยังไงกันนะ? โฮเอง

 
jin225675 2025-01-07

ผมคิดว่าน่าจะดีถ้าเพิ่ม demo URL ไว้บนเว็บไซต์นอกเหนือจากใน README ของ GitHub repo ด้วยนะครับ!

ปกติเวลาจะเช็กว่ามีหน้าโฮมหรือ playground ไหม เหมือนคนส่วนใหญ่มักจะดูกล่องข้อมูลด้านขวาของ repo ก่อน เลยเข้าใจไปว่าไม่มีเดโมไซต์ครับ ฮ่าๆ

ได้เข้ามาชมโปรเจ็กต์ดีๆ ขอบคุณมากครับ!

 
leelou2 2025-01-07

อ๊ะ ผมพลาดไปเอง เดี๋ยวต้องไปตั้งค่าทันทีเลย ขอบคุณครับ🤩

 
balthasar 2025-01-07

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

เนื้อหาที่เกี่ยวข้องก็มีอยู่ใน GeekNews เหมือนกันครับ

https://th.news.hada.io/topic?id=14479

 
laeyoung 2025-01-07

ดีเลยครับ!! ตอนสร้าง id หรือลิงก์ ถ้าคำนึงถึงเรื่องนั้นด้วยก็ดีเหมือนกันนะครับ

 
leelou2 2025-01-07

ว้าว ขอบคุณมากครับ👍

 
leelou2 2025-01-06

ติดตั้ง Rust และตั้งค่าเพียงตัวแปรสภาพแวดล้อมก็พร้อมใช้งานได้ทันที!
บริการ Google URL จะยุติให้บริการในปีนี้ โปรดใช้เป็นทางเลือกแทน หากมีข้อสงสัย จุดที่ต้องการปรับปรุง หรือวิธีการติดตั้ง เรายินดีต้อนรับทุกข้อความทางอีเมล 👏

 
leelou2 2025-01-06

สามารถทดลองใช้งานแบบง่าย ๆ ได้ที่ https://f-it.kr/ 🙇‍♂️