ComBioLaw.De » Blog » เขียนโปรแกรม » เก็บตก Webapplication technologies
เก็บตก Webapplication technologies
เทคโนโลยีที่ผมทดสอบเพิ่มเติมได้แก่ WSGI, mod_wsgi สำหรับ python และ FCGI, mod_proxy_balancer สำหรับ ruby นอกจากนี้ผมยังได้ปรับปรุง และเพิ่มเติมการทดสอบอีกเล็กน้อย WSGI เป็นมาตรฐานใหม่ที่ถูกกำหนดลงไปใน PEP 333 เพื่อใช้ในการติดต่อเชื่อมโยงระหว่าง Webserver และ Webapp โดยเอาแนวคิดมาจาก Servlet ของ Java ซึ่งการเขียน Webapp โดย WSGI นั้นค่อนข้าง lowlevel พอสมควร ทำให้ไม่สะดวกสบายเหมือนใช้ mod_python การใช้งาน WSGI นั้นสามารถใช้งานได้สองรูปแบบคือเขียนโปรแกรมเป็น Stand-Alone Webserver แบบ Mongrel หรือเชื่อมต่อระหว่าง Webserver กับตัว Webapp คล้าย ๆ mod_python หากจะเขียนโปรแกรมแบบ Stand-Alone ผมเข้าใจว่า เวลาติดตั้ง python เสร็จแล้ว สามารถใช้งาน wsgiref ซึ่งเป็นโมดูลสำหรับเขียน Webserver แบบง่าย ๆ ได้เลย ไม่ต้องติดตั้งโมดูลเพิ่มเติม แต่เนื่องจากใน Debian และ Ubuntu แพกเกจ wsgiref มันแยกออกมาต่างหากเลยต้องติดตั้งเพิ่มเติม ด้วยคำสั่ง ... |
|
sudo apt-get install python-wsgirefจากนั้นก็เริ่มเขียน webserver และ webapp ตามที่ต้องการได้ (ตัวอย่างดูในโค้ด Webapp.zip เอาเองแล้วกันครับ เดี๋ยวจะยาวไป) ความยุ่งยากในการติดตั้งและใช้งานนั้น ผมยกให้ยากกว่า Mongrel เพราะต้องเขียนโค้ดเอง แถม lowlevel กว่าอีกต่างหาก อีกทั้งตัว webserver ที่ได้ก็ไม่เหมาะอย่างยิ่ง สำหรับใช้งานในระบบจริง (ทาง Developer ของ WSGI แนะนำมาอย่างนั้น) เพราะเป็น webserver แบบพื้น ๆ และไม่สนับสนุน multithreading ดังนั้นทางที่ดี จึงควรใช้ mod_wsgi น่าจะเหมาะสมกว่า การใช้งาน mod_wsgi นั้น เราต้องติดตั้งแพกเกจ libapache2-mod-wsgi เพิ่มเติม เพื่อให้ Apache รู้จักและเข้าใจ WSGI
sudo apt-get install libapache2-mod-wsgiหลังจากติดตั้งเสร็จแล้วก็ปรับแต่งระบบของ Apache โดยเพิ่มโค้ดต่อไปนี้ลงไปในไฟล์ /etc/apache2/apache2.conf
plain code ซึ่งในไฟล์ /YOUR/WSGI/DIRECTORY/hello.wsgi ต้องมีฟังก์ชั่นชื่อ application(environ, start_response) อยู่ เพื่อเป็นตัวติดต่อระหว่าง webserver กับ webapp เมื่อทุกอย่างเรียบร้อยแล้วก็รีสตาร์ท Apache แล้วเปิดเวบบราวเซอร์ไปที่ http://localhost/mod_wsgi/hello ก็จะเจอหน้า Hello World ! สำหรับ Ruby หลังจากที่ผมติดตั้ง mod_ruby ไม่สำเร็จ ก็มีคนแนะนำให้ลอง FCGI ดู เพราะติดตั้งง่ายกว่า และความเร็วไม่ต่างกับ mod_ruby มาก ซึ่งก็จริง ดังคำบอกเล่า การติดตั้งมีขั้นตอนดังต่อไปนี้ ขั้นแรกคือติดตั้งแพกเกจที่จำเป็นก่อน
sudo apt-get install libapache2-mod-fcgid libfcgi-ruby1.8จากนั้นก็ปรับแต่ง /etc/apache2/apache2.conf
plain code แล้วก็รีสตาร์ท Apache (รู้สึกว่าขั้นตอนมันจะคล้าย ๆ กันหมดแฮะ) ที่สำคัญและพลาดไม่ได้คือ ไฟล์สคริปท์ต้องมีนามสกุลเป็น .fcgi มี permission เป็น 755 และต้องอยู่ในโฟล์เดอร์ที่เรากำหนดเท่านั้น (ในกรณีคือ /var/www/fcgi ) โดยรวมแล้วการติดตั้งและใช้งาน FCGI ถือว่าง่ายกว่า mod_wsgi นิดหน่อย แต่เนื่องจากเอกสารน้อย และไม่ดีเท่าที่ควร ที่พอมีอยู่บ้างก็เน้นการใช้ FCGI ร่วมกับ RoR ทำให้การติดตั้งและทดลองใช้ค่อนข้างมีปัญหาพอสมควร เทคโนโลยีสุดท้ายที่ผมอยากเก็บตกคือ การใช้งาน Mongrel ร่วมกับ mod_proxy_balancer ซึ่งผมเข้าใจว่ามันมีอยู่ในตัว Apache อยู่แล้วไม่ต้องติดตั้งแพกเกจใด ๆ สำหรับรายละเอียดการติดตั้งและใช้งานสามารถอ่านได้ที่ บล็อกคุณ PunNeng ทีนี้ก็มาถึงผลการทดสอบ จากที่ครั้งก่อนผมวัดเวลาที่ใช้ต่อรีเควสท์ ซึ่งดูไปแล้วไม่ค่อยดีเท่าไรเพราะเห็นความแตกต่างได้ไม่ชัดเจนนัก และไม่มีใครเขาทำกัน ครั้งนี้ผมเลยวัดเป็นจำนวนรีเควสท์ต่อวินาที และวัดแบบ ส่งรีเควสท์ไปยังเซิพเวอร์ครั้งละหนึ่งรีเควสท์ และส่งไปแบบพร้อม ๆ กันสิบรีเควสท์ เพื่อดูความสามารถ multi-threading ของแต่เทคโนโลยี
ในส่วนของ python การตัดสินใจง่ายหน่อย เพราะ mod_wsgi ดูเหมือนจะได้เปรียบ mod_python อยู่หลายเรื่อง ทั้งในเรื่องความเร็ว และความเอาใจใส่ของชุมชน ดูเหมือนว่า WSGI จะเป็นของเล่นใหม่ของชาว python ที่ได้รับความสนใจเป็นพิเศษ ถึงขั้นถูกยกระดับเป็น builtin module สิ่งที่ mod_wsgi เสียเปรียบ mod_python คือ mod_wsgi มัน low level กว่า mod_python ทำให้การพัฒนาโปรแกรมด้วย mod_wsgi ยุ่งยากในบางเรื่อง แต่เมื่อนำเรื่อง framework มาพิจรณา mod_wsgi อาจหักล้างข้อเสียในส่วนนี้ของตัวเองได้บ้าง เนื่องจากเครื่องที่ผมใช้ทดสอบใช้ CPU แบบ Dual Core ดังนั้น เทคโนโลยีส่วนใหญ่จึงมีความเร็วเพิ่มขึ้นเกือบสองเท่าในการทดสอบแบบ 10 requests ผลการทดสอบเป็นเครื่องยืนยันได้ว่าเวบเซิพเวอร์อย่างง่ายอย่าง Mongrel หรือ WSGI ไม่เหมาะสำหรับการใช้งานจริง เพราะมี scalability ที่ต่ำ ส่วนเทคโนโลยีอื่น ๆ ที่ทำงานบน Apache มี scalability ในเรื่องการตอบสนอง request ที่เป็นที่น่าพอใจ เทคโนโลยีที่น่าสนใจเป็นพิเศษคือ JSP และ mod_wsgi ที่มีความเร็วเหนือเทคโนโลยีอื่น ๆ อย่างชัดเจน การทดสอบต่อมาคือ การทดสอบการติดต่อฐานข้อมูล ที่นอกจากจะเพิ่มการทดสอบแบบ 10 requests เข้ามาแล้ว ผมยังแก้ไขโค้ดเกือบทั้งหมด ให้มีการใช้ singleton เพื่อให้โปรแกรมติดต่อฐานข้อมูลเพียงครั้งเดียว หลังจากนั้นจะ query กี่ครั้งก็ได้ ไม่ต้องติดต่อฐานข้อมูลใหม่ แต่ด้วยโครงสร้างของ mod_php ผมไม่สามารถใช้วิธี singleton กับ mod_php ได้
ตอนแรกผมคาดการณ์ไว้ว่า ในภาษาเขียนโปรแกรมเดียวกัน แต่ใช้เทคโนโลยีคนละอย่าง จะมีความเร็วไม่ต่างกันมากนัก เพราะดูจากผลการทดสอบแล้ว การติดต่อฐานข้อมูล ใช้เวลามากกว่าการตอบสนองรีเควสท์อยู่มาก และภาษาเดียวกัน ใช้ไลบรารี่ในการติดต่อฐานข้อมูลเดียวกัน ความเร็วไม่น่าจะต่างกันมาก หากมีการตอบรับรีเควสท์คนละแบบ แต่ผลกลับออกมาตรงข้ามกับที่ผมคาดการณ์ กล่าวคือ เทคโนโลยีการตอบรับรีเควสท์มีผลต่อความเร็วในการติดต่อฐานข้อมูล และดูเหมือนว่าจะมีผลมากเสียด้วย ที่น่าสนใจเป็นพิเศษคือ ความเร็วที่เพิ่มขึ้นจากการใช้ singleton จากเดิมที่ mod_python ช้ากว่า mod_php ในระดับนึง แต่พอมี singleton เข้ามาช่วย ทำให้ความเร็วของทั้งสองเทคโนโลยีต่างกันไม่มากนัก หากเราจะมอง singleton เป็น cache รูปแบบหนึ่ง ก็จะเห็นได้ว่า mod_php เสียเปรียบเทคโนโลยีอื่น ๆ ในเรื่องการจัดาการ cache พอสมควร ความเร็วของ JSP มีความน่าสนใจเป็นพิเศษในเรื่อง multithreading และ scalability เพราะความเร็วของ JSP ในการทดสอบแบบ 10 requests เร็วกว่าในการทดสอบแบบ single requests เกินสองเท่า นั่นหมายความว่า Java ในนามของ JSP มีการจัดการ thread ที่ดีมาก ซึ่งความสามารถในส่วนนี้สามารถชดเชยความเร็วในการติดต่อฐานข้อมูลของ JSP ได้ดีทีเดียว เมื่อดูในการทดสอบแบบ 10 requests ความเร็วของ JSP ตีกระชั้น mod_php มาพอสมควร |
|
12 Jun 08 | by | tags เขียนโปรแกรม ไอที Webapplication Java JSP PHP Python Ruby
revolution
ก่อนหน้านี้ที่แนะนำ fcgi ไปเนื่องจาก mod_rails ยังไม่ค่อยมี feature เท่าไหร่ แต่ตอนนี้มี 2.0 beta ที่ไม่จำเป็นต้องใช้กับ rails framework แล้ว น่าจะเข้าข่ายในการทดสอบได้นะครับ ถ้าออกมาเด๋วเขียนวิธี setup ถ้ายังอยากลองอยู่ ^_^ ขอบคุณมากสำหรับการทดสอบ |
bow_der_kleine
vee : ผมเขียนอ่านยากจริง ๆ ด้วยครับ เรียบเรียงคำไม่ค่อยถูก แก้แล้วก็ยังงง ๆ อยู่ สิ่งที่คุณ vee เข้าใจ ถูกต้องแล้วครับ สาเหตุที่ 10 requests เร็วกว่า single request เนื่องจาก single request ใช้ความสามารถ CPU แค่แกน (core) เดียว revolution, PunNeng : เมื่อมีการพูดถึง mod_rails กันเยอะ ผมก็อยากทดสอบเหมือนกันครัย แต่ใน Ubuntu ยังไม่มี mod_rails ต้องติดตั้งเอง ความขี้เกียจเลยเพิ่มขึ้นอีกเยอะครับ ผมว่า mod_rails มันตั้งชื่อไม่ค่อยสื่อนะ เพราะผมอ่านตอนแรกก็นึกว่าใช้ได้เฉพาะกับ RoR |
revolution
ก็ตามชื่อนั่นแหละครับ ตอนที่เขาเริ่มพัฒนาเนี่ยเห็นว่าทิศทางจะมุ่งไปที่ rails ซะเป็นส่วนใหญ่ แต่พอเริ่มพัฒนาไปก็เห็นความต้องการ framework lightweight อย่าง merb ซึ่งดูๆไปแล้วทางด้าน server นี่ก็ไม่ต่างจาก rails คือทั้ง rails และ merb ก็ใช้ Mongrel ได้ ก็เห็นว่ามันน่าจะเอา concept ไปใช้ได้ ตอนนี้ 2.0rc2 เห็นว่า run python wsgi ได้อีกต่างหาก ทำให้เห็นได้ว่าสถาปัตยกรรม รูปแบบนี้ค่อนข้าง flexible มากๆ ถ้าจะให้ช่วย setup เพื่อการทดสอบ ก็ mail มากได้นะครับ ^^ ยินดี แต่ที่จริงชื่อเขาคือ passenger นะครับ mod_rails นี่เรียกว่าเป็นชื่อเล่น ^^ ป.ล. ส่งยากจัง ฉันไม่ใช่ spam นะ |
ชาละวัน
ถามใจโปรแกรมเมอร์อย่างผม ถ้าเป็นที่บริษัทผมคงไม่สะดวกแน่ครับ เพราะยุ่งกับ Server ลำบาก เพราะที่บริษัทที่ผมทำงานนี้ค่อนข้างเรื่องมากจะไปยุ่งกับ server นี่ต้องผ่านการอนุมัติอย่างน้อยสองคน |
หลังจากที่เขียนบล็อกเรื่อง 
deans4j
สวัสดีครับ
ผมมีข้อสงเกตนึดนึงครับ ว่าถ้า connection เป็น singleton อย่างนี้มันจะเป็นคอขวดระหว่าง request กันเองหรือเปล่าครับ
เพราะต่าง request ต่างก็เรียกใช้ connection ตัวเดียวกัน การบริหารและบริการ transaction จะตกไปที่ connection เดียวไหม
แต่ถ้าเปิดปิด connection ทุกครั้งก็เปลือง overhead ตอนเปิดอีกเหมือนกัน ถ้าให้ server จัดการบริหาร connection pool ให้ก็จะเร็วขึ้นครับ
17 Jun 08