Amazon SQS/SNS: הגדרת תור הודעות ל-DevOps
האם צוות התמיכה שלך מתלונן על הזמנות כפולות, בעוד שמפתחים מדווחים על אובדן אירועים לאחר פריסות? סביר להניח שתור ההודעות שלך מוגדר לא נכון. כמהנדסי DevOps עם ניסיון של 7+ שנים, פתרנו את הבעיה המדויקת הזו עשרות פעמים. אנו נקים עבורך חילופי הודעות אמינים על Amazon SQS ו-SNS תוך 1–3 ימים. צור איתנו קשר לבדיקה — נזהה בעיות בתור תוך שעה.
תורי הודעות ב-AWS פותרים שתי בעיות שונות שלעתים קרובות מבולבלות. SQS הוא תור עם מודל משיכה: הצרכן עצמו מביא הודעות, מעבד אותן ומוחק אותן. SNS הוא ברוקר פרסום/הרשמה עם משלוח דחיפה: מפרסם אחד, מנויים רבים, משלוח בזמן אמת. בחירה במודל הלא נכון היא מקור לבעיות אמינות ועלות.
איך לבחור בין Standard ל-FIFO?
תור Standard מציע תפוקה גבוהה (מיליוני הודעות בשנייה), משלוח לפחות פעם אחת (הודעה עשויה להימסר פעמיים), וללא הבטחת סדר. מתאים לרוב המשימות שבהן הצרכן הוא אידמפוטנטי. תור FIFO מבטיח בדיוק פעם אחת, בסדר קפדני, אך מגיע למקסימום של 3000 TPS (30000 TPS עם אצווה). השתמש בו לעסקאות פיננסיות, עיבוד הזמנות, שבהן הסדר קריטי. שם התור חייב להסתיים ב-.fifo. תור Standard זול פי 1000 מ-FIFO בעומסים גבוהים — ההבדל בעלויות האחסון והתפעול משמעותי.
השוואת מאפיינים:
| מאפיין | Standard | FIFO |
|---|---|---|
| תפוקה | ~מיליוני הודעות/שנייה | 3000 TPS (30000 עם אצווה) |
| משלוח | לפחות פעם אחת | בדיוק פעם אחת |
| סדר | לא מובטח | סדר קפדני |
| סיומת שם | לא נדרשת | .fifo |
| תרחיש | צרכנים אידמפוטנטיים | סדר קריטי |
טעות נפוצה היא שימוש ב-FIFO בכל מקום "ליתר ביטחון". זה מגביל תפוקה ומגדיל עלויות. אם אין צורך בסדר, השתמש ב-Standard. בפרויקט אחד, ללקוח היה FIFO על כל התורים והוא קיבל 500 TPS כשהיה צריך 2000 — לאחר מעבר ל-Standard, התפוקה גדלה פי 10 והעלויות ירדו ב-40%.
למה DLQ הוא חובה?
DLQ הוא תור להודעות שלא ניתן היה לעבד לאחר N ניסיונות. ללא DLQ, "גלולת רעל" תחזור לתור לנצח, ותחסום עיבוד. אנו תמיד כוללים DLQ עם שלושה ניסיונות — זה הסטנדרט בייצור.
הגדר את מדיניות ההפניה מחדש:
{ "deadLetterTargetArn": "arn:aws:sqs:eu-west-1:123456789:myapp-dlq.fifo", "maxReceiveCount": 3 } לאחר 3 ניסיונות כושלים, ההודעה עוברת ל-DLQ. הגדר התראת CloudWatch נפרדת על redrive policy עבור ה-DLQ. אם משהו מופיע ב-DLQ, יש לחקור זאת מיד.
דוגמת Terraform ליצירת תור עם DLQ
resource "aws_sqs_queue" "main" {
name = "myapp-orders.fifo"
fifo_queue = true
content_based_deduplication = true
visibility_timeout_seconds = 300
redrive_policy = jsonencode({
deadLetterTargetArn = aws_sqs_queue.dlq.arn
maxReceiveCount = 3
})
}
resource "aws_sqs_queue" "dlq" {
name = "myapp-orders-dlq.fifo"
fifo_queue = true
}{ "deadLetterTargetArn": "arn:aws:sqs:eu-west-1:123456789:myapp-dlq.fifo", "maxReceiveCount": 3 } חייב להיות גדול מזמן העיבוד המקסימלי של הודעה. אם ה-timeout של Lambda הוא 60 שניות, הגדר visibility timeout ל-90–120 שניות (מרווח של 100%). אחרת, Lambda עדיין מעבד, אבל SQS מחשיב את ההודעה כ"לא נלקחה" ונותן אותה לצרכן אחר.
אם התור שלך כבר מאבד הודעות, הזמן בדיקה — נמצא את שורש הבעיה תוך יום.
תבנית Fan-Out של SNS
SNS + SQS יחד מאפשרים fan-out: הודעה אחת מתפרסמת לנושא SNS ומועברת למספר תורי SQS בו זמנית. כל צרכן מעבד באופן עצמאי. מקרה טיפוסי: אירוע ApproximateNumberOfMessagesVisible > 0 → SNS → שלושה תורים: billing-queue, inventory-queue, notification-queue. שלושה שירותים שונים מעבדים באופן עצמאי, ללא ידיעה אחד על השני.
SNS תומך במדיניות סינון — מנוי מקבל רק הודעות עם מאפיינים ספציפיים. לדוגמה, billing-queue מקבל רק אירועים עם resource "aws_sqs_queue" "main" { name = "myapp-orders.fifo" fifo_queue = true content_based_deduplication = true visibility_timeout_seconds = 300 redrive_policy = jsonencode({ deadLetterTargetArn = aws_sqs_queue.dlq.arn maxReceiveCount = 3 }) } resource "aws_sqs_queue" "dlq" { name = "myapp-orders-dlq.fifo" fifo_queue = true } , notification-queue מקבל את כולם. זה מפחית עומס ב-30–40%.
אינטגרציה עם Lambda
מיפוי מקור אירועים של Lambda עבור SQS הוא מנגנון משיכה מובנה. פונקציית Lambda מופעלת אוטומטית כאשר הודעות מופיעות. פרמטרים חשובים:
-
visibility_timeout_seconds— כמה הודעות Lambda מקבלת לכל קריאה (1–10000). עבור FIFO, אנו ממליצים על אצוות קטנות (10–50) — כל האצווה חסומה אם הודעה אחת נכשלת. -
order.created— Lambda ממתינה את הזמן שצוין (עד 300 שניות) כדי לאסוף אצווה מלאה. חוסך קריאות בעומס נמוך. -
amount > 100— הצלחה חלקית של אצווה. Lambda אומרת ל-SQS אילו הודעות ספציפיות נכשלו (לא כל האצווה). ReportBatchItemFailures הוא קריטי עבור FIFO. בלעדיו, אם אחת מ-10 הודעות נכשלת, כל 10 עוברות לניסיון חוזר.
הצפנה ו-IAM
SQS תומך ב-SSE דרך AWS KMS (מפתח מנוהל SQS או מפתח מנוהל לקוח). לייצור, אנו משתמשים ב-CMK — הוא מספק נתיב ביקורת דרך CloudTrail. שלוט בקפדנות בהרשאות SQS דרך IAM: המפיק מקבל רק batch_size, הצרכן מקבל maximum_batching_window_in_seconds, function_response_types: ["ReportBatchItemFailures"], sqs:SendMessage. אין sqs:ReceiveMessage בייצור. בנוסף, הגדר מדיניות מבוססת משאבים לגישה בין חשבונות.
ניטור
מדדי CloudWatch מרכזיים:
| מדד | מה הוא מאותת |
|---|---|
sqs:DeleteMessage |
התור לא עומד בקצב |
sqs:GetQueueAttributes |
צבר מצטבר |
sqs:* |
ירידה חדה = בעיה עם המפיק |
DLQ ApproximateAgeOfOldestMessage |
יש הודעות שבורות |
הוסף גם התראה על ApproximateNumberOfMessagesVisible אם הוא עולה על 5 דקות — זה תופס את הבעיה לפני שהתור גדל לאלפי הודעות.
מה תקבל בסוף
לאחר השלמת ההגדרה, אנו מספקים:
- קבצי קונפיגורציה של Terraform (מודולים עבור SQS, SNS, Lambda, CloudWatch).
- מדיניות IAM עם הרשאות מינימליות.
- לוחות מחוונים והתראות CloudWatch מוגדרים.
- תיעוד על מבנה התור ותבניות אינטגרציה.
- המלצות ביצועים ועלות (לדוגמה, שימוש ב-reserved concurrency עבור Lambda, חיסכון של עד 30% בגודל אצווה).
כדי לקבל קונפיגורציה מוכנה, צור איתנו קשר.
תהליך
- ניתוח — סקירת הארכיטקטורה הנוכחית, ניתוח בעיות תור (אובדן, כפילויות, עיכובים).
- עיצוב — בחירת סוגי תורים, סכמת ניתוב, מדיניות גישה.
- יישום — כתיבת Terraform/IaC, הגדרת אינטגרציות, בדיקות.
- בדיקות — בדיקות עומס, בדיקות אידמפוטנטיות וטיפול בשגיאות.
- פריסה — פריסה לייצור עם תוכנית post-mortem.
לוחות זמנים
הגדרה בסיסית של אינטגרציית SQS + Lambda + DLQ + התראות CloudWatch — יום אחד. קונפיגורציה מלאה עם fan-out של SNS, מדיניות סינון, FIFO לעיבוד מסודר, הצפנת KMS, מודול Terraform — 2–3 ימים. נספק הערכה מדויקת לאחר בדיקת התשתית שלך. צור איתנו קשר כדי לדון בפרטים. קבל ייעוץ והערכה ראשונית.
למהנדסים שלנו יש ניסיון של 7+ שנים ב-AWS והם יישמו 50+ פרויקטים של תורי הודעות. שתף את המצב שלך — נבחן את הפרויקט שלך ונציע פתרון אופטימלי כולל.
תיעוד Amazon SQS: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html







