2004/Aug/13

ผมพบว่า Developer ส่วนใหญ่ไม่ค่อยเข้าใจความแตกต่างของ Cluster และ Load Balance เนื่องจากจะได้คำถามประมาณว่า ถ้า Server ทำเป็น Cluster แล้วจะทำ Load Balance แบบ Sticky ดีหรือเปล่า อยู่บ่อยๆ ดังนั้นวันนี้ผมจะมาไขข้อข้องใจของหลายๆคนนะครับ

Clustering คือการจัดกลุ่มของคอมพิวเตอร์หลายๆตัวเพื่อให้สามารถทำงานได้เหมือนกับเป็นคอมพิวเตอร์ตัวเดียวกัน

ดังนั้นไม่ว่า User เข้ามาใช้งานเครื่องใดภายในกลุ่มก็จะรู้สึกเหมือนใช้งานคอมพิวเตอร์เครื่องเดียวกัน คุณสมบัติสำคัญของการทำ Clustering คือการทำ Replication โดยในแง่ของ Web Application คือการทำ Session Replication ซึ่งตามปกติแล้ว Session ของ User จะถูกจัดเก็บใน Web Server เครื่องที่ User กำลังใช้งานอยู่เท่านั้น แต่การทำ Clustering จะเป็นการคัดลอก (Replicate) Session นั้นไปยัง Web Server อื่นภายในกลุ่มด้วย ทำให้ไม่ว่า User เข้าไปใช้งานใน Server เครื่องใดก็จะมี Session ของ User อยู่ด้วยเสมอ

Load balancing คือการจัดกลุ่มของคอมพิวเตอร์หลายๆตัวเพื่อแบ่งงานกัน หรือกระจาย load การใช้งานของ user ไปยังคอมพิวเตอร์ภายในกลุ่ม เพื่อให้สามารถรับจำนวน user ที่เข้ามาใช้งานได้มากขึ้น หรือสามารถรับงานที่เข้ามาได้มากขึ้น นอกจากนั้นยังมีคุณสมบัติของ Fail Over คือหากมีคอมพิวเตอร์ภายในกลุ่มไม่สามารถทำงานได้ เช่น Down อยู่ หรือไม่สามารถรับงานหรือuserเพิ่มได้เนื่องจาก resource ที่ใช้ทำงานไม่พอ ตัว Load Balancer ที่เป็นตัวแจก load ให้คอมพิวเตอร์ภายในกลุ่มก็จะส่ง load ไปยังคอมพิวเตอร์เครื่องอื่นๆแทน จนกว่าคอมพิวเตอร์เครื่องนั้นจะกลับมาใช้งานได้ใหม่

การทำงานของ Load Balancer นั้นมี 3 ลักษณะด้วยกันได้แก่
1. Round-robin เป็นการส่ง traffic ไปยัง Server ภายในกลุ่มวนไปเรื่อยๆ
2. Sticky เป็นการส่ง traffic โดยยึดติดกับ Session ที่ user เคยเข้าไปใช้งาน เช่น ถ้า user เคยเข้าไปใช้ใน server ที่ 1 ภายในกลุ่ม traffic ของ user คนนั้นก็จะถูกส่งไปยัง server 1 เท่านั้น
3. Work load เป็นการส่ง traffic โดยดูที่ performance ของ server ภายในกลุ่มเป็นสำคัญ เช่นหาก server 1 มีงานมากกว่า server 2 ตัว load balancer ก็จะส่ง traffic ไปยัง server 2

การทำ Cluster Load Balance คือการผสมผสานการทำงานทั้งสองลักษณะเข้าด้วยกัน แต่หากจะเลือกใช้การทำงานแบบนี้แล้ว การใช้ Load Balance แบบ Sticky ก็จะไม่มีความหมายไป เนื่องจาก ทุกๆ Server ภายในกลุ่มเป็น Cluster กันอยู่แล้ว ดังนั้นจึงไม่มีเหตุผลใดที่จะส่ง Traffic ไปให้เครื่องเดิมเสมออีก ควรจะทำ Load Balance แบบ Round-robin หรือ Work load แทน

อย่างไรก็ดีการทำ Cluster ไม่จำเป็นต้องพึ่ง Feature ของ Server เป็นหลัก แต่เราสามารถ Develop ตัว Application ให้เป็น Cluster เองได้ โดยไม่ต้องพึ่ง Feature ของ Server เช่น การใช้หลักการของ File Sharing หรือ Database เข้ามาช่วยก็สามารถทำงานได้เหมือนกัน เช่นเดียวกับการทำ Load Balance เราไม่จำเป็นต้องหา Hardware หรือ Software พิเศษที่จะทำหน้าที่เป็น Load Balancer แต่เราสามารถเขียน Application เพื่อทำการกระจาย Traffic ไปยัง Server ต่างๆได้เหมือนกัน โดยใช้หลักการของ Redirection เป็นต้น

2004/Jul/29

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

ปกติเวลาผมพัฒนาระบบขึ้นตามความต้องการของ User ผมจะเน้นที่ต้องทำให้เสร็จเร็วที่สุดก่อนถึงกำหนดและครบถ้วนตามความต้องการของ User ก่อน จากนั้นจึงเริ่มมองส่วนเสริมเพื่อให้ Software มีคุณภาพที่ดีขึ้น

จริงๆแล้วคุณภาพของ Software เป็นสิ่งที่วัดค่อนข้างยากเมื่อเปรียบเทียบกับ Product อื่น ยกตัวอย่างเช่น บ้าน ปกติเวลาเราเลือกซื้อบ้าน เราจะมีกฏเกณฑ์คร่าวๆเอาไว้ได้แก่ ต้องสวยถูกใจ ทำเลเดินทางสะดวก ราคาไม่แพงเกินไป ฯลฯ ซึ่งกฏเกณฑ์ข้างต้นคือ ความต้องการของเรา แล้วคุณภาพล่ะ? ปกติคนเรา(โดยเฉพาะคนไทย)มักจะมองคุณภาพเป็นผลพลอยได้ แต่ในความจริงแล้วคุณภาพคือสิ่งที่สร้างความพึ่งพอใจของเราในระยะยาวมากกว่าความต้องการของเราด้วยซ่ำไป

อย่างไรก็ดี คุณภาพของ Software ตามหลักเกณฑ์(ที่ได้เรียนมา)ประกอบไปด้วย

1. คุณภาพด้านการใช้งาน หรือ Usability หลักการง่ายๆในการพัฒนา Software ให้มีคุณภาพด้านการใช้งานที่ดีคือ ต้องทำให้ Software ที่สร้างขึ้นมานั้นง่ายที่จะเรียนรู้เพื่อใช้งานสำหรับมือใหม่ มีส่วนอำนวยความสะดวกให้สำหรับมือเก่าหรือผู้ใช้ที่เชียวชาญแล้ว เช่น พวก Shortcut ต่างๆ นอกจากนั้นต้องสามารถสามารถดักจับ Error ได้หากผู้ใช้ทำผิดพลาด และรับมือกับ Error ได้ดี คือ ข้อความ Error ต้องชัดเจนเป็นภาษามนุษย์ที่ผู้ใช้อ่านเข้าใจและสามารถนำข้อความ Error มาบอกเราได้

2. คุณภาพด้านประสิทธิภาพ หรือ Efficiency ได้แก่ ไม่กิน CPU-time, ใช้ Memory น้อย, ใช้พื้นที่ใน Disk น้อย, ใช้ Network Bandwidth น้อย, สรุปคือใช้ Resource ให้น้อยที่สุดเท่าที่จะทำได้ ซึ่งข้อนี้เด็กจบใหม่มักจะขาดหายไปหรือลืมนึกไปเสมอๆ เวลาเราคิด Argorithm ขึ้นมาอย่าพึ่งรีบใช้ ให้ลองคิดดูดีๆเสียก่อนว่ายังมี Argorithm อื่นอีกหรือเปล่าที่สามารถทำงานได้เร็วกว่านี้ ใช้ Memory น้อยกว่านี้ ซึ่งตามปกติแล้วการแก้ไขปัญหาใดๆ มันจะมีวิธีแก้ไขมากกว่า 1 วิธีเสมอ ไม่จำเป็นต้องคิดจนครบ แต่ลองคิดให้ได้มากกว่า 1 วิธี ก็จะทำให้เรามีทางเลือกมากขึ้น

3. คุณภาพด้านความทนทาน หรือ Reliability คือ ต้องมีข้อผิดพลาดน้อยที่สุด ไม่เกิด Error บ่อยๆ แต่ถ้าเกิดข้อผิดพลาดขึ้นก็ต้องแก้ไขได้โดยง่าย และใช้เวลาแก้ไขน้อยที่สุด ข้อนี้สำคัญมากถ้าเป็น Software ที่เราพัฒนาให้ลูกค้าที่ต้องนำระบบเราไป Operate งานเอง เราต้องมีวิธีแก้ไขข้อผิดพลาดได้ง่ายที่สุด ไม่ใช่ว่าต้องเข้าไปแก้ไขข้อมูลใน Database เสียก่อนจากนั้นทำการ... และ... จึงจะหาย

4. คุณภาพด้านการบำรุงรักษา หรือ Maintainability คือ ระบบควรจะสามารถรองรับการเปลี่ยนแปลงที่จะเกิดขึ้นได้ และมีความยืดหยุนที่จะเปลี่ยนแปลงแก้ไข เช่น สามารถแก้ไข Configuration ของระบบได้โดยง่ายไม่ต้องทำการ Restart ระบบก่อน นอกจากนั้นควรจะมี Monitoring Tool ที่สามารถแสดงสถานะของระบบและสภาพแวดล้อมของระบบว่าอยู่ในสภาพที่ดีหรือไม่ ซึ่งจะเป็นสิ่งที่ช่วยลดปัญหาที่จะเกิดขึ้นได้มาก

5. คุณภาพด้านการนำมาใช้ใหม่ หรือ Resusability คือ ระบบที่พัฒนาขึ้นมาควรที่จะสามารถนำไปติดตั้งที่ระบบอื่นหรือสภาพแวดล้อมอื่นได้ง่าย โดยแก้ไขเล็กน้อยหรือไม่ต้องแก้ไขเลย เช่น Web Application ที่พัฒนาขึ้นควรที่จะสามารถติดตั้งได้ทั้งบน Tomcat หรือ WebLogic ก็ได้

ดังนั้น หากคุณอยากจะหา Option เสริมหรือ Value Added ในระบบให้แก่ลูกค้า อย่างเช่นในเรื่องเครื่องบินกระดาษที่ผมเสนอขึ้นมา คุณควรจะเสริมในแง่ของคุณภาพดีที่สุด เช่นถ้าเป็นเครื่องบินกระดาษ ก็ใช้กระดาษคุณภาพดี เบา กันน้ำ เวลาพับก็พับให้เรียบไม่ยับ วิธีการพับก็หาวิธีที่สามารถบินได้ไกลและลอยอยู่บนอากาศได้นาน เป็นต้น

2004/Jul/29

ผมมักเจอโปรแกรมเมอร์รุ่นใหม่หรือไม่ก็รุ่นน้องที่คณะถามอยู่บ่อยๆว่า "พี่คิดว่าภาษาอะไรแนวโน้มดีในอนาคต" "ภาษาไหนหางานง่าย" "พี่ ผม(หนู)จะเน้นภาษาไหนดี" ซึ่งผมมักจะถามกลับว่า "แล้วเธอ(นาย)อยากจะเชียวชาญคอมพิวเตอร์ด้านไหนละ? ด้าน Application ทั่วๆไป ด้าน Web Application ด้านบัญชี ด้านการเงิน ด้าน AI ด้าน Network หรือด้านอื่นๆ" คนที่โดนถามกลับส่วนมากมักอึงไปพักหนึ่ง ก่อนจะตอบว่า "ไม่รู้สิพี่ แบบไหนดีละ" ผมก็เลยให้คนถามไปทำการบ้านไปศึกษาแนวทางของแต่ละด้านว่ามีลักษณะงานอย่างไร แนวโน้มว่าอนาคตจะเป็น และที่สำคัญตัวเราเองน่ะชอบแบบไหนก่อน แล้วค่อยคิดว่าจะเน้นภาษาอะไรดี

ภาษาก็เป็นเครื่องมือในการพัฒนาระบบคอมพิวเตอร์เท่านั้นเอง...อาจารย์ของผม และหนังสือหลายๆเล่ม มักจะกล่าวว่าการสร้าง Software ก็เหมือนกับการตึกอาคาร ลองคิดกันเล่นๆว่าจริงหรือเปล่า ส่วนตัวผมค่อนข้างเห็นด้วย ตึกอาคารมีหลายแบบ ไม่ว่าจะเป็น คอนโด อาคารสำนักงาน บ้าน วัด พระราชวัง ก็เหมือนกับระบบคอมพิวเตอร์ที่มีหลายด้านไม่ว่าจะเป็น OS Network Internet AI ผู้ออกแบบสร้างตึกอาคาร แต่ละคนก็มีความเชียวชาญเฉพาะด้านไม่เหมือนกัน และเครื่องไม้เครื่องมือที่ใช้ในการสร้างก็ไม่เหมือนกัน ระบบคอมพิวเตอร์ก็เช่นกัน แต่ละระบบมีวิธีการคิดและวิธีการแก้ไขปัญหาที่แตกต่างกัน ดังนั้นภาษาที่ใช้ในการพัฒนาย่อมแตกต่างกัน

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

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