האם משימות הרקע שלך נתקעות בעומסי שיא, והודעות אובדות ללא עקבות? Amazon SQS היא תור הודעות מנוהל שפותר בעיות אלה ללא ניהול Broker. SQS מעבד מעל 10,000 הודעות בשנייה, מאחסן אותן עד 14 ימים, ומתרחב אוטומטית. SLA של 99.9% זמינות מבטיח אמינות. אנו מגדירים SQS עבור יישום האינטרנט שלך במפתח מלא: מתכנון ועד פריסה.
בניגוד לפתרונות מותאמים אישית, SQS אינו דורש הגדרת אשכול או ניטור Broker. אתה משלם רק על השימוש, וחוסך עד $2000 בשנה על תשתית (בעומס של מיליון הודעות ביום). עם תור, אתה מונע אובדן נתונים בזמן כשלי צרכן — כל הודעה נשמרת עד 14 ימים. Dead Letter Queue מגן מפני משימות שלא עובדו.
למה SQS עשוי להיות טוב יותר מ-RabbitMQ?
RabbitMQ דורש שרת ייעודי וניהול אשכול ידני. Redis Queue מהיר אך אינו מבטיח שמירה לטווח ארוך בזמן כשלים. SQS הוא שירות מנוהל לחלוטין עם קנה מידה אוטומטי, אחסון לטווח ארוך (עד 14 ימים), ותמיכה מובנית ב-Dead Letter Queue. מבחינת ביצועים, SQS Standard מטפל באלפי הודעות בשנייה, בעוד FIFO עד 3000 (עם שליחה בקבוצות). עבור רוב יישומי האינטרנט, SQS הוא האיזון האופטימלי בין פשטות לאמינות. הגדרת תור SQS אורכת פי 3 פחות זמן מפריסת RabbitMQ.
| סוג תור | תפוקה | הבטחת סדר | כפילויות | מקרה שימוש |
|---|---|---|---|---|
| Standard | גבוהה (כמעט בלתי מוגבלת) | לא | אפשרי | משימות רקע, רישום, התראות |
| FIFO | עד 3000 הודעות/שנייה (עם קבוצות) | כן | לא נכלל | עסקאות פיננסיות, הזמנות, ביקורת |
איך להגדיר Visibility Timeout ו-DLQ?
Visibility timeout — הזמן שבו הודעה מוסתרת מצרכנים אחרים לאחר קבלתה. ברירת המחדל היא 30 שניות. אם ההודעה לא נמחקת בתוך זמן זה, היא הופכת שוב לגלויה. הגדל את ה-timeout אם העיבוד אורך יותר מ-30 שניות. לדוגמה, לעיבוד תשלומים עם API חיצוני, הגדר 2-5 דקות. למשימות שעלולות להיתקע, השתמש ב-Dead Letter Queue: לאחר 3 ניסיונות כושלים, ההודעה עוברת ל-DLQ. 95% מההודעות מעובדות בניסיון הראשון עם timeout מוגדר כראוי.
אינטגרציה עם המחסנית שלך
Terraform (תשתית כקוד)
קוד תשתית סטנדרטי לשכפול בכל סביבה, כולל חיבור Lambda:
# Dead Letter Queue
resource "aws_sqs_queue" "dlq" {
name = "myapp-jobs-dlq"
message_retention_seconds = 1209600 # 14 дней
}
# Основная очередь
resource "aws_sqs_queue" "jobs" {
name = "myapp-jobs"
visibility_timeout_seconds = 300
message_retention_seconds = 86400
receive_wait_time_seconds = 20
redrive_policy = jsonencode({
deadLetterTargetArn = aws_sqs_queue.dlq.arn
maxReceiveCount = 3
})
}
# FIFO очередь (для задач, требующих порядка)
resource "aws_sqs_queue" "orders_fifo" {
name = "myapp-orders.fifo"
fifo_queue = true
content_based_deduplication = true
deduplication_scope = "messageGroup"
fifo_throughput_limit = "perMessageGroupId"
}
# IAM политика для приложения
resource "aws_iam_policy" "sqs_app" {
name = "myapp-sqs-access"
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = [
"sqs:SendMessage",
"sqs:ReceiveMessage",
"sqs:DeleteMessage",
"sqs:GetQueueAttributes",
]
Resource = [aws_sqs_queue.jobs.arn, aws_sqs_queue.dlq.arn]
}]
})
}
# Lambda event source mapping
resource "aws_lambda_event_source_mapping" "sqs_lambda" {
event_source_arn = aws_sqs_queue.jobs.arn
function_name = aws_lambda_function.worker.arn
batch_size = 10
maximum_batching_window_in_seconds = 5
function_response_types = ["ReportBatchItemFailures"]
} PHP: AWS SDK
צרכן מותאם אישית לפרויקטים שאינם Laravel:
use Aws\Sqs\SqsClient;
class SqsQueue
{
private SqsClient $client;
private string $queueUrl;
public function __construct()
{
$this->client = new SqsClient([
'version' => 'latest',
'region' => config('aws.region', 'eu-west-1'),
]);
$this->queueUrl = config('queue.connections.sqs.queue');
}
public function send(string $jobClass, array $payload, int $delaySeconds = 0): string
{
$result = $this->client->sendMessage([
'QueueUrl' => $this->queueUrl,
'MessageBody' => json_encode([
'job' => $jobClass,
'payload' => $payload,
'attempts' => 0,
'sent_at' => now()->toIso8601String(),
]),
'DelaySeconds' => $delaySeconds,
'MessageAttributes' => [
'JobClass' => [
'DataType' => 'String',
'StringValue' => $jobClass,
],
],
]);
return $result['MessageId'];
}
public function poll(int $maxMessages = 10): void
{
$result = $this->client->receiveMessage([
'QueueUrl' => $this->queueUrl,
'MaxNumberOfMessages' => $maxMessages,
'WaitTimeSeconds' => 20,
'VisibilityTimeout' => 300,
]);
foreach ($result->get('Messages') ?? [] as $message) {
$this->processMessage($message);
}
}
private function processMessage(array $message): void
{
try {
$body = json_decode($message['Body'], true);
$job = app($body['job']);
$job->handle($body['payload']);
$this->client->deleteMessage([
'QueueUrl' => $this->queueUrl,
'ReceiptHandle' => $message['ReceiptHandle'],
]);
} catch (\Throwable $e) {
Log::error('SQS job failed', [
'job' => $body['job'] ?? 'unknown',
'error' => $e->getMessage(),
]);
}
}
} Laravel Queue
Laravel תומך ב-SQS באופן מובנה. הגדרה דרך .env:
QUEUE_CONNECTION=sqs
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=secret
AWS_DEFAULT_REGION=eu-west-1
SQS_QUEUE=https://sqs.eu-west-1.amazonaws.com/123456789/myapp-jobsומחלקת ה-Job:
class ProcessOrderJob implements ShouldQueue {
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public int $tries = 3;
public int $timeout = 120;
public function __construct(private int $orderId) {}
public function handle(OrderService $service): void
{
$service->process($this->orderId);
}
public function failed(\Throwable $e): void
{
Log::error('Order processing failed', [
'order_id' => $this->orderId,
'error' => $e->getMessage(),
]);
}
}
ProcessOrderJob::dispatch($order->id);
ProcessOrderJob::dispatch($order->id)->delay(now()->addMinutes(5));
SQS + Lambda (serverless)
לארכיטקטורה מונעת אירועים, השתמש ב-Lambda. קוד Handler ב-Python:
import json
def handler(event, context):
failed_ids = []
for record in event['Records']:
try:
body = json.loads(record['body'])
process_job(body)
except Exception as e:
print(f"Failed: {record['messageId']}: {e}")
failed_ids.append({'itemIdentifier': record['messageId']})
return {'batchItemFailures': [{'itemIdentifier': id} for id in failed_ids]} השוואת גישות אינטגרציה
| גישה | זמן יישום | מורכבות | גמישות | מתאים ל |
|---|---|---|---|---|
| Laravel Queue | יום אחד | נמוכה | בינונית | פרויקטים על Laravel |
| צרכן PHP מותאם אישית | 2-3 ימים | בינונית | גבוהה | כל יישום PHP |
| SQS + Lambda | 2-3 ימים | בינונית | גבוהה | מונע אירועים / serverless |
טעויות נפוצות וניטור
- Timeout קצר מדי ל-visibility מוביל לעיבוד חוזר. תמיד הוסף חיץ של 30%.
- חוסר ב-DLQ — אובדן הודעות בזמן כשלי צרכן.
- מדיניות IAM שגויה — היישום לא יכול לשלוח/לקבל הודעות.
- ניטור לא מוגדר — עומק התור גדל ללא תשומת לב.
מדדי CloudWatch SQS: # Dead Letter Queue resource "aws_sqs_queue" "dlq" { name = "myapp-jobs-dlq" message_retention_seconds = 1209600 # 14 дней } # Основная очередь resource "aws_sqs_queue" "jobs" { name = "myapp-jobs" visibility_timeout_seconds = 300 message_retention_seconds = 86400 receive_wait_time_seconds = 20 redrive_policy = jsonencode({ deadLetterTargetArn = aws_sqs_queue.dlq.arn maxReceiveCount = 3 }) } # FIFO очередь (для задач, требующих порядка) resource "aws_sqs_queue" "orders_fifo" { name = "myapp-orders.fifo" fifo_queue = true content_based_deduplication = true deduplication_scope = "messageGroup" fifo_throughput_limit = "perMessageGroupId" } # IAM политика для приложения resource "aws_iam_policy" "sqs_app" { name = "myapp-sqs-access" policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow" Action = [ "sqs:SendMessage", "sqs:ReceiveMessage", "sqs:DeleteMessage", "sqs:GetQueueAttributes", ] Resource = [aws_sqs_queue.jobs.arn, aws_sqs_queue.dlq.arn] }] }) } # Lambda event source mapping resource "aws_lambda_event_source_mapping" "sqs_lambda" { event_source_arn = aws_sqs_queue.jobs.arn function_name = aws_lambda_function.worker.arn batch_size = 10 maximum_batching_window_in_seconds = 5 function_response_types = ["ReportBatchItemFailures"] } , use Aws\Sqs\SqsClient; class SqsQueue { private SqsClient $client; private string $queueUrl; public function __construct() { $this->client = new SqsClient([ 'version' => 'latest', 'region' => config('aws.region', 'eu-west-1'), ]); $this->queueUrl = config('queue.connections.sqs.queue'); } public function send(string $jobClass, array $payload, int $delaySeconds = 0): string { $result = $this->client->sendMessage([ 'QueueUrl' => $this->queueUrl, 'MessageBody' => json_encode([ 'job' => $jobClass, 'payload' => $payload, 'attempts' => 0, 'sent_at' => now()->toIso8601String(), ]), 'DelaySeconds' => $delaySeconds, 'MessageAttributes' => [ 'JobClass' => [ 'DataType' => 'String', 'StringValue' => $jobClass, ], ], ]); return $result['MessageId']; } public function poll(int $maxMessages = 10): void { $result = $this->client->receiveMessage([ 'QueueUrl' => $this->queueUrl, 'MaxNumberOfMessages' => $maxMessages, 'WaitTimeSeconds' => 20, 'VisibilityTimeout' => 300, ]); foreach ($result->get('Messages') ?? [] as $message) { $this->processMessage($message); } } private function processMessage(array $message): void { try { $body = json_decode($message['Body'], true); $job = app($body['job']); $job->handle($body['payload']); $this->client->deleteMessage([ 'QueueUrl' => $this->queueUrl, 'ReceiptHandle' => $message['ReceiptHandle'], ]); } catch (\Throwable $e) { Log::error('SQS job failed', [ 'job' => $body['job'] ?? 'unknown', 'error' => $e->getMessage(), ]); } } } , QUEUE_CONNECTION=sqs AWS_ACCESS_KEY_ID=AKIA... AWS_SECRET_ACCESS_KEY=secret AWS_DEFAULT_REGION=eu-west-1 SQS_QUEUE=https://sqs.eu-west-1.amazonaws.com/123456789/myapp-jobs , class ProcessOrderJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public int $tries = 3; public int $timeout = 120; public function __construct(private int $orderId) {} public function handle(OrderService $service): void { $service->process($this->orderId); } public function failed(\Throwable $e): void { Log::error('Order processing failed', [ 'order_id' => $this->orderId, 'error' => $e->getMessage(), ]); } } ProcessOrderJob::dispatch($order->id); ProcessOrderJob::dispatch($order->id)->delay(now()->addMinutes(5)); . אנו ממליצים להגדיר התראה על עומק התור — לדוגמה, כאשר יש >1000 הודעות, שלח התראת Slack. תיעוד AWS CloudWatch ממליץ לעקוב אחר מדדים אלה לתגובה בזמן.
איך אנו מגדירים SQS: תהליך שלב אחר שלב
- אנליטיקה. קבע עומס, דרישות סדר ועמידות.
- עיצוב. בחר סוג תור, הגדר visibility timeout, DLQ, מדיניות IAM.
- יישום. כתוב צרכן (Laravel, PHP/Node.js מותאם אישית) או טריגרים של Lambda.
- בדיקה. בצע בדיקות עומס, וודא עמידות לתקלות.
- פריסה. פרוס דרך Terraform, הגדר CI/CD, והגדר התראות CloudWatch.
מה כלול ולוחות זמנים
- תיעוד ארכיטקטורת תור
- קוד Terraform לכל התשתית
- הרשאות גישה ומדיניות IAM
- צרכן עם טיפול בשגיאות ו-DLQ
- ניטור (מדדי CloudWatch + התראות)
- הדרכת צוות על תפעול התור
- תמיכה לאחר השקה (חודש אחד)
לוחות זמנים: Laravel Queue + SQS — יום אחד. צרכן PHP/Node.js מותאם אישית עם DLQ וניטור — 2-3 ימים. SQS + Lambda serverless — 2-3 ימים. לוחות זמנים מדויקים מוערכים לאחר ניתוח הפרויקט שלך. אנו עובדים עם תורים למעלה מ-5 שנים ויישמנו 30+ פרויקטים. קבל ייעוץ לפרויקט שלך עכשיו. הזמן הגדרת SQS ושכח מבעיות תורים.







