คอนฟิกไฟล์ – Flat File หรือ Database

พอดีช่วงนี้ศึกษา Web Application มากขึ้นกว่าแต่ก่อน ก็เลยได้เห็นเทรนด์นึงที่ในระยะหลังเกิดขึ้นอยู่ประมาณนึง ก็คือการเอา Database ไปเก็บ Configuration เอาซะเลย ด้วยความที่ว่าคนที่เขียน Enterprise Application ย่อมคุ้นเคยกับ SQL อยู่แล้ว (แต่สารภาพตรง ๆ ผมเกลียด SQL แบบสุด ๆ ไปเลย) แล้วก็มีข้อดีของ Database หลาย ๆ อย่าง เช่นเรื่องของ Consistency และอื่น ๆ

เอาจริง ๆ ผมค่อนข้างคัดค้านแนวความคิดนี้นะครับ ผมคิดว่าการเอา Database ไปเก็บ Configuration เป็นแนวความคิดที่แย่เอามาก ๆ แต่พอมาคิดหาเหตุผลก็ ... อืม ... ตอนแรกก็ช็อตไปเหมือนกันว่าจะตอบว่าอะไรดี 555

ผมคิดว่าประเด็นการเก็บ Configuration ใน Database มีปัญหาอยู่หลายอย่างนะ

  1. ความชัดเจน คือ ผู้ที่จะเข้าไปแก้ไข Configuration จะต้องเป็นคนที่มีความรู้ในตัว Implementation ของตัวที่อ่าน Configuration พอสมควร เพราะว่าไอ้การหาว่า คอนฟิกอะไร เก็บค่าอะไร ค่าเดิมคืออะไร หรืออะไรทำนองนี้จะต้องกระทำผ่าน Query (ซึ่งอาจจะเป็นได้ทั้ง SQL Query หรือ MapReduce Query หรืออะไรก็ว่าไป) ในขณะที่ถ้าเป็น Flat File เนี่ยเราสามารถประยุกต์เอาพวก markup file เช่น xml, json และอื่น ๆ มาใช้ได้ ทำให้มีความชัดเจนมากกว่า (แต่ทั้งนี้ก็ต้องมีความเข้าใจในระดับนึงเช่นกันแต่อาจจะต่ำกว่า)

  2. การดูแลรักษา เท่าที่ทราบ DBMS แทบจะทุกเจ้าบนโลกนี้ทำงานกับ Binary File และไม่ใช่แค่ไฟล์เดียวด้วย (บางทีก็เพียบเลย) ดังนั้นลืมเรื่องการเก็บ DB เอาไว้ใน Version Control ไปได้เลย เพราะว่า Version Control เนี่ยจะทำงานได้ดีกับไฟล์ที่เป็น Text File ซึ่งการใช้ Binary File นั้นทำให้เสียฟังก์ชันหลักอันหนึ่งของ Version Control นั่นคือการ Merge Version

    เช่น สมมติว่า ผมต้องการจะแก้คอนฟิกทั้งหมดที่มีการเปลี่ยนแปลงในช่วงเดือนมีนาคมทั้งหมด (ซึ่งจริง ๆ ก็มีอยู่แค่ 2-3 อัน) การใช้ Flat File กับ VCS นั้นสิ่งที่ต้องทำคือ เปิด Version History เลือกเวอร์ชันที่ต้องการเอาออก แล้วสั่ง remove change มันจะทำการเอาการเปลี่ยนแปลงในช่วงที่เราเลือกออกไปทั้งหมด (แล้วก็ Commit)

    ในขณะที่ถ้าเป็น DB สิ่งที่คุณต้องทำคือเขียน Query เข้าไปลบ/แก้ไข ซึ่งก็คือการ "ทำใหม่" นั่นแหละ เพราะว่าต้องทำการทบทวนความเปลี่ยนแปลงทั้งหมดในช่วงเวลานั้น แล้วก็เขียน update query เข้าไปแก้ นี่ไม่ใช่การเอาออกแล้วครับ นี่มันคือการสร้างของใหม่เข้าไปทับของเก่าต่างหาก

    อ้อ จะว่าไป ชื่อเล่นของ VCS คือ SCM (Software Configuration Manager) ครับ ดังนั้นมันจึงเก็บ Configuration Item ทั้งหมด (ซึ่งปรกติจะรวมเฉพาะโค๊ดและคอนฟิกไฟล์) น่ะครับ

    เหตุผลส่วนตัวของผมอีกอย่างคือหลาย ๆ ครั้งผมต้องทำงานกับโค๊ดหลาย ๆ เวอร์ชัน การใช้ DB เนี่ยการสลับคอนฟิกระหว่างเวอร์ชัน (อันนี้สำคัญนะครับ) จะทำได้ยากลำบากมาก เพราะมันคือการลบคอนฟิกเก่าแล้วโหลดตัวใหม่เข้าไป ... แค่อ่านก็ปวดหัวละครับ ในขณะที่ถ้าเป็น Flat File เนี่ยก็แค่สลับไฟล์ที่โหลดก็จเสร็จละ

    ทั้งนี้เราสามารถที่จะดูแล config ในรูปของ text file เดี่ยว ๆ เพื่อใช้ใน DB ได้เหมือนกันครับ ก็คือการสร้าง Master Create Query ขนาดยักษ์ที่ทำงานโดยการ Drop Table ทิ้งแล้วสร้างข้อมูลใหม่ตั้งแต่ 0 แต่ผมว่าสุดท้ายแล้วมันก็เยอะเกินไปอยู่ดี และโอกาสพลาดสูงกว่าด้วย เพราะว่าในไฟล์จะมีทั้งส่วนของคำสั่งและส่วนของข้อมูล ในขณะที่ถ้าเป็น flat file ธรรมดามันมีแต่ข้อมูลอย่างเดียวครับ

  3. ทรัพยากร คือ DBMS เนี่ยจริง ๆ แล้วมันเป็นซอฟต์ที่ค่อนข้างกินแรมน่ะครับ (ผมไม่ได้พูดถึงพวก Oracle นะ) ในขณะที่ flat file เนี่ยใช้พื้นที่เท่ากับขนาดของไฟล์เท่านั้นแหละ โดยส่วนตัวผมว่าการใช้ DB เนี่ยเป็นการขี่ช้างจับตั๊กแตนครับ เพราะตัวมันเองออกแบบมาเพื่อเก็บข้อมูลจำนวนมาก ๆ แต่เราเอามาเก็บคอนฟิกไฟล์ซึ่ง...อาจจะมีแค่ 1 record เท่านั้น ระบบที่ออกแบบมาสำหรับข้อมูลขนาดใหญ่มักจะไม่เหมาะกับงานเล็ก ๆ น่ะครับ

ทั้งนี้ถ้าเราใช้แต่ flat file เพียว ๆ เลยเราจะเจอปัญหาด้านการจัดการแทน เพราะถ้าเรามี server ที่ต้อง deploy เยอะ ๆ เนี่ยการไล่ตามอัพเดต config ในแต่ละเครื่องมันก็เป็นงานใหญ่อยู่นะ ผมคิดว่าเราสามารถที่จะสร้าง micro service สำหรับงานด้าน configuration โดยเฉพาะได้ โดยอาจจะเป็น REST Web Service สักตัวนึงที่มีหน้าที่คืนค่า Configuration ต่าง ๆ แทนที่จะให้ตัว Web App ไปโหลดมาจากตัวไฟล์โดยตรง (ก็อาจจะมี Network Performance Penalty อยู่นะแต่คิดว่าไม่ต่างกับ DB หรอกครับ)

อีกอย่างหนึ่งที่สามารถทำได้คือการใช้ VCS Trigger ก็คือเราสามารถสร้าง Trigger ให้มีการสั่งให้ Service ต่าง ๆ ทำการอัพเดต Configuration หลังจากการ Check-in ตัวไฟล์คอนฟิก ซึ่งก็ไม่ได้เป็นเรื่องยากอะไรเลยและโอกาสพลาดต่ำกว่าด้วย (อะไรที่มีมนุษย์มาเกี่ยวข้องเนี่ยพลาดได้หมดละครับ) Configuration จะถูกอ่านจากตัว VCS โดยตรง ทำให้ปัญหาพวก Consistency ระหว่าง Service นั้นหมดไปนั่นเอง

เอาจริง ๆ เลยผมว่า ... แนวคิดนี้เกิดจากพวกบ้า Database ที่เอะอะอะไรก็ใช้ Database (คนกลุ่มนี้มีจริงครับและเยอะด้วย ... เยอะในหลายความหมายนะ) ถ้ามองกันตามจริงผมว่า DB มีไว้เก็บข้อมูล และไม่ควรเก็บอะไรมากกว่านั้นครับ

Wutipong Wongsakuldej

Programmer, interested in frontend applications, music and multimedia.

Latest posts by Wutipong Wongsakuldej (see all)

Leave a Reply

Your email address will not be published. Required fields are marked *