วิธีปฏิบัติที่ดีที่สุดสำหรับ AWS Lambda Container ใช้ซ้ำ

การเพิ่มประสิทธิภาพการเริ่มต้นที่อบอุ่นเมื่อเชื่อมต่อ AWS Lambda กับบริการอื่น ๆ

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

มีไดอะแกรมที่มีประโยชน์ที่นี่เพื่ออธิบายวงจรชีวิตของคำขอแลมบ์ดา

สิ่งต่อไปนี้เกิดขึ้นระหว่างการเริ่มเย็นเมื่อมีการเรียกใช้ฟังก์ชันของคุณเป็นครั้งแรกหรือหลังจากไม่มีการใช้งานเป็นระยะเวลาหนึ่ง:

  • รหัสและการอ้างอิงถูกดาวน์โหลด
  • เริ่มคอนเทนเนอร์ใหม่
  • รันไทม์ถูก bootstrapped

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

การเชื่อมต่อไปยังบริการ AWS อื่น ๆ จาก Lambda

ตัวอย่าง: เชื่อมต่อกับอินสแตนซ์ RDS ไอคอน AWS มาจากที่นี่

เรามีตัวอย่างพื้นฐานและทั่วไปในการเรียกใช้ - เราต้องการเชื่อมต่อกับทรัพยากรคอนเทนเนอร์เพื่อดึงข้อมูลการตกแต่ง ในตัวอย่างนี้ JSON payload มาพร้อมกับ ID และฟังก์ชั่น Lambda เชื่อมต่อกับอินสแตนซ์ RDS ที่เรียกใช้ PostgreSQL เพื่อค้นหาชื่อที่สอดคล้องกันของ ID เพื่อให้เราสามารถส่งคืนเพย์โหลดที่ผสาน เนื่องจากฟังก์ชั่นแลมบ์ดากำลังเชื่อมต่อกับ RDS ซึ่งอาศัยอยู่ใน VPC ฟังก์ชั่นแลมบ์ดาจึงจำเป็นต้องอยู่ในซับเน็ตส่วนตัวเช่นกัน นี่เป็นการเพิ่มสองสามก้าวในการเริ่มเย็น - จำเป็นต้องแนบส่วนต่อประสานเครือข่าย VPC (ENI) (ดังที่กล่าวไว้ในบล็อกของ Jeremy Daly ซึ่งจะเพิ่มเวลาในการเริ่มต้นความเย็นของคุณ)

หมายเหตุ: เราสามารถหลีกเลี่ยงการใช้ VPC หากเราต้องใช้ที่เก็บคีย์ / ค่ากับ DynamoDB แทน RDS

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

ตัวเลือก 1 - เชื่อมต่อกับ RDS ภายในตัวจัดการ

ตัวอย่างรหัสนี้แสดงให้เห็นว่าฉันอาจเข้าใกล้ภารกิจนี้ได้อย่างไร - การเชื่อมต่อฐานข้อมูลอยู่ในวิธีการจัดการ มีแบบสอบถามแบบใช้เลือกข้อมูลอย่างง่ายในการดึงชื่อของ ID ก่อนส่งคืน payload ซึ่งขณะนี้มีชื่อแล้ว

มาดูกันว่าตัวเลือกนี้ทำงานอย่างไรในระหว่างการทดสอบขนาดเล็กที่มีการเรียกใช้ 2,000 ครั้งพร้อมกัน 20 ครั้งระยะเวลาต่ำสุดคือ 18 ms ด้วยค่าเฉลี่ย 51ms และสูงสุดเพียง 1 วินาที (ระยะเวลาการเริ่มเย็น)

แลมบ์ดาระยะเวลา

กราฟด้านล่างแสดงว่ามีการเชื่อมต่อกับฐานข้อมูลได้สูงสุดแปดรายการ

จำนวนการเชื่อมต่อกับฐานข้อมูล RDS ในหน้าต่าง 5 นาที

ตัวเลือกที่ 2 - ใช้การเชื่อมต่อทั่วโลก

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

เราไม่ได้ปิดการเชื่อมต่อไปยังฐานข้อมูลอีกต่อไปดังนั้นการเชื่อมต่อจะยังคงอยู่สำหรับการเรียกใช้ฟังก์ชันในภายหลัง การนำการเชื่อมต่อกลับมาใช้ใหม่จะช่วยลดระยะเวลาการเริ่มต้นอย่างอบอุ่น - ระยะเวลาเฉลี่ยจะเร็วขึ้นประมาณ 3 เท่าและต่ำสุดคือ 1 ms มากกว่า 18 ms

แลมบ์ดา Durations

การเชื่อมต่อกับอินสแตนซ์ RDS เป็นงานที่ใช้เวลานานและไม่จำเป็นต้องเชื่อมต่อทุกการร้องขอจะเป็นประโยชน์ต่อประสิทธิภาพ เมื่อเชื่อมต่อกับฐานข้อมูลสำหรับการสืบค้นฐานข้อมูลอย่างง่ายเราได้จำนวนการเชื่อมต่อฐานข้อมูลสูงสุดที่ 20 ซึ่งตรงกับระดับของการเกิดพร้อมกัน (เราได้ทำการเรียกใช้พร้อมกัน 20 ครั้ง x 100 ครั้ง) เมื่อการปะทุของคำร้องหยุดลงการเชื่อมต่อจะค่อยๆปิดลง

ตอนนี้ AWS ได้เพิ่มค่าเผื่อระยะเวลาแลมบ์ดาเป็น 15 นาทีซึ่งหมายความว่าการเชื่อมต่อฐานข้อมูลอาจใช้เวลานานขึ้นและคุณอาจตกอยู่ในอันตรายจากการเข้าถึงหมายเลขการเชื่อมต่อ RDS สูงสุด การเชื่อมต่อสูงสุดเริ่มต้นสามารถเขียนทับในการตั้งค่ากลุ่มพารามิเตอร์ RDS แม้ว่าการเพิ่มจำนวนการเชื่อมต่อสูงสุดอาจส่งผลให้เกิดปัญหากับการจัดสรรหน่วยความจำ อินสแตนซ์ขนาดเล็กสามารถมีค่า max_connections เริ่มต้นน้อยกว่า 100 โปรดคำนึงถึงข้อ จำกัด เหล่านี้และเพิ่มตรรกะแอปพลิเคชันเพื่อเชื่อมต่อกับฐานข้อมูลเมื่อจำเป็นเท่านั้น

ใช้การเชื่อมต่อทั่วโลกสำหรับงานอื่น ๆ

แลมบ์ดาเชื่อมต่อกับ S3

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

s3-get-object lambda โค้ดพิมพ์เขียว https://console.aws.amazon.com/lambda/home?region=us-east-1#/create/new?bp=s3-get-object-python

การถอดรหัสตัวแปรสภาพแวดล้อม

แลมบ์ดาคอนโซลให้คุณเลือกเข้ารหัสตัวแปรสภาพแวดล้อมของคุณเพื่อความปลอดภัยเพิ่มเติม ข้อมูลโค้ดต่อไปนี้เป็น AWS ที่มีให้ตัวอย่าง Java ของสคริปต์ตัวช่วยสำหรับการถอดรหัสตัวแปรสภาพแวดล้อมจากฟังก์ชัน Lambda คุณสามารถนำทางไปยังข้อมูลโค้ดได้โดยทำตามบทช่วยสอนนี้ (เฉพาะขั้นตอนที่ 6) เนื่องจาก DECRYPTED_KEY ถูกกำหนดให้เป็น class global ฟังก์ชัน decryptKey () และตรรกะจะถูกเรียกเพียงครั้งเดียวต่อคอนเทนเนอร์แลมบ์ดา ดังนั้นเราจะเห็นการปรับปรุงที่สำคัญในช่วงเวลาเริ่มต้นที่อบอุ่น

https://console.aws.amazon.com/lambda/home?region=us-east-1#/functions และ https://docs.aws.amazon.com/lambda/latest/dg/tutorial-env_console.html

การใช้ตัวแปรระดับโลกในโซลูชัน FaaS อื่น ๆ

วิธีการนี้ไม่แยกจาก AWS Lambda วิธีการใช้การเชื่อมต่อทั่วโลกสามารถนำไปใช้กับฟังก์ชั่น serverless ของผู้ให้บริการคลาวด์อื่น ๆ ได้เช่นกัน หน้าเคล็ดลับและเทคนิคการทำงานของ Google Cloud ให้คำอธิบายที่ดีสำหรับตัวแปรที่ไม่ขี้เกียจ (เมื่อตัวแปรถูกกำหนดค่าเริ่มต้นนอกเมธอดตัวจัดการเสมอ) เมื่อเทียบกับตัวแปรขี้เกียจ (ตั้งค่าตัวแปรโกลบอลเมื่อจำเป็นเท่านั้น)

แนวทางปฏิบัติที่ดีอื่น ๆ

ต่อไปนี้เป็นแนวทางปฏิบัติที่ดีอื่น ๆ

การทดสอบ

การใช้ FaaS ช่วยให้มีสถาปัตยกรรม microservices และการมีฟังก์ชั่นชิ้นเล็ก ๆ ต่อเนื่องเข้าด้วยกันคือการทดสอบหน่วยที่มีประสิทธิภาพ เพื่อช่วยเหลือการทดสอบหน่วยของคุณ:

  • จำไว้ว่าให้ยกเว้นการทดสอบการพึ่งพาจากแพ็คเกจแลมบ์ดา
  • แยกลอจิกออกจากเมธอดตัวจัดการเช่นเดียวกับวิธีหลักของโปรแกรม

การพึ่งพาและขนาดบรรจุภัณฑ์

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

หาก Node.js เป็นแลมบ์ดาที่คุณต้องการคุณสามารถใช้ minification และ uglification เพื่อลดขนาดของรหัสฟังก์ชั่นและลดขนาดของแพ็คเกจการปรับใช้ของคุณ บางแง่มุม แต่ไม่ทั้งหมดของ minification และ uglification สามารถใช้ได้กับ runtimes อื่น ๆ เช่น คุณไม่สามารถลบช่องว่างออกจากโค้ดไพ ธ อนได้ แต่คุณสามารถลบความคิดเห็นและทำให้ชื่อตัวแปรสั้นลง

การตั้งค่าหน่วยความจำ

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

สรุป…

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

  • สมาชิกในทีมใหม่จะเข้าใจรหัสของคุณหรือไม่
  • คุณและทีมของคุณจะสามารถแก้ไขข้อบกพร่องรหัสได้ในอนาคตหรือไม่

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

ความคิดเห็นเหล่านี้เป็นของผู้เขียน เว้นแต่จะระบุไว้เป็นอย่างอื่นในโพสต์นี้ Capital One ไม่มีส่วนเกี่ยวข้องและไม่ได้รับการรับรองจาก บริษัท ใด ๆ ที่กล่าวถึง เครื่องหมายการค้าและทรัพย์สินทางปัญญาอื่น ๆ ที่ใช้หรือแสดงเป็นกรรมสิทธิ์ของเจ้าของที่เกี่ยวข้อง บทความนี้คือ© 2019 Capital One