ComBioLaw.De » Blog » เขียนโปรแกรม » เก็บตก Webapplication technologies

เก็บตก Webapplication technologies

imageหลังจากที่เขียนบล็อกเรื่อง Webapplication technologies ไป โดยโปรยคำขึ้นต้นด้วยสำนวน "ความทรมานในการเลือก"  เพราะ Webapp มีเทคโนโลยีมากมายให้เลือกจนปวดหัว ดูเหมือนว่าความทรมานในการเลือกจะไม่พอเพียงสำหรับคนเขียน และคนอ่าน เพราะมีผู้อ่านหลายท่าน แนะนำให้ทดสอบเทคโนโลยีอื่นเพิ่มเติม และคนเขียนก็เห็นดีเห็นงามไปด้วย ก็เลยเขียนบล็อกนี้เพิ่มเติม เป็นการเก็บตกเทคโนโลยีที่ยังไม่ได้ทดสอบ

เทคโนโลยีที่ผมทดสอบเพิ่มเติมได้แก่ 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 มันแยกออกมาต่างหากเลยต้องติดตั้งเพิ่มเติม ด้วยคำสั่ง ...

เขียนโปรแกรม เขียนโปรแกรม

bow_der_kleine bow_der_kleine

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

  1. WSGIScriptAlias /mod_wsgi/hello /YOUR/WSGI/DIRECTORY/hello.wsgi
  2.  
  3. <Directory/YOUR/WSGI/DIRECTORY>
  4. AllowOverride None
  5. Options None
  6. Order deny,allow
  7. Allow from all
  8. </Directory>
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

  1. <Directory /var/www/fcgi>
  2. AddHandler fcgid-script .rb
  3. FCGIWrapper /usr/bin/ruby .rb
  4. Options ExecCGI
  5. allow from all
  6. </Directory>
plain code

แล้วก็รีสตาร์ท Apache (รู้สึกว่าขั้นตอนมันจะคล้าย ๆ กันหมดแฮะ) ที่สำคัญและพลาดไม่ได้คือ ไฟล์สคริปท์ต้องมีนามสกุลเป็น .fcgi มี permission เป็น 755 และต้องอยู่ในโฟล์เดอร์ที่เรากำหนดเท่านั้น (ในกรณีคือ /var/www/fcgi ) โดยรวมแล้วการติดตั้งและใช้งาน FCGI ถือว่าง่ายกว่า mod_wsgi นิดหน่อย แต่เนื่องจากเอกสารน้อย และไม่ดีเท่าที่ควร ที่พอมีอยู่บ้างก็เน้นการใช้ FCGI ร่วมกับ RoR ทำให้การติดตั้งและทดลองใช้ค่อนข้างมีปัญหาพอสมควร

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

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

image
ในการทดสอบแบบ single request ผลออกมาไม่ต่างจากครั้งก่อนมากนัก นั่นคือ Mongrel เร็วที่สุดตามมาติด ๆ ด้วย JSP สิ่งที่น่าสนใจในการทดสอบนี้คือ การใช้ภาษาเขียนโปรแกรมเดียวกัน แต่ deploy ต่างกัน ในส่วนของ ruby ข้อแตกต่างของ FCGI, Mongrel และ Mongrel+mod_proxy_balancer เห็นได้ค่อนข้างชัด โดยส่วนตัวผมเห็นว่า Mongrel น่าจะเป็นตัวเลือกที่ถูกตัดออก เพราะไม่น่าจะสามารถใช้งานได้จริง แม้ว่า FCGI จะเร็วกว่า Mongrel+mod_proxy_balancer แต่เมื่อคิดถึงความยากง่ายในการพัฒนาโปรแกรม ที่ FCGI เอื้อต่อการดีบักน้อยกว่า และนักพัฒนาของ FCGI ที่กระตือลือล้นน้อยกว่า ทำให้การตัดสินใจเลือกระหว่างสองเทคโนโลยีดังกล่าวไม่ใช่เรื่องง่ายนัก  คิดแล้วก็หนักใจแทนชาว ruby ครับ

ในส่วนของ 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 ได้

image

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

ที่น่าสนใจเป็นพิเศษคือ ความเร็วที่เพิ่มขึ้นจากการใช้ 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

read 2130

<<Big Brother || ชวนเชื่อ>>

deans4j

สวัสดีครับ

ผมมีข้อสงเกตนึดนึงครับ ว่าถ้า connection เป็น singleton อย่างนี้มันจะเป็นคอขวดระหว่าง request กันเองหรือเปล่าครับ

เพราะต่าง request ต่างก็เรียกใช้ connection ตัวเดียวกัน การบริหารและบริการ transaction จะตกไปที่ connection เดียวไหม

แต่ถ้าเปิดปิด connection ทุกครั้งก็เปลือง overhead ตอนเปิดอีกเหมือนกัน ถ้าให้ server จัดการบริหาร connection pool ให้ก็จะเร็วขึ้นครับ

17 Jun 08

bow_der_kleine

ขอบคุณ คุณ dean4j มากครับ เดี๋ยวผมลองแก้ไขดูครับ

17 Jun 08

revolution

ก่อนหน้านี้ที่แนะนำ fcgi ไปเนื่องจาก mod_rails ยังไม่ค่อยมี feature เท่าไหร่ แต่ตอนนี้มี 2.0 beta ที่ไม่จำเป็นต้องใช้กับ rails framework แล้ว น่าจะเข้าข่ายในการทดสอบได้นะครับ ถ้าออกมาเด๋วเขียนวิธี setup ถ้ายังอยากลองอยู่

^_^

ขอบคุณมากสำหรับการทดสอบ

17 Jun 08

vee

ชอบมาก

แต่ว่างงๆอันนี้ "JSP แบบ 10 requests มีความเร็วมากกว่า single requests มากกว่าสองเท่า" หมายถึงความเร็วต่อ 1 request?

17 Jun 08

PunNeng

ใช่แล้วครับ สำหรับชาว Ruby on Rails แล้ว การ deployment นี่ นรกมาก

ทุกวันนี้ที่ออฟฟิศใช้ nginx+mongrel ครับ และกำลังจะย้ายไปใช้บน mod_rails ในเร็วๆ นี้

18 Jun 08

PunNeng

พลาดด

แต่ที่ยอมวุ่นวาย(ตอนแรกที่ใช้) ก็เพราะมัน code ได้ง่ายและเร็วนี่แหละครับ

18 Jun 08

bow_der_kleine

vee : ผมเขียนอ่านยากจริง ๆ ด้วยครับ เรียบเรียงคำไม่ค่อยถูก แก้แล้วก็ยังงง ๆ อยู่ สิ่งที่คุณ vee เข้าใจ ถูกต้องแล้วครับ สาเหตุที่ 10 requests เร็วกว่า single request เนื่องจาก single request ใช้ความสามารถ CPU แค่แกน (core) เดียว

revolution, PunNeng : เมื่อมีการพูดถึง mod_rails กันเยอะ ผมก็อยากทดสอบเหมือนกันครัย แต่ใน Ubuntu ยังไม่มี mod_rails ต้องติดตั้งเอง ความขี้เกียจเลยเพิ่มขึ้นอีกเยอะครับ ผมว่า mod_rails มันตั้งชื่อไม่ค่อยสื่อนะ เพราะผมอ่านตอนแรกก็นึกว่าใช้ได้เฉพาะกับ RoR

18 Jun 08

revolution

ก็ตามชื่อนั่นแหละครับ ตอนที่เขาเริ่มพัฒนาเนี่ยเห็นว่าทิศทางจะมุ่งไปที่ rails ซะเป็นส่วนใหญ่ แต่พอเริ่มพัฒนาไปก็เห็นความต้องการ framework lightweight อย่าง merb ซึ่งดูๆไปแล้วทางด้าน server นี่ก็ไม่ต่างจาก rails คือทั้ง rails และ merb ก็ใช้ Mongrel ได้ ก็เห็นว่ามันน่าจะเอา concept ไปใช้ได้ ตอนนี้ 2.0rc2 เห็นว่า run python wsgi ได้อีกต่างหาก  ทำให้เห็นได้ว่าสถาปัตยกรรม รูปแบบนี้ค่อนข้าง flexible มากๆ ถ้าจะให้ช่วย setup เพื่อการทดสอบ ก็ mail มากได้นะครับ ^^ ยินดี

แต่ที่จริงชื่อเขาคือ passenger นะครับ mod_rails นี่เรียกว่าเป็นชื่อเล่น ^^

ป.ล. ส่งยากจัง ฉันไม่ใช่ spam นะ 

19 Jun 08

ชาละวัน

deans4j

แต่ถ้าเปิดปิด connection ทุกครั้งก็เปลือง overhead ตอนเปิดอีกเหมือนกัน ถ้าให้ server จัดการบริหาร connection pool ให้ก็จะเร็วขึ้นครับ

ถามใจโปรแกรมเมอร์อย่างผม

ถ้าเป็นที่บริษัทผมคงไม่สะดวกแน่ครับ เพราะยุ่งกับ Server ลำบาก

เพราะที่บริษัทที่ผมทำงานนี้ค่อนข้างเรื่องมากจะไปยุ่งกับ server นี่ต้องผ่านการอนุมัติอย่างน้อยสองคน

09 Sep 08

ความคิดเห็น (click here to comment)

Search

Navigation

รวมลิงก์น่าสนใจ

ความเคลื่อนไหว

Login