AWS SQS + SNS + แลมบ์ดา


11

ฉันสงสัยว่าฉันสามารถส่งข้อความไปยังคิว SQS และสมัครสมาชิกหัวข้อ SNS เพื่อส่งแลมบ์ดาให้ส่งอีเมลได้หรือไม่

SQS -> SNS -> (แลมบ์ดา) -> SES

ฉันรู้ว่าสามารถส่งข้อความ SNS ไปยัง SQS ได้ แต่ฉันอยากรู้ว่าวิธีอื่นเป็นไปได้หรือไม่

คำตอบ:


11

สิ่งหนึ่งที่ฉันทำคือการสร้างสัญญาณเตือน CloudWatch เปิดApproximateNumberOfMessagesVisible( >= 1 for 5 minutes) สำหรับคิว SQS การเตือนจะเผยแพร่ไปยังหัวข้อ SNS ที่เรียกใช้ฟังก์ชันแลมบ์ดา ฟังก์ชั่นแลมบ์ดาวนซ้ำจนกว่าจะเคลียร์คิว

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


ฉันกำลังคิดที่จะทำสิ่งเดียวกันนี้ คุณรู้หรือไม่ว่าคุณถูกเรียกเก็บเงินในแต่ละครั้งที่ cloudwatch ตรวจสอบคิวของคุณหรือไม่ ไม่ใช่ว่าเรากำลังพูดถึงเจ้าชู้ตัวใหญ่กับเรื่องแบบนี้แค่อยากรู้อยากเห็นมากขึ้น
Brian F Leighty

นอกจากนี้ฉันสมมติว่าจากสิ่งที่คุณพูดว่าสัญญาณเตือนยังคงส่ง SNS ของสัญญาณเตือนซ้ำแล้วซ้ำอีก? คุณมีการหมดเวลาในฟังก์ชั่นแลมบ์ดาของคุณตั้งไว้ที่?
Brian F Leighty

อีกสิ่งหนึ่ง ขออภัยสำหรับความคิดเห็นทั้งหมด ฉันกังวลเล็กน้อยเกี่ยวกับส่วน "Approximate" ที่คุณเคยมีเวลาที่มีข้อความรออยู่ที่นั่นซึ่งไม่ได้รับการจัดการเนื่องจากคิดว่ามีเพียง 0 รายการแทนที่จะเป็น 1 รายการที่นั่นใช่ไหม
Brian F Leighty

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

พลาดความคิดเห็น "โดยประมาณ" ดูเหมือนว่าจะทำงานได้ดี แต่ ymmv
squidpickles

7

คุณไม่สามารถไปเท่านั้นSQS -> SNSSNS -> SQS

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

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


3
นอกจากนี้ยังไม่มีอะไรผิดปกติกับการใช้เทคนิคการจัดคิวแบบดั้งเดิมกับแลมบ์ดา: e กรัมถ้าแลมบ์ดา dequeues ข้อความระหว่างการดำเนินการจากนั้น retrigger ฟังก์ชั่นในตอนท้าย; มิฉะนั้นปล่อยให้มันทำงานต่อไปตามกำหนด
nik.shornikov

1

SQSคิวสามารถสมัครสมาชิกSNSหัวข้อและเพื่อประมวลผลSNSข้อความที่ได้รับ ปัจจุบันยังไม่สามารถใช้งานในทิศทางอื่นได้หากไม่มีการเข้ารหัสเพิ่มเติม (ดูตัวอย่างเช่นLambdaคำถามที่พบบ่อย )

ผมจะบอกว่ามีสองตัวเลือกวิธีการที่จะทำมัน AWS event->SQS->Lambdaแต่มันไม่สง่างามเพื่อให้เป็นระบบโดยใช้เหตุการณ์ที่ขับเคลื่อนด้วยกันมากขึ้น มิฉะนั้นคุณอาจต้องปรับแต่ง / ใช้รหัสวิธีSQSประมวลผลคิว:

  1. คุณสามารถใช้แหล่งที่มาของเหตุการณ์ของคุณเอง
  2. คุณสามารถมีอินสแตนซ์ EC2 ระดับกลางเพื่อรับฟังSQSคิวจากนั้นเรียกใช้Lambdaเหตุการณ์ SQS

0

สิ่งนี้ถูกถามและตอบกลับเมื่อไม่นานมานี้ แต่เมื่อคิดถึงตัวเองฉันคิดว่าฉันจะเพิ่มวิธีการ

ตามที่กล่าวไว้แหล่งที่มาของเหตุการณ์อาจเป็นทางออกที่ดีที่สุดที่นี่ อีกทางหนึ่งและฉันยังไม่ได้ทดสอบและไม่คิดว่าจะผ่าน (ดังนั้นนี่คือการศึกษา) แต่อาจเป็นไปได้ที่จะทำสิ่งนี้ผ่านรูปแบบ Fan-Out กับ SNS ดังนี้

 1. Create a SNS topic.............................: SNS-topic-01
 2. Subscribe a SQS queue to that topic............: SQS-queue-01
 3. Subscribe a Lambda Function to that topic......: LAMBDA-func-01

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.