หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

เคล็ดลับและลูกเล่น

เอกสารนี้อธิบายแนวทางปฏิบัติที่ดีที่สุดสำหรับการออกแบบการใช้การทดสอบและการปรับใช้ฟังก์ชั่นคลาวด์

ความถูกต้อง

ส่วนนี้อธิบายวิธีปฏิบัติที่ดีที่สุดทั่วไปสำหรับการออกแบบและการใช้งานฟังก์ชั่นคลาวด์

เขียนฟังก์ชั่น idempotent

ฟังก์ชั่นของคุณควรให้ผลลัพธ์เดียวกันแม้ว่าจะถูกเรียกหลายครั้ง สิ่งนี้จะช่วยให้คุณลองเรียกใช้อีกครั้งหากการเรียกใช้ก่อนหน้านี้ล้มเหลวระหว่างรหัสของคุณ สำหรับข้อมูลเพิ่มเติมดู ฟังก์ชันพื้นหลังที่ลองใหม่

อย่าเริ่มกิจกรรมพื้นหลัง

กิจกรรมเบื้องหลังคือสิ่งที่เกิดขึ้นหลังจากฟังก์ชั่นของคุณสิ้นสุดลง การเรียกใช้ฟังก์ชั่นเสร็จสิ้นเมื่อฟังก์ชั่นส่งคืนหรือมิฉะนั้นสัญญาณเสร็จสมบูรณ์เช่นโดยการ callback อาร์กิวเมนต์ callback ในฟังก์ชั่นพื้นหลัง Node.js รหัสใด ๆ ที่รันหลังจากการเลิกจ้างอย่างสง่างามไม่สามารถเข้าถึง CPU และจะไม่ดำเนินการใด ๆ

นอกจากนี้เมื่อดำเนินการภาวนาที่ตามมาในสภาพแวดล้อมเดียวกันกิจกรรมพื้นหลังของคุณจะดำเนินการต่อโดยรบกวนการร้องขอใหม่ สิ่งนี้อาจนำไปสู่พฤติกรรมที่ไม่คาดคิดและข้อผิดพลาดที่ยากต่อการวินิจฉัย การเข้าถึงเครือข่ายหลังจากฟังก์ชั่นยุติมักจะนำไปสู่การเชื่อมต่อที่ถูกรีเซ็ต (รหัสข้อผิดพลาด ECONNRESET )

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

ลบไฟล์ชั่วคราวเสมอ

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

คุณสามารถดูหน่วยความจำที่ใช้โดยแต่ละฟังก์ชั่นได้โดยเลือกใน รายการฟังก์ชั่น ในคอนโซล GCP และเลือกพล็อต การใช้หน่วยความจำ

อย่าพยายามเขียนนอกไดเรกทอรีชั่วคราวและต้องแน่ใจว่าใช้วิธีการแพลตฟอร์ม / OS อิสระเพื่อสร้างเส้นทางของไฟล์

คุณสามารถข้ามข้อ จำกัด ด้านขนาดของไฟล์ชั่วคราวโดยใช้ pipelining ตัวอย่างเช่นคุณสามารถประมวลผลไฟล์บนที่เก็บข้อมูลบนคลาวด์ได้โดยสร้างสตรีมอ่านส่งผ่านกระบวนการตามสตรีมและเขียนสตรีมเอาต์พุตไปยังที่เก็บข้อมูลบน Cloud โดยตรง

เครื่องมือ

ส่วนนี้มีแนวทางเกี่ยวกับวิธีการใช้เครื่องมือในการใช้ทดสอบและโต้ตอบกับฟังก์ชั่นคลาวด์

การพัฒนาท้องถิ่น

การปรับใช้ฟังก์ชั่นใช้เวลาสักครู่จึงมักจะเร็วกว่าในการทดสอบรหัสฟังก์ชั่นของคุณในเครื่อง

นักพัฒนา Firebase สามารถใช้ Firebase CLI Cloud Function Emulator

ใช้ Sendgrid เพื่อส่งอีเมล

ฟังก์ชั่นคลาวด์ไม่อนุญาตการเชื่อมต่อขาออกบนพอร์ต 25 ดังนั้นคุณจึงไม่สามารถทำการเชื่อมต่อที่ไม่ปลอดภัยไปยังเซิร์ฟเวอร์ SMTP วิธีการส่งอีเมลที่แนะนำคือการใช้ SendGrid คุณสามารถหาตัวอย่างที่สมบูรณ์ได้ใน บทช่วยสอน SendGrid และตัวเลือกอื่น ๆ สำหรับการส่งอีเมลในเอกสาร Google Compute Engine การ ส่งอีเมลจากอินสแตนซ์

ประสิทธิภาพ

ส่วนนี้อธิบายวิธีปฏิบัติที่ดีที่สุดสำหรับการเพิ่มประสิทธิภาพ

ใช้การพึ่งพาอย่างชาญฉลาด

เนื่องจากฟังก์ชั่นไร้สัญชาติสภาพแวดล้อมการดำเนินการมักจะถูกเตรียมใช้งานตั้งแต่เริ่มต้น (ระหว่างสิ่งที่เรียกว่าการ เริ่มเย็น ) เมื่อเกิดการเริ่มเย็นระบบจะประเมินบริบทส่วนกลางของฟังก์ชัน

หากฟังก์ชั่นของคุณนำเข้าโมดูลเวลาโหลดสำหรับโมดูลเหล่านั้นสามารถเพิ่มลงในเวลาแฝงที่เรียกใช้ในระหว่างการเริ่มเย็น คุณสามารถลดเวลาในการตอบสนองรวมถึงเวลาที่ต้องใช้ในการปรับใช้ฟังก์ชั่นของคุณโดยการโหลดการพึ่งพาอย่างถูกต้องและไม่โหลดการขึ้นต่อกันที่ฟังก์ชันของคุณไม่ได้ใช้

ใช้ตัวแปรส่วนกลางเพื่อนำวัตถุกลับมาใช้ใหม่ในการเรียกใช้ในอนาคต

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

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

 console.log('Global scope');
const perInstance = heavyComputation();
const functions = require('firebase-functions');

exports.function = functions.https.onRequest((req, res) => {
    console.log('Function invocation');
    const perFunction = lightweightComputation();

    res.send(`Per instance: ${perInstance}, per function: ${perFunction}`);
});
 

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

ทำการเริ่มต้นสันหลังยาวของตัวแปรโกลบอล

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

 const functions = require('firebase-functions');
let myCostlyVariable;

exports.function = functions.https.onRequest((req, res) => {
    doUsualWork();
    if(unlikelyCondition()){
        myCostlyVariable = myCostlyVariable || buildCostlyVariable();
    }
    res.status(200).send('OK');
});
 

สิ่งนี้มีความสำคัญอย่างยิ่งหากคุณกำหนดฟังก์ชั่นหลายอย่างในไฟล์เดียวและฟังก์ชั่นต่าง ๆ ใช้ตัวแปรที่แตกต่างกัน ยกเว้นว่าคุณใช้การเริ่มต้นขี้เกียจคุณอาจเสียทรัพยากรกับตัวแปรที่เริ่มต้น แต่ไม่เคยใช้

แหล่งข้อมูลเพิ่มเติม

ค้นหาข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มประสิทธิภาพใน "Google Cloud Performance Atlas" วิดีโอ คลาวด์ฟังก์ชั่นเวลาเริ่มเย็น