12 factor บัญญัติในการช่วยวางโครงสร้างระบบ


1. Codebase

  • ทำโค้ด ในเป็นชุดเดียว version control แต่จะเอาไป Deploy กี่ที่ก็ได้

2. Dependencies

  • มีการกำหนด package และ version ที่ใช้ภายใน package.json , composer.json

3. Config

  • มีการ กำหนด Environment Variables เพื่อใช้ภายใน แทนที่จะไปกำหนด ตรงๆ ภายในระบบ เพื่อความยืดยุ่นในการ deploy เพราะ เช่น ทุกๆ env มันอาจไม่ได้ มีusername password db เหมือนเครื่องที่ใช้อยู่
db.connect(process.env.username,process.env.password,err=>{
})

4. Backing services

  • service ต้องพร้อมถูกแทนที่เสมอ โดยที่ไม่กระทบโค้ด เช่น เพิ่มจากการ กำหนดแค่ config ตรงๆ เป็นเรียกจาก url เพิ่ม
db.connect(process.env.username,process.env.password,err=>{
})

บางทีแค่ Username Password อาจจะยังไม่พอ เพราะอาจมีฐานข้อมูลที่อยู่กันคนละ Network ได้ เราอาจจะต้องตั้งค่าด้วยวิธี connection string แทน mysql://127.0.0.1:33061/db

5. Build, release, run

  • แบ่ง stage deploy เพื่อ แก้ไข หรือ กู้คืน แก้ๆ -> build stage จริง -> run stage

6. Processes

  • ใช้การทำงาน ของ backing service แทนการ ใน process เช่น ทำ cache -> redis แล้วดึงข้อมูลจาก Redis แทน

7. Port binding

  • ทำงาน ผ่าน port แทนการใช้ web server

8. Concurrency

  • ใช้ process model หรือ มีการทำ scale เพื่อ การขยายที่ง่ายและ มีประสิทธิภาพมาขึ้น
มีการแบ่ง process การทำงานออกมาเป็นชนิดต่างๆ 
    -> web       => req,res 
    -> worker   => สำหรับงานประเภทที่ใช้เวลา เช่น อัพโหลดไฟล์ to S3

9. Disposability

  • ออกแบบแอพพลิเคชันให้พร้อมรองรับเหตุการณ์ที่คาดไม่ถึง Start ไว

10. Dev/prod parity

  • คือ ทำ env on dev and prod ให้คล้ายกันมากที่สุด

11. Logs

  • มีการทำ logs

12. Admin processes

  • เตรียมคำสั่งสำหรับการสร้าง process การงาน ใหม่แบบที่เราทำ -> migration

Ref:

12 factor