Backend Infrastructure คืออะไร? คู่มือฉบับสมบูรณ์
การเลือกโครงสร้างพื้นฐานแบ็กเอนด์ (backend infrastructure) ที่เหมาะสมมีความสำคัญอย่างยิ่งเมื่อคุณออกแบบแบ็กเอนด์ของคุณ เพราะสิ่งนี้สามารถส่งผลต่อประสิทธิภาพ ความยืดหยุ่น และความสามารถในการดูแลรักษาของแบ็กเอนด์ เพียงแค่ยกตัวอย่างบางส่วนเท่านั้น
ในบทความนี้ เราจะอธิบายว่าโครงสร้างพื้นฐานแบ็กเอนด์คืออะไร สำรวจโครงสร้างพื้นฐานแบ็กเอนด์ประเภทต่าง ๆ และกล่าวถึงปัจจัยสำคัญที่ต้องพิจารณาเมื่อคุณตัดสินใจเลือกใช้งาน
นอกจากนี้ เราจะดูวิธีสร้างโครงสร้างพื้นฐานแบ็กเอนด์โดยใช้ Back4app
Contents
Objectives
เมื่อจบบทความนี้ คุณจะสามารถ:
- อธิบายได้ว่าโครงสร้างพื้นฐานแบ็กเอนด์คืออะไร
- พูดถึงโครงสร้างพื้นฐานแบ็กเอนด์ประเภทต่าง ๆ (รวมถึง IaaS, PaaS และ BaaS)
- เลือกโครงสร้างพื้นฐานแบ็กเอนด์ที่เหมาะสมกับโปรเจกต์ของคุณ
- สร้างแบ็กเอนด์ด้วย Back4app
What is a backend infrastructure?
โครงสร้างพื้นฐานแบ็กเอนด์ คือการผสมผสานระหว่างซอฟต์แวร์และฮาร์ดแวร์ที่สนับสนุนระบบแบ็กเอนด์ ซึ่งรวมถึงเซิร์ฟเวอร์ คอนเทนเนอร์ ส่วนประกอบเครือข่าย ไฟร์วอลล์ และทรัพยากรอื่น ๆ
โครงสร้างพื้นฐานแบ็กเอนด์มีหน้าที่รับผิดชอบเรื่องความพร้อมใช้งาน (high availability) การขยายตัว (scaling) การกระจายโหลด (load balancing) ความปลอดภัย การกำหนดเส้นทาง (routing) และอื่น ๆ โครงสร้างพื้นฐานแบ็กเอนด์จึงควรถูกออกแบบให้มอบประสบการณ์การใช้งานที่ราบรื่นแก่ผู้ใช้
What to consider when choosing a backend infrastructure?
มาดูปัจจัยสำคัญที่ควรพิจารณาเมื่อเลือกโครงสร้างพื้นฐานแบ็กเอนด์
Speed
ความเร็วเป็นหนึ่งในปัจจัยสำคัญของโครงสร้างพื้นฐานแบ็กเอนด์ ผู้ใช้ของคุณต้องการให้แอปทำงานได้ราบรื่นมากที่สุด ดังนั้นจึงจำเป็นต้องปรับการสื่อสารระหว่างฝั่งไคลเอนต์กับแบ็กเอนด์ให้มีประสิทธิภาพ
เพื่อลดความรู้สึกว่าการสื่อสารเกิดความหน่วง คุณสามารถใช้เทคนิคต่าง ๆ เช่น การแสดงโครงร่าง (skeleton screens) แถบโหลด (loading bars) และเคล็ดลับบนหน้าจอผู้ใช้งาน (tips & tricks) ใน UI
ความเร็วเป็นหนึ่งในปัจจัยที่สำคัญที่สุดสำหรับ SEO เช่นกัน
Flexibility
ความยืดหยุ่นหมายถึงภาษาโปรแกรม เฟรมเวิร์ก และเทคโนโลยีอื่น ๆ (เช่น ฐานข้อมูล) ที่โครงสร้างพื้นฐานแบ็กเอนด์รองรับ เมื่อคุณเลือกโครงสร้างพื้นฐานแบ็กเอนด์ จึงควรเลือกสิ่งที่รองรับเทคโนโลยีได้หลากหลาย
Scalability
คุณควรคำนึงถึงการขยายตัว (scalability) ตั้งแต่เริ่มพัฒนาแอป คิดถึงวิธีที่แอปของคุณจะถูกใช้งานว่าจะมีผู้ใช้จำนวนคงที่ หรืออาจมีจำนวนผู้ใช้เพิ่มขึ้นอย่างรวดเร็วเป็นบางครั้ง
โครงสร้างพื้นฐานแบ็กเอนด์ต้องถูกสร้างขึ้นเพื่อรองรับภาระงานจำนวนมากได้อย่างมีประสิทธิภาพ เพื่อประหยัดค่าใช้จ่ายของเซิร์ฟเวอร์ ควรจะสามารถสร้างและลบอินสแตนซ์ของแอปพลิเคชันได้แบบไดนามิก
Maintainability
การพัฒนาและเปิดตัวแอปของคุณเป็นเพียง 80% ของงานเท่านั้น หลังจากนั้นคุณต้องใช้เวลาอย่างมากในการดูแลรักษาแอป ไม่ว่าจะเป็นการอัปเดตซอฟต์แวร์ของเซิร์ฟเวอร์หรือติดตั้งแพตช์ความปลอดภัย กระบวนการเหล่านี้ควรทำได้อย่างง่ายดาย
เลือกโครงสร้างพื้นฐานแบ็กเอนด์ที่มีระบบ CI/CD ในตัว หรือไม่ก็พัฒนาระบบของคุณเอง
DevOps Requirements
โครงสร้างพื้นฐานแบ็กเอนด์บางประเภทอาจใช้งานได้ยากกว่า ควรเลือกโครงสร้างพื้นฐานแบ็กเอนด์ที่คุณมีเวลาและทรัพยากรเพียงพอในการจัดการ หากคุณตัดสินใจใช้โครงสร้างพื้นฐานในระดับที่ต่ำกว่า เช่น IaaS คุณจะต้องมีทีม DevOps เฉพาะทางมาดูแล
Security
คุณมีหน้าที่รับผิดชอบโดยตรงในการรักษาข้อมูลของผู้ใช้ให้ปลอดภัย ท่ามกลางการโจมตีทางไซเบอร์ที่เพิ่มมากขึ้น คุณจำเป็นต้องมั่นใจว่าโครงสร้างพื้นฐานแบ็กเอนด์ของคุณปฏิบัติตามมาตรฐานความปลอดภัยล่าสุด
ใช้รหัสผ่านที่มีความซับซ้อน สร้างขึ้นแบบสุ่ม, ตั้งค่าไฟร์วอลล์, อย่าใช้งานซอฟต์แวร์ที่ไม่น่าเชื่อถือบนเซิร์ฟเวอร์ และตรวจสอบความปลอดภัยสม่ำเสมอ เป็นต้น
Types of backend infrastructure
คุณสามารถใช้เซิร์ฟเวอร์ของคุณเอง (หรือที่เรียกกันว่าโครงสร้างพื้นฐานดั้งเดิม) หรือใช้ประโยชน์จากโครงสร้างพื้นฐานระบบคลาวด์ (cloud infrastructure) ในการดีพลอยแบ็กเอนด์
ในช่วงทศวรรษที่ผ่านมา หลายบริษัทหันมาใช้โมเดลระบบคลาวด์กันมากขึ้นเพราะช่วยประหยัดทั้งเวลาและต้นทุน
เรามาวิเคราะห์โมเดลที่ได้รับความนิยมมากที่สุดกัน
Infrastructure as a Service or IaaS
Infrastructure as a Service (IaaS) เป็นโมเดลการประมวลผลแบบคลาวด์ที่นามธรรมในระดับต่ำที่สุด ในโมเดลนี้ ผู้ให้บริการคลาวด์จะให้ทรัพยากรการประมวลผลในสภาพแวดล้อมแบบเวอร์ชวลไลซ์ เช่น เซิร์ฟเวอร์ ที่จัดเก็บข้อมูล ระบบปฏิบัติการ (OS) และส่วนประกอบเครือข่าย
IaaS มีมาตั้งแต่ปี 2010 และยังคงเป็นโมเดลการประมวลผลแบบคลาวด์ที่ได้รับความนิยมมากที่สุด ข้อดีของมันคือการขยายตัวที่ดี (scalability) มีระดับการควบคุมสูง และคุ้มราคา ส่วนข้อเสียคือการจัดการที่ซับซ้อน และมีค่าใช้จ่ายในการดูแลรักษาที่สูงกว่าโมเดลคลาวด์อื่น ๆ
ตัวอย่างผู้ให้บริการ IaaS ที่นิยม ได้แก่
Platform as a Service or PaaS
Platform as a Service (PaaS) คือโมเดลการประมวลผลแบบคลาวด์ที่มอบสภาพแวดล้อมสำหรับการพัฒนา การจัดการ และการส่งมอบแอปพลิเคชันได้อย่างเป็นมิตรกับผู้ใช้ นอกจากนี้ยังมีเครื่องมือในตัวสำหรับการพัฒนาแอป ทำให้การเปิดตัวแอปเป็นไปอย่างรวดเร็ว
PaaS ช่วยให้การจัดการโครงสร้างพื้นฐานเป็นเรื่องง่ายขึ้น นำไปสู่การนำแอปเข้าสู่ตลาดได้เร็วขึ้น มีความปลอดภัยมากขึ้น ประหยัดต้นทุน ขยายตัวได้ดี มีความพร้อมใช้งานสูง และลดการเขียนโค้ดลง แต่ในทางกลับกัน อาจทำให้คุณยึดติดกับขีดความสามารถของผู้ให้บริการ (vendor lock-in) และมีข้อจำกัดในด้านความยืดหยุ่นและการควบคุม
ตัวอย่าง PaaS ที่เป็นที่นิยม เช่น
Backend as a Service or BaaS
Backend as a Service (BaaS) ช่วยให้การพัฒนาฝั่งเซิร์ฟเวอร์และการจัดการโครงสร้างพื้นฐานบนคลาวด์เป็นไปโดยอัตโนมัติ มีฟีเจอร์ต่าง ๆ เช่น ฐานข้อมูลเรียลไทม์ การจัดการผู้ใช้ การยืนยันตัวตน (authentication) การแจ้งเตือน (notifications) และการเชื่อมต่อกับโซเชียลมีเดีย เป็นต้น
BaaS ปลดปล่อยนักพัฒนาออกจากการจัดการงานแบ็กเอนด์ ทำให้สามารถโฟกัสด้านฟรอนต์เอนด์และแกนหลักของธุรกิจได้ BaaS ผสานข้อดีของ IaaS และ PaaS เข้ากับการนามธรรมฝั่งแบ็กเอนด์ ส่งผลให้เปิดตัวได้อย่างรวดเร็วและคุ้มค่า แต่ข้อเสียคือการควบคุมระบบได้น้อย มีความเสี่ยงที่จะโดนผูกขาดโดยผู้ให้บริการ (vendor lock-in) และค่าใช้จ่ายอาจสูง
แพลตฟอร์ม BaaS ที่ผมชอบใช้งานส่วนตัว ได้แก่:
Containers as a Service or CaaS
Containers as a Service (CaaS) คือโมเดลการประมวลผลแบบคลาวด์สำหรับอัปโหลด สร้าง ขยาย และจัดการคอนเทนเนอร์ โดยทั่วไปแล้ว CaaS จะมี container runtime, container registry, ระบบปรับขนาดโดยอัตโนมัติ, ระบบ CI/CD ในตัว และ load balancing เป็นต้น
CaaS ช่วยให้การจัดการคอนเทนเนอร์เป็นเรื่องง่ายขึ้น ไม่ต้องกังวลเกี่ยวกับโครงสร้างพื้นฐานเบื้องหลัง อีกทั้งยังสนับสนุนการพัฒนาแบบ Agile เอื้อต่อสถาปัตยกรรมไมโครเซอร์วิส และช่วยเร่งการสร้างแอปพลิเคชันที่ขยายตัวได้ดี
ตัวอย่าง CaaS ได้แก่:
How to create a backend infrastructure?
ในส่วนนี้ของบทความ เราจะสร้างโครงสร้างพื้นฐานแบ็กเอนด์โดยใช้ Back4app
What is Back4app?
Back4app เป็นแพลตฟอร์ม Backend as a Service (BaaS) ที่ยอดเยี่ยม มันช่วยให้คุณสร้างแบ็กเอนด์สำหรับเว็บและแอปพลิเคชันบนมือถือได้อย่างรวดเร็ว
แพลตฟอร์มนี้พัฒนาขึ้นด้วยเทคโนโลยีโอเพนซอร์สและมีฟีเจอร์มากมาย เช่น ฐานข้อมูลแบบสเปรดชีต การจัดเก็บไฟล์ การจัดการผู้ใช้ การยืนยันตัวตน (authentication) API ที่สร้างให้อัตโนมัติ การแจ้งเตือน และอื่น ๆ อีกมาก
Back4app สามารถช่วยให้คุณลดระยะเวลาการพัฒนาและเปิดตัวได้อย่างมาก เพราะคุณจะสามารถโฟกัสกับงานหลักของธุรกิจได้มากขึ้น แทนที่จะต้องกังวลกับแบ็กเอนด์หรือโครงสร้างพื้นฐานเบื้องหลัง
นอกจากนี้ คุณยังไม่จำเป็นต้องมีวิศวกร DevOps เฉพาะทาง และค่าบำรุงรักษาจะน้อยลง
จุดเด่นที่สุดของ Back4app คือมีแพลนฟรีให้ลองใช้งาน ซึ่งเพียงพอสำหรับทดสอบแพลตฟอร์มหรือโฮสต์โปรเจกต์เล็ก ๆ หากแอปของคุณประสบความสำเร็จ คุณสามารถอัปเกรดเป็น แพลนแบบชำระเงิน ได้
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Back4app โปรดดูที่ What is Back4app?
Project Overview
เพื่อแสดงตัวอย่างการสร้างแบ็กเอนด์ เราจะสร้างระบบ e-commerce แบบง่าย ๆ ซึ่งสามารถจัดการผลิตภัณฑ์ (products) หมวดหมู่ (categories) และออเดอร์ (orders) ได้
ER diagram ของโปรเจกต์จะมีหน้าตาแบบนี้:
เราจะสร้างแบ็กเอนด์ขึ้นโดยเขียนโค้ดให้น้อยที่สุด และสาธิตวิธีใช้งานบนฝั่งไคลเอนต์ผ่าน SDKs, REST API และ GraphQL API
Create App
หากต้องการทำตามตัวอย่างนี้ คุณต้องมี บัญชี Back4app หากยังไม่มี สามารถ สมัครใช้งานฟรีได้เลย!
เมื่อเข้าสู่ระบบ Back4app แล้ว คุณจะเห็นรายการแอปของคุณ ให้คลิกปุ่ม “Build app” เพื่อเริ่มสร้างแอป
จากนั้นเลือก “BaaS” เพราะเรากำลังจะตั้งค่าแบ็กเอนด์
ตั้งชื่อแอป เลือก “NoSQL” และสร้างแอป
Back4app จะใช้เวลาสักครู่ในการตั้งค่าทุกอย่างให้คุณ มันจะจัดการเลเยอร์ของแอป ฐานข้อมูล แบ็กอัป สเกลลิ่ง และอื่น ๆ ให้ทั้งหมด
เมื่อสร้างแอปเสร็จแล้ว คุณจะถูกนำไปที่ฐานข้อมูลเรียลไทม์ของแอป
Setup the Database
ในตอนนี้ เมื่อเราได้สร้างแอปขึ้นมาแล้ว ก็ถึงเวลาตั้งค่าฐานข้อมูล
ก่อนอื่น เราต้องสร้างคลาส (class) เพื่อเก็บข้อมูลในฐานข้อมูล คุณอาจมองว่าคลาสเปรียบเสมือนตาราง (ในเชิง SQL) หรือโมเดล (ในเชิง ORM) โดยแต่ละคลาสจะมีฟิลด์ 4 ช่องต่อไปนี้อยู่แล้ว:
+-------------+-------------+------------------------------------------+
| Type | Name | Description |
+-------------+-------------+------------------------------------------+
| String | objectId | Object's unique identifier |
+-------------+-------------+------------------------------------------+
| Date | updatedAt | Date time of the last update |
+-------------+-------------+------------------------------------------+
| Date | createdAt | Date time of creation |
+-------------+-------------+------------------------------------------+
| ACL | ACL | Access Control List |
+-------------+-------------+------------------------------------------+
ดังที่ได้กล่าวไปในภาพรวมของโปรเจกต์ เราจะมีทั้งหมดสามคลาส สร้างคลาสแรกโดยคลิกปุ่ม “Create class” ที่แถบด้านข้าง ตั้งชื่อว่า ProductCategory
:
เพิ่มฟิลด์ดังต่อไปนี้:
+-----------------------------+-------------+---------------+----------+
| Type | Name | Default value | Required |
+-----------------------------+-------------+---------------+----------+
| String | name | <leave blank> | yes |
+-----------------------------+-------------+---------------+----------+
| String | description | <leave blank> | no |
+-----------------------------+-------------+---------------+----------+
จากนั้นทำขั้นตอนเดียวกันเพื่อสร้างคลาส Product
:
+-----------------------------+-------------+---------------+----------+
| Type | Name | Default value | Required |
+-----------------------------+-------------+---------------+----------+
| String | name | <leave blank> | yes |
+-----------------------------+-------------+---------------+----------+
| String | description | <leave blank> | no |
+-----------------------------+-------------+---------------+----------+
| Relation -> ProductCategory | categories | <leave blank> | no |
+-----------------------------+-------------+---------------+----------+
| Number | price | 0 | yes |
+-----------------------------+-------------+---------------+----------+
เราใช้
Relation
datatype เพื่อจัดการความสัมพันธ์แบบ many-to-many
สุดท้ายสร้างคลาส Order
:
+-----------------------------+------------+---------------+----------+
| Data type | Name | Default value | Required |
+-----------------------------+------------+---------------+----------+
| Pointer -> Product | product | <leave blank> | yes |
+-----------------------------+------------+---------------+----------+
| String | cFirstName | <leave blank> | yes |
+-----------------------------+------------+---------------+----------+
| String | cLastName | <leave blank> | yes |
+-----------------------------+------------+---------------+----------+
| String | cAddress | <leave blank> | yes |
+-----------------------------+------------+---------------+----------+
| Number | delivered | false | yes |
+-----------------------------+------------+---------------+----------+
เราใช้
Pointer
datatype เพื่อจัดการความสัมพันธ์แบบ one-to-many
เมื่อสร้างเสร็จแล้ว คุณจะเห็นคลาสเหล่านี้ปรากฏที่แถบด้านข้าง
Populate the database
ต่อไป มาใส่ข้อมูลลงในฐานข้อมูลกันเถอะ
เริ่มจากสร้าง product category, product, และ order (ตามลำดับ) หากคุณไม่มีไอเดีย สามารถนำเข้าไฟล์ fixture ตัวอย่างได้เลย
หากต้องการนำเข้าไฟล์ JSON ให้ใช้เมนู “More option > Import > Class data > Select file” โดยเรียงลำดับการนำเข้าไฟล์ JSON ดังนี้:
- ProductCategory.json
- Product.json
- _Join꞉categories꞉Product.json
- Order.json
หลังจากทำเสร็จแล้ว คุณจะมี products, categories และ orders อยู่ในฐานข้อมูล ขั้นตอนนี้มีความสำคัญ เพราะเราต้องใช้ข้อมูลเหล่านี้ในการทดสอบแบ็กเอนด์ในภายหลัง
Secure the Database
โดยค่าเริ่มต้น คลาสทั้งหมดในฐานข้อมูลจะถูกสร้างในโหมด “Protected” ซึ่งในโหมดนี้ วิธีเดียวที่จะโต้ตอบและจัดการอ็อบเจกต์ได้คือใช้ master key เท่านั้น ซึ่งไม่เหมาะในการอนุญาตให้ไคลเอนต์เข้าถึงหรือจัดการอ็อบเจกต์ได้
หากต้องการให้ไคลเอนต์เข้าถึง จัดการ หรือดึงข้อมูลอ็อบเจกต์ได้ เราต้องลดข้อจำกัดบางอย่างลง โดย Back4app/Parse มี 2 กลไกในการกำหนดสิทธิ์เข้าถึง:
- Class-level permissions (CLPs)
- Access-level permissions (ACLs)
CLPs ช่วยจำกัดการเข้าถึงในระดับคลาส ในขณะที่ ACLs ช่วยจำกัดการเข้าถึงในระดับอ็อบเจกต์ โดยทั้งสองแบบสามารถระบุสิทธิ์ให้เฉพาะ Role
หรือ User
ได้
เลือกคลาส Product
ที่แถบด้านข้าง แล้วคลิกที่คำว่า “Protected” ด้านบนของหน้าจอ จากนั้นแก้ไข CLPs ตามภาพ:
ทำขั้นตอนเดียวกันกับคลาส ProductCategory
จากนั้นอัปเดต CLPs สำหรับคลาส Order
ด้วย:
สังเกตให้ดีว่า เราได้เปิดสิทธิ์
Create
ให้กับคลาสOrder
ด้วย
การตั้งค่า CLPs แบบใหม่นี้จะอนุญาตให้ผู้ใช้ที่ยังไม่ได้ล็อกอิน (unauthenticated) สามารถดึงและค้นหา Product
และ ProductCategory
ได้ แต่ไม่สามารถแก้ไขข้อมูลได้ ส่วนคลาส Order
นั้น ผู้ใช้สามารถสร้างออเดอร์ใหม่ได้ด้วย
หากต้องการเรียนรู้เพิ่มเติม โปรดดู Parse Server Security
Admin App
ขณะนี้ วิธีเดียวที่จะจัดการอ็อบเจกต์ในฐานข้อมูลคือผ่านหน้า Database View ซึ่งอาจไม่สะดวกสำหรับผู้ใช้ที่ไม่ใช่สายเทคนิค (non-tech users) อีกทั้งยังเปิดสิทธิ์ให้แก้ไขได้กว้างเกินไปและเสี่ยงต่อความผิดพลาด
โชคดีที่ Back4app มีฟีเจอร์ “Admin App” ซึ่งช่วยให้คุณเปิดใช้งานหน้าแผงควบคุม (dashboard) สำหรับจัดการฐานข้อมูลได้อย่างง่ายดาย
เปิดใช้ได้โดยไปที่ “More > Admin App” ในแถบด้านข้าง จากนั้นคลิก “Enable”:
Back4app จะแจ้งให้คุณตั้งชื่อผู้ใช้ รหัสผ่าน และซับโดเมน ผมตั้งค่าเป็นประมาณนี้:
user: root
pass: complexpassword123
subdomain: https://binfra.admin.back4app.com/
เท่านี้ก็เรียบร้อย
คุณสามารถเข้าถึงแผงควบคุม (admin panel) ได้โดยคลิก “Admin App URL” จะมีหน้าต่างเบราว์เซอร์ใหม่เปิดขึ้นมาและขอให้คุณล็อกอินด้วยข้อมูล admin เมื่อเข้าสู่ระบบแล้ว คุณสามารถสร้าง แก้ไข หรือลบอ็อบเจกต์ได้เลย
ลองใช้งานดูเพื่อทำความคุ้นเคยกับแดชบอร์ด
Cloud Code
Back4app ช่วยให้คุณสามารถรันโค้ด JavaScript ที่กำหนดเองผ่านสิ่งที่เรียกว่า Cloud Code โดย Cloud Code ช่วยให้คุณกำหนดฟังก์ชันที่รันได้เมื่อ Parse เรียกใช้ผ่าน HTTP requests หรือกำหนดตารางเวลารันเป็นระยะ ๆ ได้ นอกจากนี้ Cloud Code ยังสามารถใช้สร้างเว็บแอปพลิเคชันด้วย Express ได้ด้วย
Cloud Code Function
สมมติว่าเราต้องการฟังก์ชัน Cloud Code เพื่อนับยอดขาย (sales) ปัจจุบัน
ก่อนอื่น ให้ไปที่ “Cloud Code > Function & Web Hosting” ในแถบด้านข้าง คุณจะเห็นว่า Cloud Code view ถูกแบ่งออกเป็นสองส่วน ด้านซ้ายเป็นโครงสร้างไดเรกทอรี และด้านขวาเป็นพื้นที่เขียนโค้ด
จากนั้นเปิดไฟล์ cloud/main.js แล้ววางโค้ดต่อไปนี้ลงไป:
// cloud/main.js
Parse.Cloud.define("calculateSales", async (request) => {
const orderClass = Parse.Object.extend("Order");
const orderQuery = new Parse.Query(orderClass);
let sales = 0;
try {
const orders = await orderQuery.find();
for (var i = 0; i < orders.length; i++) {
let order = orders[i];
let productId = order.get("product")["id"];
const productClass = Parse.Object.extend("Product");
const productQuery = new Parse.Query(productClass);
const product = await productQuery.get(productId);
sales += product.get("price");
}
return {
sales: sales,
};
} catch (error) {
console.error("Error calculating the sales: " + error.message);
return {
sales: 0,
}
}
});
Parse.Cloud.job("printSales", async (request, status) => {
try {
const result = await Parse.Cloud.run("calculateSales");
console.log("Sales: " + result.sales + "$");
} catch (error) {
console.error("Error calculating the sales: " + error.message);
}
});
- เราได้กำหนด Cloud Code function ชื่อ
calculateSales()
ซึ่งทำการวนลูปผ่านออเดอร์ทั้งหมด ดึง Product ที่สอดคล้องกัน และนำราคาของแต่ละ Product มาบวกกัน - เราได้กำหนด Cloud Code Job ชื่อ
printSales()
เพื่อให้สามารถรันฟังก์ชันจาก Parse dashboard หรือกำหนดให้รันตามตารางเวลาได้
สุดท้าย คลิก “Deploy” เพื่อดีพลอย Cloud Code ของคุณ
ตรวจสอบว่า job ทำงานหรือไม่โดยไปที่ “Cloud Code > Jobs” ในแถบด้านข้าง แล้วรัน job printSales()
หากทุกอย่างทำงานได้ดี คุณจะเห็นข้อความตัวอย่างเช่น Sales: 1440$
เมื่อเข้าไปดูที่ logs
Cloud Code Scheduling
หากต้องการตั้งเวลารัน job ให้ไปที่ “App Settings > Server Settings” ในแถบด้านข้าง เลื่อนลงไปที่ “Background jobs” คลิก “Schedule a job” และกรอกข้อมูลตามต้องการ
เพื่อยืนยันว่าใช้งานได้ ให้ตรวจสอบ logs อีกครั้ง
Client Side
คุณสามารถโต้ตอบกับแบ็กเอนด์ที่พัฒนาด้วย Back4app ได้หลายวิธี เช่น:
- Parse SDK
- RESTful API (ระบบสร้างให้อัตโนมัติ)
- GraphQL API (ระบบสร้างให้อัตโนมัติ)
โดยปกติ ถ้ามี Parse SDK สำหรับแพลตฟอร์มของคุณ คุณควรเลือกใช้ Parse SDK ก่อน หากไม่มีจึงพิจารณาใช้ RESTful API หรือ GraphQL API โดยจะเลือกแบบไหนขึ้นอยู่กับรูปแบบข้อมูลของคุณ
หากต้องการเรียนรู้วิธีใช้งาน Parse SDK กับเฟรมเวิร์กต่าง ๆ สามารถดูได้ใน docs
อย่างไรก็ตาม เรามาลองทดสอบแบ็กเอนด์ผ่าน built-in REST Console กันดูก่อน
ไปที่ “API > REST” ในแถบด้านข้าง แล้วลองดึงข้อมูล product ทั้งหมด โดยกรอกฟอร์มดังภาพ:
คุณควรได้รับผลลัพธ์ในลักษณะต่อไปนี้:
{
"results": [
{
"objectId": "4ZyHH3X0RQ",
"name": "Fitness Tracker Watch",
"description": "...",
"price": 80,
"createdAt": "2023-10-17T20:03:55.424Z",
"updatedAt": "2023-10-17T20:24:12.322Z",
"categories": {
"__type": "Relation",
"className": "ProductCategory"
}
},
{
"objectId": "cDqlGJzT5U",
"name": "Organic Fruit Basket",
"description": "...",
"price": 40,
"createdAt": "2023-10-17T20:04:10.063Z",
"updatedAt": "2023-10-17T20:24:00.382Z",
"categories": {
"__type": "Relation",
"className": "ProductCategory"
}
},
// ...
}
ลองทำคำร้องขอต่อไปนี้ดู:
- ดึงข้อมูลเฉพาะ products ที่ราคาเกิน 50
- ดึงข้อมูลออเดอร์ที่ยังไม่ได้ส่งมอบ (delivered = false)
- สร้าง product ใหม่และเพิ่ม category ให้กับมัน
- ลบออเดอร์
Conclusion
สรุปได้ว่า คุณได้รู้แล้วว่าโครงสร้างพื้นฐานแบ็กเอนด์คืออะไร รู้จักโครงสร้างพื้นฐานแบ็กเอนด์หลายประเภท และเข้าใจวิธีเลือกโครงสร้างพื้นฐานที่เหมาะสมกับโปรเจกต์ของคุณ
นอกจากนี้ คุณยังได้เรียนรู้วิธีสร้างโครงสร้างพื้นฐานแบ็กเอนด์ด้วย Back4app โดยได้จัดการฐานข้อมูล จัดการความปลอดภัยของฐานข้อมูล เพิ่มโค้ดเฉพาะกิจ (custom code) จัดตารางงาน (job scheduling) และทดสอบ API เรียบร้อยแล้ว
หากต้องการคำแนะนำเกี่ยวกับการพัฒนาฝั่งไคลเอนต์สำหรับแบ็กเอนด์ที่สร้างด้วย Back4app โปรดดูบทความอื่น ๆ ของเรา:
- How to host frontend and backend?
- How to develop a social media app?
- How to build a chatbot using React?
คุณสามารถดูโค้ดตัวอย่างที่ใช้ในบทความนี้ได้ใน GitHub repo