ในโลกของการพัฒนาและออกแบบระบบคอมพิวเตอร์ที่ต้องการความมั่นคงและเสถียรภาพ การจัดการกับข้อความที่ไม่สามารถดำเนินการได้ (Undeliverable Messages) ถือเป็นเรื่องสำคัญ เพื่อให้มั่นใจได้ว่าระบบจะทำงานต่อไปได้อย่างราบรื่น โดยแนวคิดหนึ่งที่ใช้ในระบบ Message Queue เพื่อจัดการกับข้อความเหล่านี้คือ "Dead Letter Queue" หรือที่เรียกกันย่อๆ ว่า DLQ
Dead Letter Queue (DLQ) คืออะไร?
เป็นคิวพิเศษที่ใช้ในการเก็บข้อความที่ไม่สามารถดำเนินการได้ตามข้อกำหนด ไม่ว่าจะเป็นข้อผิดพลาดในกระบวนการประมวลผล, ข้อความที่มีข้อมูลไม่ครบถ้วน, หรือการหมดเวลาของข้อความในคิวปกติ
โดยข้อความที่ถูกย้ายมาที่ DLQ จะถูกจัดเก็บไว้เพื่อให้สามารถดำเนินการได้ภายหลังหรือทำการตรวจสอบเพื่อหาสาเหตุของปัญหา
ทำไมต้องใช้ Dead Letter Queue ละ?
หลักแบ่งออกเป็น 3 ข้อ คือ
1. การจัดการข้อผิดพลาดอย่างมีประสิทธิภาพ: โดยการย้ายข้อความที่เกิดปัญหาไปยัง DLQ สามารถช่วยให้ระบบหลักสามารถดำเนินการต่อไปได้โดยไม่ถูกรบกวน
2. การตรวจสอบและวิเคราะห์ข้อผิดพลาด: ข้อความใน DLQ สามารถตรวจสอบย้อนหลังเพื่อวิเคราะห์สาเหตุที่ทำให้เกิดปัญหาได้ ซึ่งจะเป็นประโยชน์ในการปรับปรุงระบบ
3. การเพิ่มความยืดหยุ่นในการพัฒนา: ด้วยการแยกข้อความที่มีปัญหาออกจากคิวปกติ นักพัฒนาสามารถโฟกัสไปที่การพัฒนาฟีเจอร์ใหม่ๆ ได้โดยไม่ต้องกังวลว่าข้อความที่มีปัญหาจะกระทบต่อกระบวนการที่สำคัญ
ตัวอย่างการใช้งาน Dead Letter Queue
การใช้งาน DLQ จะขึ้นอยู่กับ Message Broker ที่เราใช้งาน เช่น RabbitMQ หรือ AWS SQS โดยจะมีวิธีการตั้งค่าให้คิวปกติสามารถย้ายข้อความที่ประสบปัญหาไปยัง DLQ ได้เมื่อเงื่อนไขที่กำหนดเกิดขึ้น
ตัวอย่างการใช้งาน DLQ ใน AWS SQS
ใน AWS SQS เราสามารถกำหนด DLQ ได้โดยระบุคิวหลัก (Source Queue) และ DLQ ในขณะที่สร้างหรือแก้ไขคิว โดยมีขั้นตอนดังนี้
1. สร้างคิวสำหรับเก็บข้อความที่เกิดปัญหา (DLQ): ทำสัญญาณปกติสำหรับคิวที่สร้างใหม่
2. กำหนด MaximumReceiveCount: ซึ่งเป็นจำนวนครั้งที่ข้อความหนึ่งๆ สามารถถูกดึงขึ้นมาก่อนที่จะถูกย้ายไปยัง DLQ
3. ผูก DLQ กับคิวหลัก: กำหนดให้ DLQ เป็นคิวสำรองสำหรับคิวหลัก เมื่อข้อความถูกดึงขึ้นมาครบตาม MaximumReceiveCount จะถูกย้ายไปยัง DLQ
import boto3
# Create SQS client
sqs = boto3.client('sqs')
# Create DLQ
response = sqs.create_queue(
QueueName='DLQ'
)
dlq_url = response['QueueUrl']
# Create Primary Queue with DLQ redrive policy
response = sqs.create_queue(
QueueName='PrimaryQueue',
Attributes={
'RedrivePolicy': '{"maxReceiveCount":"5", "deadLetterTargetArn":"arn:aws:sqs:REGION:ACCOUNT_ID:DLQ"}'
}
)
primary_queue_url = response['QueueUrl']ในโค้ดตัวอย่างข้างต้น เราได้สร้างคิว DLQ และ คิวหลัก (PrimaryQueue) โดยเชื่อมโยง DLQ เข้ากับคิวหลักผ่าน Redrive Policy ที่กำหนดให้ข้อความจะถูกย้ายไป DLQ เมื่อถูกดึงขึ้นมาครบ 5 ครั้งแล้วไม่สามารถประมวลผลได้
ข้อพิจารณาในการใช้งาน DLQ
- ระยะเวลาในการเก็บข้อความ: ข้อความที่อยู่ใน DLQ อาจมีข้อกำหนด เรื่องระยะเวลาการจัดเก็บก่อนที่จะถูกลบตามนโยบายที่กำหนดไว้
- การจัดการข้อความใน DLQ: อาจต้องพิจารณาการทำงานอัตโนมัติในการตรวจสอบหรือประมวลผลข้อความที่อยู่ใน DLQ หากต้องการลดภาระงานของผู้ดูแลระบบ