🏪 AWS配送センター株式会社
📋 システム構成
- 🎯 SQS Queue = 配送待ち荷物置き場
- 📦 Message = お客様への荷物
- 🚚 Consumer = 配達員ドライバー
- 🏪 DLQ = 不達荷物保管センター
⚠️ 配達問題の例
- 🏠 住所不明 - 引っ越し済み
- 😴 不在 - 受取人がいない
- 🚫 受け取り拒否 - 注文キャンセル
- 🔧 システムエラー - 配達員の機械故障
Dead Letter Queue(不達荷物センター)とRedrive Policy(再配達ルール)を宅配便システムで完全理解!
AWS SQS = 宅配便の配送システム
配送失敗時の荷物がどのように移動するかを見てみよう!
配達員がメインキューから荷物を受け取ります。この時点で荷物は「配達中」状態になり、他の配達員からは見えなくなります。
何回まで再配達を試みるかのルール設定
# maxReceiveCount = 3
{
"deadLetterTargetArn": "arn:aws:sqs:us-east-1:123456789012:my-dlq",
"maxReceiveCount": 3
}
実際に配達を試して、DLQ移動プロセスを体験しよう!
実際のAWS環境での設定方法とコード例
aws sqs create-queue \
--queue-name my-app-dlq \
--attributes '{
"MessageRetentionPeriod": "1209600"
}'
aws sqs create-queue \
--queue-name my-app-queue \
--attributes '{
"RedrivePolicy": "{
\"deadLetterTargetArn\": \"arn:aws:sqs:us-east-1:123456789012:my-app-dlq\",
\"maxReceiveCount\": 3
}",
"VisibilityTimeoutSeconds": "30"
}'
Resources:
MyAppDLQ:
Type: AWS::SQS::Queue
Properties:
QueueName: my-app-dlq
MessageRetentionPeriod: 1209600
MyAppQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: my-app-queue
VisibilityTimeoutSeconds: 30
RedrivePolicy:
deadLetterTargetArn: !GetAtt MyAppDLQ.Arn
maxReceiveCount: 3
# アラーム設定
DLQAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: DLQ-Messages-Alert
MetricName: ApproximateNumberOfMessages
Namespace: AWS/SQS
Statistic: Sum
Period: 300
EvaluationPeriods: 1
Threshold: 1
ComparisonOperator: GreaterThanOrEqualToThreshold
Dimensions:
- Name: QueueName
Value: !GetAtt MyAppDLQ.QueueName
import boto3
import json
from botocore.exceptions import ClientError
class SQSDeliveryService:
def __init__(self):
self.sqs = boto3.client('sqs')
self.queue_url = 'https://sqs.us-east-1.amazonaws.com/123456789012/my-app-queue'
self.dlq_url = 'https://sqs.us-east-1.amazonaws.com/123456789012/my-app-dlq'
def process_messages(self):
"""メッセージ処理(配達員の仕事)"""
try:
# メッセージ受信(荷物取得)
response = self.sqs.receive_message(
QueueUrl=self.queue_url,
MaxNumberOfMessages=1,
WaitTimeSeconds=20,
MessageAttributeNames=['All']
)
if 'Messages' in response:
message = response['Messages'][0]
receipt_handle = message['ReceiptHandle']
# 配達処理を実行
delivery_success = self.deliver_package(message)
if delivery_success:
# 配達成功 → メッセージ削除
self.sqs.delete_message(
QueueUrl=self.queue_url,
ReceiptHandle=receipt_handle
)
print("✅ 配達成功!メッセージを削除しました")
else:
# 配達失敗 → SQSが自動的にreceiveCountを増加
# maxReceiveCountに達するとDLQに自動移動
print("❌ 配達失敗。再配達キューに戻ります")
except ClientError as e:
print(f"🚨 エラー: {e}")
def deliver_package(self, message):
"""実際の配達処理(ビジネスロジック)"""
try:
# ここで実際の配達処理を実行
# 例:APIコール、データベース更新、外部サービス連携等
package_data = json.loads(message['Body'])
# 配達シミュレーション
if self.simulate_delivery(package_data):
return True
else:
return False
except Exception as e:
print(f"配達中にエラー: {e}")
return False
def monitor_dlq(self):
"""DLQ監視(不達荷物のチェック)"""
response = self.sqs.get_queue_attributes(
QueueUrl=self.dlq_url,
AttributeNames=['ApproximateNumberOfMessages']
)
message_count = int(response['Attributes']['ApproximateNumberOfMessages'])
if message_count > 0:
print(f"⚠️ DLQに{message_count}個の不達荷物があります")
# アラート送信やログ出力などの処理
def simulate_delivery(self, package_data):
"""配達成功/失敗のシミュレーション"""
import random
# 80%の確率で配達成功
return random.random() < 0.8
# 使用例
if __name__ == "__main__":
service = SQSDeliveryService()
# メッセージ処理開始
while True:
service.process_messages()
service.monitor_dlq()
time.sleep(5)
適切な設定値とその影響を理解しよう
Created by SSuzuki1063
AWS SAP Learning Resources
Created by SSuzuki1063
AWS SAP Learning Resources