[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-faqs-production-change-release-management-th":3,"blog-post-production-change-release-management-th":28},[4,8,12,16,20,24],{"answer":5,"id":6,"question":7},"ในบทความนี้ change management หมายถึงการตัดสินใจว่าจะเปลี่ยนอะไร ใครอนุมัติ และอนุมัติจากหลักฐานอะไร ส่วน release management คือการนำการเปลี่ยนแปลงที่อนุมัติแล้วขึ้นระบบจริง รวมถึงการเลือกช่วงเวลา วิธีปล่อย และทางถอย สองเรื่องนี้แยกกันได้ในเอกสาร แต่ในทางปฏิบัติควรใช้คำขออนุมัติชุดเดียวกัน เพื่อให้คนอนุมัติเห็นทางถอยก่อนเซ็น","70ewe7b025kvws6","Change management กับ release management ต่างกันอย่างไร",{"answer":9,"id":10,"question":11},"ไม่จำเป็น เราแนะนำให้น้ำหนักของการอนุมัติตามความเสี่ยง งานที่ทำซ้ำตามรูปแบบเดิมและเคยผ่านมาหลายครั้งอนุมัติล่วงหน้าได้ งานทั่วไปผ่านคนอนุมัติที่ไม่ใช่คนเขียนการเปลี่ยนแปลง ส่วนงานที่แตะ schema ฐานข้อมูลหรือกระทบวิธีทำงานของผู้ใช้ควรได้คนดูมากกว่า ถ้าทุกงานต้องรอประชุมรายสัปดาห์ ทีมจะรวบงานไว้ปล่อยครั้งใหญ่ ซึ่งหาสาเหตุได้ยากกว่าเมื่อพัง","axmxga65pt5709n","ทุกการเปลี่ยนแปลงต้องเข้าที่ประชุมอนุมัติ (CAB) ไหม",{"answer":13,"id":14,"question":15},"เลือกทีละ release ตามสิ่งที่เปลี่ยน blue-green ต้องมี infrastructure สองชุดที่รับโหลด production ได้เต็ม จึงต้องจ่ายค่า infrastructure ขนาดเต็มสองชุด แต่สลับกลับได้เร็วถ้าฐานข้อมูลใช้ได้กับทั้งสองเวอร์ชัน canary ให้ผู้ใช้กลุ่มเล็กได้เวอร์ชันใหม่ก่อนแล้วขยายทีละขั้น จึงต้องแยกดูสัญญาณของแต่ละกลุ่มได้ ทั้งสองแบบค่อย ๆ ขยายการปล่อยและต้องรอ bake time ทุกขั้นเหมือนกัน","yd5c9xg74xfhsbg","Blue-green กับ canary ควรเลือกแบบไหน",{"answer":17,"id":18,"question":19},"เมื่อฟีเจอร์นั้นเปิดให้ผู้ใช้ทุกคนแล้วและผ่าน bake time โดยไม่มีปัญหา flag ทุกตัวเป็นทางแยกในโค้ด ถ้าปล่อยค้างไว้ จำนวนชุดค่า flag ที่เป็นไปได้จะมากเกินกว่าจะทดสอบครบ เราแนะนำให้กำหนดวันลบ flag ไว้ตั้งแต่ตอนสร้าง และนับการลบเป็นงานหนึ่งใน release ถัดไป ไม่ใช่งานที่รอให้มีเวลาว่าง","8yzcdhjfqor6j31","Feature flag ควรลบออกจากโค้ดเมื่อไหร่",{"answer":21,"id":22,"question":23},"ใช้เส้นทางฉุกเฉินที่กำหนดไว้ก่อนเริ่ม freeze แนวทาง Azure Well-Architected แนะนำให้กำหนดล่วงหน้าว่าใครอนุมัติการเร่งขั้นตอนได้และต้องเข้าเงื่อนไขอะไร ขั้นตอนทดสอบอาจเร่งได้ แต่ควรยังทำให้ครบเร็วที่สุดเท่าที่ทำได้ การไม่ปล่อยแพตช์เลยก็เป็นความเสี่ยงอีกแบบ ปฏิทิน freeze จึงไม่ควรมีโดยไม่มีเส้นทางนี้","clw3laqwzvni0jt","ช่วง freeze ถ้าต้องออกแพตช์ความปลอดภัยควรทำอย่างไร",{"answer":25,"id":26,"question":27},"คำถามที่ควรถามคือช่วงเฝ้าอาการหลังปล่อยจะมีคนเฝ้าอยู่หรือไม่ Azure แนะนำให้เว้น bake time ก่อนขยายไปผู้ใช้กลุ่มถัดไปเป็นชั่วโมงหรือเป็นวัน และเราเห็นว่าช่วงเฝ้าอาการหลังปล่อยก็ควรคิดเป็นหน่วยเดียวกัน ถ้าปล่อยงานใหญ่เย็นวันศุกร์ ช่วงที่ควรเฝ้าอาการจะตกไปอยู่ในวันหยุด สำหรับงานเล็กที่ถอยกลับได้ทันที ความเสี่ยงต่ำกว่า เราจึงดูที่ทางถอยและคนเฝ้าระบบ มากกว่าดูที่ชื่อวัน","dpse9coxvdf9k00","ควรปล่อยงานขึ้น production วันศุกร์ไหม",{"id":29,"parentId":30,"title":31,"excerpt":32,"content":33,"image":34,"date":35,"isoDate":36,"views":37,"tag":38,"categorySlug":39,"slug":40,"to":41,"readTime":42,"isHighlight":43,"sortOrder":44,"video":45,"video_id":45,"keywords":46},"adxi1s4b7mwhk51","tt80d2d0lbz5adr","Deploy ระบบขึ้น production ไม่ให้ล่มกลางวัน: blue-green, canary และ rollback","ก่อน deploy ระบบขึ้น production ตัดสินใจให้ครบ: ใครอนุมัติ ช่วงไหนควร freeze เลือก blue-green, canary หรือ feature flag และทำไม rollback schema ถึงยาก","\u003Cp>ถ้าคำขออนุมัติปล่อยงานขึ้น production ที่ส่งถึงคุณมีข้อความหลักอยู่บรรทัดเดียวว่า \"ทดสอบแล้ว ผ่าน\" คุณกำลังถูกขอให้เซ็นรับความเสี่ยงที่มองไม่เห็น คนเซ็นไม่เห็นว่ามีอะไรเปลี่ยนบ้าง และไม่เห็นว่าถ้าระบบมีปัญหาหลังปล่อยจะถอยกลับอย่างไร ลายเซ็นแบบนั้นไม่ได้ลดความเสี่ยงลงเลย มันแค่ย้ายความรับผิดชอบไปไว้กับคนที่เห็นข้อมูลน้อยกว่าใครในห้อง\u003C\u002Fp>\u003Cp>บทความนี้พูดถึง change management ด้าน IT คือการปล่อยงานประจำบนระบบที่มีคนใช้อยู่ทุกวัน เช่น แก้บั๊กหรือปรับ configuration ไม่ใช่การเปลี่ยนระบบทั้งระบบ ถ้าคุณกำลังย้ายข้อมูลจากระบบเก่าไประบบใหม่ เรื่องนั้นมีขั้นตอนเฉพาะของมัน ซึ่งเราเขียนไว้แยกใน\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.tech\u002Fblogs\u002Fdata-migration-validate-cutover\">บทความเรื่อง validate และ cutover ตอนเปลี่ยนระบบ\u003C\u002Fa>\u003C\u002Fp>\u003Ch2>การปล่อยงานขึ้น production ไม่มีครั้งไหนที่เสี่ยงต่ำ\u003C\u002Fh2>\u003Cp>แนวทาง \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fwell-architected\u002Foperational-excellence\u002Fsafe-deployments\">Safe deployment practices ใน Azure Well-Architected Framework\u003C\u002Fa> ของ Microsoft เขียนไว้ตรง ๆ ว่าไม่มีการ deploy ขึ้น production ครั้งไหนที่เสี่ยงต่ำ ไม่ว่าจะเป็นโค้ดแอปพลิเคชัน infrastructure as code, feature flag หรือ configuration ทุกอย่างนำความเสี่ยงเข้ามาในระบบ เอกสารเดียวกันแนะนำให้ทุกการ deploy ใช้รูปแบบมาตรฐานเดียวกัน และจัดการความเสี่ยงในระดับเดียวกันทุกครั้ง\u003C\u002Fp>\u003Cp>หนังสือ Site Reliability Engineering ของ Google ในบท \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fsre.google\u002Fsre-book\u002Frelease-engineering\u002F\">Release Engineering\u003C\u002Fa> ก็ระบุว่าการเปลี่ยน configuration อาจเป็นต้นเหตุของความไม่เสถียร เราเห็นว่าประโยคนี้สำคัญกับองค์กรที่แยกการแก้ configuration ออกไปทำนอกขั้นตอนปกติ เพราะคิดว่า \"ไม่ได้แก้โค้ด\" การเปลี่ยนค่าเชื่อมต่อฐานข้อมูลหรือเปิดปิดฟีเจอร์ผ่านหน้า admin ทำให้ระบบล่มได้ไม่ต่างจากโค้ดใหม่\u003C\u002Fp>\u003Cp>อีกข้อที่ Microsoft แนะนำคือ deploy ครั้งละน้อยแต่บ่อย ดีกว่า deploy ครั้งละมากแต่นาน ๆ ครั้ง เพราะการเปลี่ยนแปลงขนาดเล็กแก้ได้ง่ายกว่าเมื่อเกิดปัญหา ข้อนี้มีผลโดยตรงกับการออกแบบขั้นตอนอนุมัติ ซึ่งเราจะกลับมาพูดในหัวข้อข้อโต้แย้ง\u003C\u002Fp>\u003Ch2>Staging ต้องเหมือน production แค่ไหน ถึงจะเชื่อผลทดสอบได้\u003C\u002Fh2>\u003Cp>แนวทางของ Azure ระบุให้ deploy การเปลี่ยนแปลงไปที่ staging ที่สะท้อน production ก่อนขึ้นระบบจริง ในทางปฏิบัติ staging ที่เหมือน production ทุกจุดมีต้นทุนสูง และองค์กรอาจเลือกไม่จ่ายส่วนนั้น การตัดสินใจแบบนั้นรับได้ ถ้าทุกคนรู้ว่า staging ต่างจากของจริงตรงไหน\u003C\u002Fp>\u003Cp>ผลทดสอบบอกได้เท่าที่ staging เหมือนของจริง\u003C\u002Fp>\u003Cp>ความต่างที่เราตรวจเป็นอันดับแรกมีสี่กลุ่ม กลุ่มแรกคือเวอร์ชันของ runtime, ระบบปฏิบัติการ และฐานข้อมูล กลุ่มที่สองคือ configuration และสถานะของ feature flag ที่เปิดอยู่จริง กลุ่มที่สามคือการเชื่อมต่อกับระบบภายนอก ซึ่งบน staging อาจต่อกับ sandbox ของผู้ให้บริการแทนของจริง กลุ่มสุดท้ายคือปริมาณข้อมูล เพราะคำสั่งที่เร็วบนตารางหนึ่งหมื่นแถว อาจล็อกตารางนานหลายนาทีเมื่อเจอข้อมูลหลายล้านแถว\u003C\u002Fp>\u003Cp>สิ่งที่เราแนะนำคือเขียนความต่างเหล่านี้เป็นรายการไว้ในเอกสารระบบ และแนบไปกับคำขออนุมัติทุกครั้ง คนอนุมัติจะได้รู้ว่าผลทดสอบครั้งนี้พิสูจน์อะไรแล้ว และอะไรยังไม่ได้พิสูจน์ รายการนี้ยังเป็นแผนลงทุนไปในตัว เพราะความต่างข้อไหนทำให้ปล่อยงานพังซ้ำ ข้อนั้นคือจุดที่ควรจ่ายเพื่อทำให้ staging ใกล้ของจริงขึ้น\u003C\u002Fp>\u003Ch2>ใครอนุมัติ และอนุมัติจากหลักฐานอะไร\u003C\u002Fh2>\u003Cp>ในบท Release Engineering ของ Google SRE อธิบายว่าการปล่อยงานมีการควบคุมสิทธิ์หลายชั้น ซึ่งกำหนดว่าใครทำขั้นตอนไหนได้ ขั้นตอนที่ต้องผ่านการควบคุมรวมถึงการอนุมัติการแก้ซอร์สโค้ดและการ deploy release ใหม่ ระบบ release อัตโนมัติของ Google ยังสร้างรายงานการเปลี่ยนแปลงทั้งหมดใน release นั้น แล้วเก็บไว้คู่กับไฟล์ build เพื่อให้ทีมไล่หาสาเหตุได้เร็วขึ้นเมื่อ release มีปัญหา\u003C\u002Fp>\u003Cp>องค์กรไม่จำเป็นต้องมีระบบอัตโนมัติขนาดนั้น แต่หลักการเดียวกันใช้ได้ คำขออนุมัติที่เราอยากเห็นตอบคำถามหกข้อนี้ได้ก่อนมีใครเซ็น\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>release นี้เปลี่ยนอะไรบ้าง และแต่ละรายการมาจากคำขอหรือ ticket ไหน\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>ผลทดสอบบน staging เป็นอย่างไร และมีอะไรที่ staging พิสูจน์ไม่ได้\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>มีการเปลี่ยนโครงสร้างฐานข้อมูลหรือไม่ ถ้ามี ถอยกลับได้แค่ไหน\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>ถ้าหลังปล่อยมีปัญหา จะถอยด้วยวิธีไหน และใครเป็นคนตัดสินใจถอย\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>ผู้ใช้กลุ่มไหนได้รับผลกระทบ และแจ้งไปแล้วหรือยัง\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>ใครเฝ้าระบบหลังปล่อย และจะดูสัญญาณอะไรเพื่อบอกว่าปกติ\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>คนอนุมัติควรเป็นคนละคนกับคนเขียนการเปลี่ยนแปลง และควรมีเจ้าของระบบฝั่งธุรกิจร่วมตัดสินใจเมื่อการเปลี่ยนแปลงกระทบวิธีทำงานของผู้ใช้ เราแยกการเปลี่ยนแปลงเป็นสามระดับ งานที่ทำซ้ำตามรูปแบบเดิมและเคยผ่านมาหลายครั้งอนุมัติล่วงหน้าได้ งานทั่วไปต้องผ่านคนอนุมัติตามปกติ ส่วนงานฉุกเฉิน เช่น แพตช์ช่องโหว่ด้านความปลอดภัย ต้องมีเส้นทางเร็วที่กำหนดไว้ก่อนเกิดเหตุ\u003C\u002Fp>\u003Cp>ข้อสุดท้ายนี้ Azure Well-Architected ก็แนะนำไว้ ให้กำหนดล่วงหน้าว่าใครอนุมัติการเร่งขั้นตอนในกรณีฉุกเฉินได้ และต้องเข้าเงื่อนไขอะไรบ้าง ถ้าไม่กำหนดไว้ วันที่ฉุกเฉินจริง คนที่บังเอิญอยู่หน้าจอตอนนั้นจะเป็นคนตัดสินใจเอง\u003C\u002Fp>\u003Ch2>ช่วงเวลาปล่อยงาน และช่วงที่ไม่ควรแตะระบบ\u003C\u002Fh2>\u003Cp>การปล่อยงานตอนตีสองลดจำนวนผู้ใช้ที่ได้รับผลกระทบ แต่ก็ได้ทีมที่ง่วง และอาจติดต่อผู้ให้บริการภายนอกไม่ได้ถ้าต้องขอความช่วยเหลือ เราจึงเลือกช่วงที่ผู้ใช้น้อยและคนที่แก้ปัญหาได้ยังตื่นอยู่ครบ สำหรับระบบภายในองค์กรที่ใช้ในเวลาทำการ เราเห็นว่าช่วงเช้าก่อนเริ่มงานของวันที่ไม่ใช่วันพีคตอบเงื่อนไขนี้ได้ดีกว่ากลางดึก\u003C\u002Fp>\u003Cp>ช่วง freeze คือช่วงที่ตกลงกันว่าจะไม่ปล่อยงานใหม่ ยกเว้นงานฉุกเฉิน ตัวอย่างช่วงที่ควรพิจารณาคือช่วงปิดปีงบประมาณ วันปิดงบสิ้นเดือน วันจ่ายเงินเดือน และวันเปิดรับลงทะเบียนที่ประกาศไว้ล่วงหน้า ปฏิทินนี้ควรทำร่วมกับฝ่ายธุรกิจตั้งแต่ต้นปี เพราะทีมไอทีไม่ได้รู้ทุกวันที่สำคัญของหน่วยงานอื่น\u003C\u002Fp>\u003Cp>freeze มีต้นทุนของมันเอง แนวทางของ Azure เตือนว่าการไม่ deploy อัปเดตเป็นประจำก็สร้างความเสี่ยงอีกแบบ เช่น ช่องโหว่ด้านความปลอดภัยที่ต้องแก้ด้วยการ deploy ปฏิทิน freeze จึงต้องมาพร้อมเส้นทางฉุกเฉินที่ระบุชื่อคนอนุมัติไว้ชัด อีกความเสี่ยงที่ควรวางแผนไว้คือสัปดาห์ก่อนเริ่ม freeze อาจกลายเป็นช่วงที่หลายทีมรีบนำงานขึ้นระบบพร้อมกัน ซึ่งเสี่ยงกว่าวันปกติ\u003C\u002Fp>\u003Cp>อีกเรื่องที่ควรนับรวมคือเวลาสังเกตอาการหลังปล่อย Azure ใช้คำว่า bake time กับช่วงเวลาที่เว้นไว้ก่อนขยายการปล่อยไปยังผู้ใช้กลุ่มถัดไป และแนะนำให้วัดเป็นชั่วโมงหรือเป็นวัน ไม่ใช่เป็นนาที เราเห็นว่าช่วงเฝ้าอาการหลังปล่อยก็ควรคิดเป็นหน่วยเดียวกัน และนี่คือเหตุผลที่ไม่ควรปล่อยงานใหญ่ก่อนวันหยุดยาว เพราะช่วงที่ควรเฝ้าอาการจะตกไปอยู่ในวันที่คนเฝ้าไม่อยู่\u003C\u002Fp>\u003Ch2>ทางถอยของแต่ละ release: feature flag, blue-green หรือ canary\u003C\u002Fh2>\u003Cp>ทางถอยควรเลือกทีละ release ไม่ใช่เลือกครั้งเดียวแล้วใช้กับทุกงาน แนวทางของ Azure แบ่งการกู้คืนเมื่อ deploy มีปัญหาเป็นสามแบบ คือ rollback กลับไปยัง configuration ล่าสุดที่ใช้งานได้ roll forward ด้วยการแก้ปัญหากลางทางเช่นออก hotfix และสร้าง infrastructure ใหม่จาก configuration ล่าสุดที่ใช้งานได้ แต่ละเทคนิคด้านล่างทำให้ทางใดทางหนึ่งเร็วขึ้น และมีราคาที่ต้องจ่ายต่างกัน\u003C\u002Fp>\u003Cp>\u003Cstrong>Feature flag\u003C\u002Fstrong> ใช้เปิดหรือปิดฟีเจอร์ใน production แบบเลือกได้ Microsoft ระบุว่าช่วยควบคุมการเปิดโค้ดใหม่ และ rollback ได้เร็วเมื่อเกิดปัญหา ราคาที่เราเห็นคือทุก flag เป็นทางแยกในโค้ดที่ต้องกลับมาลบภายหลัง ถ้าไม่ลบ จำนวนชุดค่า flag ที่เป็นไปได้จะมากเกินกว่าจะทดสอบครบ และ flag ช่วยอะไรไม่ได้เลยถ้าสิ่งที่เปลี่ยนคือโครงสร้างฐานข้อมูลหรือ infrastructure\u003C\u002Fp>\u003Cp>\u003Cstrong>Blue-green\u003C\u002Fstrong> ตามคำอธิบายของ Azure คือการมี infrastructure สองชุดที่เหมือนกัน และทั้งสองชุดรับโหลด production ได้เต็ม ชุดหนึ่งรันเวอร์ชันปัจจุบัน อีกชุดรันเวอร์ชันใหม่ แล้วค่อย ๆ ย้าย traffic ไป ราคาที่ต้องจ่ายตรง ๆ คือค่า infrastructure ขนาดเต็มสองชุด ส่วนราคาที่มองไม่เห็นคือ ถ้าทั้งสองชุดใช้ฐานข้อมูลเดียวกัน การสลับกลับจะเร็วได้ก็ต่อเมื่อฐานข้อมูลยังใช้งานได้กับทั้งสองเวอร์ชัน\u003C\u002Fp>\u003Cp>\u003Cstrong>Canary\u003C\u002Fstrong> คือการให้ผู้ใช้กลุ่มเล็กได้เวอร์ชันใหม่ก่อน แล้วขยายไปกลุ่มที่ใหญ่ขึ้นทีละขั้นจนครบ Azure ระบุว่ามักใช้ feature flag เป็นตัวเลือกว่าใครได้เวอร์ชันใหม่ วิธีนี้จำกัดวงความเสียหายได้ดี แต่ต้องรอ bake time ทุกขั้น และต้องแยกดูสัญญาณสุขภาพของกลุ่มที่ได้เวอร์ชันใหม่ออกจากกลุ่มเดิมได้ ช่วงนั้นมีสองเวอร์ชันทำงานพร้อมกัน ข้อมูลที่เวอร์ชันใหม่เขียนจึงต้องอ่านได้ด้วยเวอร์ชันเก่า\u003C\u002Fp>\u003Cp>ทุกวิธีข้างต้นต้องอาศัยการรู้ว่าเมื่อไหร่ควรหยุด Azure แนะนำให้หยุดการปล่อยงานทันทีเมื่อตรวจพบปัญหา คำถามว่าสัญญาณไหนควรทำให้หยุดและควรปลุกคน เราเขียนไว้แยกใน\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.tech\u002Fblogs\u002Fmonitoring-alerting-what-to-page-on\">บทความเรื่องการตั้ง monitoring และ alert\u003C\u002Fa>\u003C\u002Fp>\u003Ch2>การเปลี่ยน schema ฐานข้อมูล ส่วนที่ถอยกลับไม่ได้ง่าย ๆ\u003C\u002Fh2>\u003Cp>แนวทางของ Azure ระบุว่าการ rollback การเปลี่ยนแปลง โดยเฉพาะฐานข้อมูล schema หรือส่วนที่เก็บสถานะ อาจซับซ้อน และแนะนำให้มีคำแนะนำที่ชัดเจนว่าจะจัดการการเปลี่ยนแปลงข้อมูลอย่างไร เหตุผลเห็นได้ชัดเมื่อยกตัวอย่าง\u003C\u002Fp>\u003Cp>ลองนึกภาพ release หนึ่งที่แยกช่องที่อยู่ช่องเดียวในฐานข้อมูลออกเป็นหลายช่อง พร้อมโค้ดใหม่ที่เขียนข้อมูลในรูปแบบใหม่ ผู้ใช้บันทึกข้อมูลไปสองชั่วโมง แล้วทีมพบบั๊กที่ต้องถอยกลับ ถ้าถอยเฉพาะโค้ด เวอร์ชันเก่าไม่รู้จักช่องใหม่ และมองไม่เห็นข้อมูลที่เพิ่งบันทึก ถ้า restore ฐานข้อมูลกลับไปก่อนปล่อยงาน ข้อมูลสองชั่วโมงนั้นหายไปทั้งหมด\u003C\u002Fp>\u003Cp>บริการฐานข้อมูลหลายตัวบน Azure มี point-in-time restore ซึ่ง Microsoft ระบุว่าช่วยในการ rollback ได้ เราเห็นว่าควรมองมันเป็นทางสุดท้าย เพราะการ restore พาทั้งฐานข้อมูลกลับไปยังจุดเวลาหนึ่ง ข้อมูลที่เขียนหลังจากนั้นต้องมีคนตามกลับมาเอง\u003C\u002Fp>\u003Cp>วิธีที่เราใช้คือแยกการเปลี่ยน schema ออกเป็นหลายขั้น ขั้นแรกเพิ่มโครงสร้างใหม่ไว้ข้างโครงสร้างเดิม ขั้นต่อมาให้โค้ดเขียนทั้งสองแบบและอ่านได้ทั้งสองแบบ เมื่อผ่าน bake time แล้วค่อยย้ายไปอ่านจากโครงสร้างใหม่อย่างเดียว การลบโครงสร้างเดิมเป็น release แยกที่ทำทีหลัง ทุกขั้นก่อนการลบยังถอยกลับได้ ต้นทุนคือจำนวน release ที่มากขึ้นและโค้ดชั่วคราวที่ต้องตามเก็บ\u003C\u002Fp>\u003Cp>การลบคือขั้นที่ย้อนไม่ได้ ในส่วนการปลดระบบ Azure แนะนำให้ถือว่าการลบทุกครั้งย้อนกลับไม่ได้ และให้เก็บ snapshot หรือ backup ก่อนลบ เราใช้หลักเดียวกันกับการลบคอลัมน์และตาราง และให้คำขออนุมัติของ release ประเภทนี้ระบุชัดว่าเป็นขั้นที่ไม่มีทางถอย\u003C\u002Fp>\u003Ch2>แจ้งผู้ใช้ก่อนเปลี่ยน ไม่ใช่หลังระบบมีปัญหา\u003C\u002Fh2>\u003Cp>เราเห็นว่าผู้ใช้ที่รู้ล่วงหน้าว่าหน้าจอจะเปลี่ยน แจ้งปัญหาได้ตรงกว่าผู้ใช้ที่เจอการเปลี่ยนแปลงเอง ข้อความแจ้งที่ดีตอบได้ว่าอะไรเปลี่ยนสำหรับเขา เปลี่ยนเมื่อไหร่ ช่วงไหนที่ระบบอาจใช้ไม่ได้ และถ้าเห็นอะไรผิดปกติให้ติดต่อใคร ส่งผ่านช่องทางที่ผู้ใช้อ่านจริง ไม่ใช่ช่องทางที่สะดวกกับทีมไอที\u003C\u002Fp>\u003Cp>เราแนะนำให้แจ้งทีม helpdesk หรือ call center ก่อนผู้ใช้ทั่วไป เพราะเขาคือคนที่ต้องตอบคำถามแรก สำหรับการเปลี่ยนแปลงที่กระทบขั้นตอนงาน เช่น ช่องในแบบฟอร์มที่เปลี่ยนไป ควรแจ้งเร็วพอให้หัวหน้างานปรับวิธีทำงานของทีมทัน การสื่อสารระหว่างระบบล่มเป็นอีกเรื่องหนึ่ง มีบทบาทและจังหวะของมันเอง ซึ่งอยู่ใน\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.tech\u002Fblogs\u002Fdr-plan-roles-and-decisions-during-an-outage\">บทความเรื่อง DR Plan และการตัดสินใจตอนระบบล่ม\u003C\u002Fa>\u003C\u002Fp>\u003Ch2>เมื่อไหร่ไม่ต้องทำขนาดนี้\u003C\u002Fh2>\u003Cp>ขั้นตอนทั้งหมดข้างต้นมีต้นทุน และไม่ใช่ทุกระบบที่คุ้ม ถ้าระบบของคุณเป็นระบบภายในที่มีผู้ใช้ไม่กี่สิบคน หยุดใช้งานช่วงสั้น ๆ ได้โดยแจ้งล่วงหน้า และไม่มีงานที่ต้องเสร็จตามเวลา การทำ blue-green ที่ต้องจ่ายค่า infrastructure สองชุดไม่คุ้ม canary ก็แทบไม่มีความหมาย เพราะกลุ่มผู้ใช้เล็กเกินกว่าจะเห็นสัญญาณอะไร สำหรับระบบแบบนี้ เราแนะนำแค่ checklist สั้น ๆ, backup ก่อนปล่อยงานที่ทดสอบ restore แล้ว และช่วงเวลาที่แจ้งผู้ใช้ไว้ ข้อเดียวที่เราไม่ลดคือการแยกขั้นเมื่อเปลี่ยน schema เพราะปัญหาข้อมูลหายไม่ได้เล็กลงตามขนาดระบบ\u003C\u002Fp>\u003Ch2>ข้อโต้แย้งที่ได้ยินบ่อย\u003C\u002Fh2>\u003Cp>ข้อโต้แย้งแรกคือ ขั้นตอนอนุมัติยิ่งเยอะ ทีมยิ่งปล่อยงานได้ช้าลง ข้อกังวลนี้มีเหตุผล ถ้าการอนุมัติหนึ่งครั้งต้องรอประชุมรายสัปดาห์ ทีมจะรวบงานหลายอย่างไว้ปล่อยครั้งเดียว ซึ่งสวนทางกับที่ Microsoft แนะนำให้ปล่อยครั้งละน้อยแต่บ่อย เมื่อ release ใหญ่ขึ้น การหาว่าอะไรทำให้พังก็ยากขึ้น ทางออกไม่ใช่ยกเลิกการอนุมัติ แต่ทำให้น้ำหนักของการอนุมัติตามความเสี่ยงของงาน งานที่ทำซ้ำตามรูปแบบเดิมอนุมัติล่วงหน้าได้ งานที่แตะ schema ต้องได้คนดูมากกว่า\u003C\u002Fp>\u003Cp>วิธีรู้ว่าขั้นตอนช่วยจริงหรือแค่ทำให้ช้า คือวัดทั้งสองด้าน \u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fdora.dev\u002Fguides\u002Fdora-metrics\u002F\">DORA\u003C\u002Fa> นิยาม deployment frequency ว่าจำนวนครั้งที่ deploy ในช่วงเวลาหนึ่ง หรือระยะห่างระหว่างการ deploy แต่ละครั้ง นิยาม change fail rate ว่าสัดส่วนของการ deploy ที่ต้องเข้าไปแก้ไขทันทีหลัง deploy ซึ่งมีแนวโน้มจบด้วยการ rollback หรือ hotfix และนิยาม failed deployment recovery time ว่าเวลาที่ใช้ฟื้นจาก deployment ที่ล้มเหลวและต้องเข้าแก้ไขทันที ถ้าขั้นตอนใหม่ทำให้ความถี่ลดลงโดยที่ change fail rate ไม่ดีขึ้น แปลว่าขั้นตอนนั้นเพิ่มแค่เวลารอ\u003C\u002Fp>\u003Cp>ข้อโต้แย้งที่สองคือ มี backup ทุกคืนอยู่แล้ว ถ้าพังก็ restore ได้ คำตอบอยู่ในหัวข้อ schema ข้างบน backup ช่วยให้ข้อมูลไม่หายทั้งหมด แต่ไม่ได้พาข้อมูลที่ผู้ใช้บันทึกหลังจุด backup กลับมา การมี backup จึงไม่ใช่ทางถอยของ release แต่เป็นตาข่ายชั้นสุดท้ายเมื่อทางถอยอื่นใช้ไม่ได้\u003C\u002Fp>\u003Ch2>จะเริ่มตรงไหน\u003C\u002Fh2>\u003Col>\u003Cli>\u003Cp>เขียนรายการความต่างระหว่าง staging กับ production ที่มีอยู่จริงวันนี้ แล้วแนบไปกับคำขออนุมัติทุกครั้ง\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>ตกลงแบบฟอร์มคำขออนุมัติที่ตอบคำถามหกข้อในหัวข้อการอนุมัติ และกำหนดว่าคนอนุมัติต้องไม่ใช่คนเขียนการเปลี่ยนแปลง\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>ทำปฏิทิน freeze ร่วมกับฝ่ายธุรกิจ พร้อมเส้นทางฉุกเฉินที่ระบุชื่อคนอนุมัติ\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>ให้ทุก release ระบุทางถอยและคนตัดสินใจถอยก่อนขออนุมัติ\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>แยก release ที่เปลี่ยน schema ออกเป็นขั้น และให้การลบข้อมูลหรือโครงสร้างเป็น release แยกเสมอ\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>เริ่มนับ deployment frequency, change fail rate และ failed deployment recovery time จากการปล่อยงานครั้งถัดไป\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Fol>\u003Cp>ถ้าระบบของคุณดูแลโดยผู้พัฒนาภายนอก ขั้นตอนเหล่านี้ควรเขียนไว้ในสัญญาหรือ TOR ตั้งแต่ต้น ไม่ใช่มาตกลงกันหลังปล่อยงานพังครั้งแรก เราเขียนเรื่องเงื่อนไขที่ควรอยู่ใน TOR ไว้ใน\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.tech\u002Fblogs\u002Ftor-conditions-for-a-maintainable-system\">บทความเรื่องเขียน TOR ให้ได้ระบบที่ดูแลต่อได้\u003C\u002Fa>\u003C\u002Fp>\u003Cdiv data-type=\"horizontalRule\">\u003Chr>\u003C\u002Fdiv>\u003Ch2>สรุป\u003C\u002Fh2>\u003Cp>ถ้าจะหยิบไปใช้อย่างเดียวจากบทความนี้ ให้ทุก release ตอบคำถามเดียวก่อนมีใครเซ็นอนุมัติ ว่าถ้าพังจะถอยอย่างไร และใครเป็นคนตัดสินใจถอย release ที่แตะ schema ฐานข้อมูลคือจุดที่คำตอบนี้อ่อนกว่าส่วนอื่น จึงควรได้เวลาคิดก่อนปล่อยมากกว่า release ทั่วไป\u003C\u002Fp>\u003Cp>หากต้องการคุยเรื่องขั้นตอนปล่อยงานของระบบที่ใช้งานอยู่ ติดต่อเราได้ที่ 088-983-9386 หรืออีเมล contact@superdev.tech สำนักงานของเราอยู่ที่บางกะปิ กรุงเทพฯ ถ้าคุยแล้วพบว่าขั้นตอนที่องค์กรของคุณมีอยู่เพียงพอกับระบบนั้นแล้ว เราจะบอกตรง ๆ และไม่เสนองานที่ไม่จำเป็น ข้อมูลเกี่ยวกับทีมและแพลตฟอร์มที่เราทำงานด้วยอยู่ที่\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.tech\u002F\">หน้าแรกของ Superdev\u003C\u002Fa>\u003C\u002Fp>","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fpbc_2128795511\u002Fadxi1s4b7mwhk51\u002Fcover_cover_6chvw4zviz.webp","30 กันยายน 2569","2026-09-30 06:16:47.069Z",104,"Enterprise","enterprise","production-change-release-management","\u002Fblogs\u002Fproduction-change-release-management",3,false,0,"",[47,48,49,50,51,52,53],"deploy ระบบ","blue-green deployment","canary deployment","rollback plan","release management","feature flag","change management"]