การใช้ SQS, SNS สำหรับ Event-driven application

Sharing is caring!

บทนำ

ในโลกของแอปพลิเคชันยุคใหม่ การประมวลผลแบบ Event-driven กลายเป็นสถาปัตยกรรมที่นิยมมากที่สุด โดยเฉพาะในระบบ Microservices และ Serverless ซึ่งช่วยให้ระบบแยกกันทำงานได้อย่างอิสระ ผ่านการส่ง “ข้อความ (Event)” ระหว่างกัน และบน AWS เรามีสองบริการสำคัญที่รองรับรูปแบบนี้คือ SQS (Simple Queue Service) และ SNS (Simple Notification Service)

Event-driven คืออะไร?

Event-driven หมายถึงการที่ระบบทำงาน “ตอบสนองต่อเหตุการณ์” เช่น เมื่อผู้ใช้กดปุ่ม “สั่งซื้อสินค้า” ระบบจะสร้าง Event ขึ้นมา แล้วส่ง Event นั้นเข้าสู่คิวเพื่อให้ส่วนอื่น ๆ ของระบบทำงานต่อ

  • Event ถูกส่งโดย Producer
  • Event ถูกเก็บไว้ชั่วคราวใน Queue (SQS) หรือ Broadcast ผ่าน SNS Topic
  • Event ถูกบริโภค (Consume) โดย Consumer เช่น Lambda หรือ Service อื่น

รู้จัก AWS SQS (Simple Queue Service)

AWS SQS เป็นบริการ Message Queue ที่ช่วยให้ระบบสื่อสารกันแบบ Asynchronous โดยที่ไม่ต้องรอให้กระบวนการหนึ่งเสร็จก่อนอีกกระบวนการจึงเริ่ม — เหมาะกับงานที่ต้องการความทนทาน (Reliability) เช่น การประมวลผลข้อมูลขนาดใหญ่ หรือการสื่อสารระหว่าง Microservices

คุณสมบัติหลักของ SQS

  • รองรับข้อความขนาดสูงสุด 256KB
  • รองรับการทำงานแบบ FIFO (First-In, First-Out)
  • มี Dead Letter Queue (DLQ) สำหรับเก็บข้อความที่ประมวลผลไม่สำเร็จ
  • สามารถ Trigger Lambda ได้อัตโนมัติ

รู้จัก AWS SNS (Simple Notification Service)

AWS SNS เป็นบริการ Pub/Sub (Publish–Subscribe) ที่ช่วยให้คุณส่งข้อความหนึ่งครั้งไปยังหลายระบบได้พร้อมกัน เช่น Lambda, SQS, Email หรือ HTTPS Endpoint SNS เหมาะกับการกระจายข้อมูล (fan-out pattern)

ตัวอย่างการใช้งาน SNS

  • ระบบแจ้งเตือนเมื่อมี Event ใหม่เกิดขึ้น (เช่น มีคำสั่งซื้อ)
  • กระจายข้อมูลไปยังหลายระบบพร้อมกัน เช่น Billing, Notification, Analytics

เปรียบเทียบ SQS vs SNS

หัวข้อAWS SQSAWS SNS
รูปแบบQueue (Point-to-Point)Pub/Sub (Broadcast)
การส่งข้อความส่งถึง Consumer เดียวส่งให้หลาย Subscriber
ตัวอย่างการใช้งานBackground Processing, Worker QueueSystem Notification, Multi-Service Trigger

โครงสร้างการเชื่อมต่อ SQS + SNS

เราสามารถใช้ SNS เพื่อกระจาย Event ไปยังหลาย Queue (SQS) เพื่อให้แต่ละระบบทำงานของตนเองได้

ตัวอย่างโค้ดเชื่อมต่อ SQS (Python)

import boto3
import json

sqs = boto3.client('sqs')
queue_url = 'https://sqs.ap-southeast-1.amazonaws.com/1234567890/myqueue'

# ส่งข้อความ
sqs.send_message(
    QueueUrl=queue_url,
    MessageBody=json.dumps({'event': 'order_created', 'orderId': 'ORD001'})
)

# อ่านข้อความ
messages = sqs.receive_message(QueueUrl=queue_url, MaxNumberOfMessages=1)
for msg in messages.get('Messages', []):
    print(json.loads(msg['Body']))
    sqs.delete_message(QueueUrl=queue_url, ReceiptHandle=msg['ReceiptHandle'])
    

ตัวอย่างโค้ดส่งข้อความผ่าน SNS

import boto3

sns = boto3.client('sns')
topic_arn = 'arn:aws:sns:ap-southeast-1:1234567890:MyTopic'

sns.publish(
    TopicArn=topic_arn,
    Message='New order received: ORD001',
    Subject='Order Notification'
)
    

การเชื่อมต่อกับ Lambda (Event Source)

คุณสามารถตั้งค่าให้ Lambda ฟัง Event จาก SQS หรือ SNS ได้โดยตรง เช่น เมื่อมีข้อความใหม่ใน Queue → Lambda จะทำงานทันทีโดยอัตโนมัติ

ข้อดีของ Event-driven Architecture

  • 🔹 ระบบแยกอิสระ (Loose Coupling)
  • 🔹 รองรับการขยายขนาด (Scalability)
  • 🔹 เพิ่มความยืดหยุ่นและความทนทาน (Resilience)
  • 🔹 ลดภาระของ Backend ให้ทำงานแบบ Async

สรุป

การใช้ SQS และ SNS เป็นหัวใจของระบบ Event-driven application ช่วยให้ระบบสามารถสื่อสารกันได้อย่างมีประสิทธิภาพ โดยไม่ต้องพึ่งการรอผลแบบ synchronous และเมื่อผสานกับ Lambda คุณจะได้ระบบแบบ Serverless ที่ขยายได้อัตโนมัติ

หากคุณกำลังเริ่มพัฒนาแอปแบบ Microservices หรือ Serverless — ขอแนะนำให้ลองออกแบบระบบของคุณด้วยแนวคิด Event-driven ผ่าน AWS SQS และ SNS ดูครับ

📘 บทความโดย King Pool

ภาพประกอบ: SQS + SNS Architecture, Event Flow Diagram, Lambda Integration

อ่านต่อ: การสร้าง REST API ด้วย Lambda + API Gateway + DynamoDB

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *