สรุปข้อมูลจากการอ่าน Slide เรื่องการสร้าง dl.google.com ด้วย Go
โดยเกี่ยวกับการเขียน dl.google.com ขึ้นมาใหม่ด้วย Go
สิ่งที่น่าสนใจมากๆ ใน slide นี่ก็คือ
การพัฒนาระบบนั้น ส่วนใหญ่จะใช้ library ที่มาจาก Go เลย
ดังนั้นมาดูกันว่า เขาพัฒนากันอย่างไร
ระบบนี้มันทำอะไรบ้าง ??
- สำหรับให้บริการ download ผ่าน HTTP
- ซึ่งใช้จาก Chrome, Android SDK, Google Earth, Google Map และ service อื่นๆ อีกมากมาย
- มีการใช้งานที่สูงมากๆ
- มี bandwidth ขนาดใหญ่
- มี datacenter อยู่หลายที่มาก
เหตุผลที่ต้องเปลี่ยนมาใช้ Go เพราะว่า
ระบบเดิมรองรับการใช้งานไม่ได้แล้ว
ใช้เวลาการทำงานในแต่ละ request ช้ามาก
การดูแลรักษา code ยากมาก เพราะว่าปะผุมาจนถึงขนาดที่ว่า
มีการแก้ไขหรือ hack ให้สามารถทำงานได้
โดยไม่มีการเขียน test และเอกสารด้วย
ดังนั้นลองมาเขียนด้วย Go กันเถอะ !!!
สิ่งที่น่าสนใจก็คือ
ในส่วนของ Web server ที่คอยให้บริการผู้ใช้งานนั้น
ใช้เพียง library พื้นฐานของ Go ที่มีมาให้ คือ net/http, io และ http.ServeContent
ส่วน caching ใช้ groupcache ซึ่งพัฒนาด้วย Go เช่นกัน
ใน Slide มีประโยคที่ชอบมากๆ คือ
Go is not perfect But my favorite language yet
ส่วนที่ทำการศึกษาก่อนก็คือ net/http
ไม่ต้องอธิบายอะไรมาก code กันดีกว่า
โดยทำการสร้าง Web Server กันเลย
package main import ( "fmt" "log" "net/http" "os" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(os.Stdout, "%s details: %+v\n", r.URL.Path, r) fmt.Fprintf(w, "Hello, world! at %s\n", r.URL.Path) } func main() { log.Printf("Running...") log.Fatal(http.ListenAndServe("127.0.0.1:8080", http.HandlerFunc(handler))) }
คำอธิบาย
โดยทำการสร้าง server และรอรับ request ผ่าน port 8080
เมื่อมี request เข้ามาทำงานที่ function ชื่อว่า handler
เพียงเท่านี้ ก็สามารถสร้าง Web server
ลองเข้า url = http://127.0.0.1:8080/ ใน browser จะแสดงผลดังรูป
ถ้าต้องการทำ File Server ล่ะทำอย่างไร
ใน slide จะมีตัวอย่างดังนี้
package main import ( "net/http" "log" ) func main() { log.Printf("Running...") log.Fatal( http.ListenAndServe("127.0.0.1:8080", http.FileServer(http.Dir("/usr/share/doc")))) }
คำอธิบาย
ทำการสร้าง File server ขึ้นมาซึ่งมีลักษณะเดียวกับตัวอย่างแรก
แต่ให้บริการ file และ folder ตาม path ที่ต้องการ ในตัวอย่างก็คือ folder /usr/share/doc
ลองเข้า url = http://127.0.0.1:8080/ ใน browser จะแสดงผลดังรูป
ต่อไปคือ http.ServeContent
เป็น function จะส่งข้อมูลกลับไปยัง request ต่างๆ
ในเอกสารบอกว่า มันมีประโยชน์มาก เพราะว่า
ถ้าไม่ทำการกำหนด content-type ใน HTTP header แล้ว มันจะดูจากนามสกุลของไฟล์ แต่ถ้าไม่มีอีกจะอ่านข้อมูลใน block แรกของไฟล์มาแทน
และยังกำหนดค่าอื่นๆ ใน HTTP Header ได้อีก เช่น Last-Modifies, If-Range และ If-None-Match ซึ่งจะสัมพันธ์กับ request ด้วย
ยังไม่หมด สามารถเลือกที่จะเริ่มอ่านข้อมูลจากตรงไหนก็ได้
มันครบดีนะ
ตัวอย่าง
package main import ( "log" "net/http" "strings" "time" ) func main() { log.Printf("Running...") err := http.ListenAndServe("127.0.0.1:8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { http.ServeContent(w, r, "foo.txt", time.Now(), strings.NewReader("I am some content.\n")) })) log.Fatal(err) }
ลองทำการร้องขอข้อมูลจาก byte ที่ 6 ขึ้นไปด้วยคำสั่ง
$curl -H "Range: bytes=5-" http://localhost:8080
ผลการทำงานคือ
some content
และเมื่อไปรวมกับ Groupcache ด้วยแล้วก็ไปกันใหญ่เลย
สามารถทำ payload server กันแบบสนุกสนานไปเลย
สิ่งที่น่าสนใจก็คือ archicture ของ dl.google.com
มันเรียบง่ายมากๆ เนื่องจากไม่ต้องมี python server, C++ server และ การอ่านข้อมูลจาก local disk แล้ว
นี่มัน Slide ขายของของ Go ชัดๆ
ดังนั้น ต่อไปเริ่มศึกษา Web server ด้วย Go ดีกว่า ….