Amazon SQS/SNS: הגדרת תור הודעות ל-DevOps

האם צוות התמיכה שלכם מתלונן על הזמנות כפולות, ומפתחים על אירועים שאבדו לאחר deployment? אנו מגדירים messaging אמין על Amazon SQS ו-SNS turnkey, ומטפלים בכל המחזור מ-audit ועד implementation ותמיכה שוטפת. הצוות שלנו מבטיח פעילות יציבה של queues שמתרחבים עם העסק שלכם.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

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% בגודל אצווה).

כדי לקבל קונפיגורציה מוכנה, צור איתנו קשר.

תהליך

  1. ניתוח — סקירת הארכיטקטורה הנוכחית, ניתוח בעיות תור (אובדן, כפילויות, עיכובים).
  2. עיצוב — בחירת סוגי תורים, סכמת ניתוב, מדיניות גישה.
  3. יישום — כתיבת Terraform/IaC, הגדרת אינטגרציות, בדיקות.
  4. בדיקות — בדיקות עומס, בדיקות אידמפוטנטיות וטיפול בשגיאות.
  5. פריסה — פריסה לייצור עם תוכנית 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