เคยมั้ย? ที่ต้องซื้อตั๋วแล้วล่ม…

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

จากกรณี เดี่ยว 10 ของโน้ส อุดมหยุดขายบัตรกะทันหันหลังระบบขายบัตรล่ม เลยเอามาตั้งโจทย์เล็กๆ ว่า

“มีร้านเซเว่นอีเลฟเว่นที่มีทั้งหมด 8,500 สาขา มีจุดขายเคาน์เตอร์เซอร์วิสรวม 20,000 จุด มีระบบรองรับธุรกรรมสูงสุดระดับ 1,000,000 รายการภายใน 1 วัน”

พูดง่ายๆ คือ มีระบบที่รองรับได้วินาทีละ 11.57 รายการ ตลอดทั้งวัน

จากข่าวต้นเรื่องและโจทย์ทำให้รู้ว่า มีการทดสอบระบบขายบัตร เดี่ยว 10 พร้อมกัน 600 สาขาก็สามารถรับมือได้ แต่ไม่ได้บอกว่ารองรับได้กี่รายการต่อวินาที แต่ผู้ทดสอบลืมไปหรือเปล่าวระบบต้องรองรับ 20,000 จุด ไม่ใช่ 600 จุด ซึ่งทำให้เห็นว่า คนทดสอบระบบกำลังทดสอบระบบที่อัตราความสามารถระบบที่เพียง 1 ใน 30 ของระบบที่กำลังจะต้องไปใช้งานจริงในอนาคต

ลองนึกภาพตามง่ายๆ ว่ามีเซเว่นอีเลฟเว่นและจุดขายเคาน์เตอร์เซอร์วิส กดปุ่มซื้อพร้อมกันในวินาทีเดียวกัน ตอนเปิดขายบัตร เกือบ 20,000 จุดทั่วประเทศ ระบบที่รองรับได้วินาทีละ 11.57 รายการจะรองรับไหวไหม? เพราะระบบที่จะรองรับการทำรายการแบบนี้ได้ต้องพูดว่า “ระบบรองรับธุรกรรมสูงสุดระดับ 1,728,000,000 รายการภายใน 1 วัน” มันถึงจะถูกมากกว่า วิธีการแก้ไขที่ดีอีกวิธีคือการเลี่ยงยิงระบบโดยเพิ่มระบบคิว แบบคล้ายๆ กับจองตั๋วของ AirAsia ก็เป็นการแก้ปัญหาที่ถือว่าโอเคระดับหนึ่ง แต่ก็ยังทำให้ระบบโดยรวมจองตั๋วไปได้ตลอดจนจบทุกๆ รายที่เข้าไปจอง ส่วนอีกแบบคือใช้พวก Cloud service เอาก็ได้นะ ถ้าระบบที่คาดการณ์ไว้แล้วมันไม่ไหวก็ scale เอาได้ทันที แต่ส่วนตัวคิดว่า วิธีคิดของผู้ใหญ่ที่ตัดสินใจคงยังยึดติดกับอะไรเดิมๆ ก็ได้แต่ยืนไว้อาลัย เช่นเรื่องความลับของข้อมูลอะไรพวกนี้ เพราะงานระดับใหญ่แบบนี้มักเลือก Cloud ระดับ Enterprise ที่ค่อนข้าง private และมี NDA Agreement ที่ค่อนข้างเชื่อถือได้อยู่แล้ว

เรากลับมาที่ส่วนการออกแบบ ส่วนตัวผมเชื่อว่าระบบออกแบบให้รองรับคนเยอะ มันก็รองรับได้นะ คือจากระบบที่ผมดูแลและยังคงปรับปรุงระบบอยู่เรื่อยๆ นั้น การรองรับการทำงานแบบวินาทีต่อวินาทีที่มีการกระหน่ำเข้ามาแบบนี้ ปัญหานี้ส่วนใหญ่ที่เจอคือ I/O ระหว่าง DB กับ App มันตันครับ ผมเจอเยอะที่ว่า CPU ทำงานยังไม่ถึง 10% เลย แต่ process มันไปค้างที่ I/O ที่กำลังอ่าน-เขียนกันอยู่ โดยผมลอง top ดูรายการของ process จะเห็นเลยว่า process ฝั่ง App ถูก fork เป็นพันตัว แต่โดน waiting เพียบ เพราะมันไป waiting ข้อมูลที่รอจากฝั่ง DB ซึ่ง DB มันก็กำลังปิดงานที่กำลัง process อยู่เรื่อยๆ ซึ่งในระดับของ DB มันมีคิวอยู่แล้ว มันค่อยๆ ทำไปตามสภาพและความสามารถของ H/W ที่มีอยู่ แต่เมื่อคิวมันเริ่มตัน มันทำงานช้าจนไม่พอที่จะตอบสนองได้ทุก process ที่กำลังกระหน่ำเข้ามา มันเลยพาลทำล่มหมดเพราะหน่วยความจำไม่พอที่จะให้ process ของ App มันไปรอ waiting ได้ทุกตัวครับ

วิธีการแก้ของพวกนี้คือทำยังไงก็ได้ให้ I/O ฝั่ง DB มันทำงานให้ตอบหนองทันกับ process ฝั่ง App ให้ได้ เพื่อไม่ให้เกิด waiting ค้างในระบบนานจนล้นกว่าหน่วยความจำที่มีน่ะครับ เดี่ยวนี้ที่เจอๆ ก็มีหลายแบบนะ คือจับ DB ใช้ SSD ตัวแรงสุด ก็ช่วยได้มาก หรือเอา DB ใส่พวก MEMORY DB แทน ก็ทำงานได้เร็วมากๆ (แต่ตัวหลังไฟดับทีนี่งานเข้าเลยนะ) หรือจะแบ่งโหลดไปเลยก็ได้นะ โดยมี App จัดนึงในการคิวขั้นกลางว่า DB ตัวไหนรับโหลดของ process ID อะไรแบบนั้น ซึ่งถ้าเป็นแบบจองตั๋วแบบนี้แบ่งไปเป็น farm server เอาก็ได้นะ ตัวเลือกรอบการแสดง ก็รู้แล้วว่า farm server ตัวไหนจะรับโหลดรอบไหนไปแทน หรือจะให้ละเอียดกว่านั้นก็คือกระจายระดับ zone ของแต่ละรอบก็ทำให้ระบบโดนกระจายโหลดไปได้มาก ไม่ได้กระหน่ำเข้ามาที่ระบบตัวเดียว แล้วพาลทำล่มทั้งระบบ

คือวิธีการแก้ไขหรือวางแผนมีหลายรูปแบบมากๆ อยู่ที่ว่าตอนทดสอบระบบคิดถึงระดับความเลวร้ายที่สุดที่ระบบจะรองรับได้หรือไม่มากกว่า งานนี้คนทดสอบระบบโลกสวยเกินไปหน่อย  (╯°□°)╯︵ ┻━┻)

Nokia ปล่อยตัว update “Portico” ของ Windows Phone 8 สำหรับ Nokia Lumia 920 ในประเทศไทยแล้ว!

ผมนั่งกดๆ Phone update ทุกวันว่าเมื่อไหร่ Windows Phone 8 ตัวที่แก้ไขปัญหาหลายๆ ด้านและเพิ่มความสามารถที่มากขึ้นในรหัส "Portico" (8.0.10211.204) ของ Nokia Lumia 920 จะปล่อยมาให้ update ในประเทศไทยสักที

มาวันนี้ก็ได้อัพกับเค้าสักที กดๆ เล่นๆ มีให้ update เฉยเลย

แน่นอนว่ารายการอัพเดทก็ตามนี้ครับ Nokia และ Microsoft เริ่มปล่อยอัพเดต Lumia 820/920 ให้กับผู้ใช้ในสหรัฐและแคนาดาแล้ว

กด update มันก็บอกให้ต่อ Wi-Fi ก่อน เพื่อ download ตัว update มาลง

wp_ss_20130214_0002 

ระหวางรอก็ลุ้นๆ กันไป

0sFbXB

โหลดเสร็จแล้วก็ยืนยันการติดตั้งว่าจะติดตั้งแล้วนะ ….

wp_ss_20130214_0003

ระหว่างติดตั้งก็นั่งดูอะไรพวกนี้ไปก่อน ใจไม่ค่อยดีเห็นหน้าตาแบบนี้แล้ว เพราะเคย bricked มาก่อน ฮาๆๆๆ

77eSZz

เมื่อทุกอย่างเรียบร้อยก็ให้ตัว update มัน migrate ตัวข้อมูลกันสักพัก แล้วก็ restart สักรอบนึง

wp_ss_20130214_0004 wp_ss_20130214_0005

 

แล้วทุกอย่างก็จบ!!!

wp_ss_20130214_0006

รวมระยะเวลาทั้งหมดใช้เวลาประมาณ 30 – 40 นาทีเห็นจะได้ (เน็ตมันช้าก็ทำใจนิดนึง) และแบตก็แนะนำให้ชาร์จเต็มๆ 100% ไว้ก่อนแล้วกันครับ

WebKit != W3C

ผมนั่งงงว่า เมื่อไม่กี่ปีก่อนตอน IE6 คนใช้เยอะ ทุกคนหวังกับ W3C จะมาช่วยทำให้มันดีขึ้น เรียกร้องให้ใช้ Mozilla Firefox ที่เป็น Gecko Engine ที่ทำตาม W3C และ IE รุ่นใหม่ๆ ที่ Microsoft พยายามทำ Trident Engine ตัวใหม่ๆ ตาม W3C และในที่สุด IE10 ก็ทำตามมาตรฐาน W3C ได้ดีมากๆ รวมไปถึง Apple Safari และ Google Chrome ที่ใช้ WebKit Engine ที่ทำตาม W3C เช่นกัน

มาวันนี้ ทุกค่ายทำตาม W3C เป็นหลักแล้ว มีการสนับสนุน ออกคำแนะนำต่างๆ มากมาย และข่าวล่าสุด Opera ประกาศทิ้งเอนจิน Presto เปลี่ยนไปใช้ WebKit/Chromium ทั้งหมด ทำให้ค่าย Engine หลักในการพัฒนาตัว Render หน้าเว็บเหลือเพียง 3 Engine หลัก และทั้ง 3 ค่ายพยายามอย่างมากที่จะทำตาม W3C ทั้งหมด

แต่แล้วสิ่งที่ไม่คาดคิดก็คือ Developer วันนี้บอกว่า “ขอ WebKit ค่ายเดียวแล้วกัน ง่ายดี!!!”

ผมก็นั่งงงว่า อ้าว แล้วยังไงต่อดี แล้วเมื่อก่อนหวังกับ W3C ไว้ทำไมเมื่ออดีต สรุปทุกคนก็ติด loop ตัวเองซินะ แค่เปลี่ยนจาก IE6 มาเป็น WebKit แค่นั้น ><”

ปล. จะบอกว่า IE6 มันของ Microsoft มันก็ใช่ แต่ตอนนี้ทุกค่ายพยายามที่จะทำตามมาตรฐาน Open Stanard คือ W3C ก็ควรจะทำตามอันนี้หรือเปล่า ส่วน Engine ตัวไหนมันก็อีกเรืองหนึ่งหรือเปล่า อย่าลืมกรณี Java กับ MySQL ซิครับเหล่ามิตรรัก Developer ทุกท่าน ยังเจ็บไม่จำกันอีกเหรอ ><“

การให้ความสำคัญมันมีค่ามากกว่าตัวเงิน

ของที่ซื้อให้ผู้หญิงในวัน Valentine ที่ดูโก่งราคาสุดตัวและดูแพงไป แต่ความรู้สึกดีใจที่ได้รับมีค่าจนบางครั้งมีเงินเท่าไหร่ก็ซื้อไม่ได้ เหมือนตอนยื่น Nexus 7 ให้แม่ตอนปีใหม่นั้นแหละ คือมันกลายเป็นของมีค่ามากกว่ายื่นเงินเกือบหมื่นให้ไปซื้อเองมากเลยนะ สำหรับหลายๆ คน การซื่อของให้ มันแสดงให้เห็นว่าคุณให้ความสำคัญกับเค้าที่มากกว่าตีค่าเป็นตัวเงิน คือยื่นเงินมันง่ายกว่าเดินเลือกและซื้อแน่นอน

ในบ้านเราส่วนใหญ่แปะป้าย "ซื้อแล้วไม่รับเปลี่ยนหรือคืน" ถูกต้องหรือไม่?

อ้างอิงหลักฎหมายจาก http://www.lawyerthai.com/forum2/1578.html

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

———————————————————————————-
หลักกฎหมายที่เกี่ยวข้อง

ตาม ป.พ.พ.
– มาตรา 472 ในกรณีที่ทรัพย์สินซึ่งขายนั้นชำรุดบกพร่องอย่างหนึ่งอย่างใดอันเป็นเหตุให้เสื่อมราคาหรือเสื่อมความเหมาะสมแก่ประโยชน์อันมุ่งจะใช้เป็นปกติก็ดี ประโยชน์ที่มุ่งหมายโดยสัญญาก็ดี ท่านว่าผู้ขายต้องรับผิด
– มาตรา 483 คู่สัญญาซื้อขายจะตกลงกันว่าผู้ขายจะไม่ต้องรับผิดเพื่อความชำรุดบกพร่องหรือเพื่อการรอนสิทธิก็ได้

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